The branch, master has been updated
       via  56c6f0b6d64 selftest: Only run samba.tests.smb3unix in developer 
mode
       via  e6f0e4d5328 python:tests: Avoid exceptions in cleanup code if a 
test fails in smb3unix.py
       via  ac0e844ea87 param: Use a higher time resolution for 
lp_file_list_changed()
       via  9440cb7322d lib:param: Remove trailing whitespaces from loadparm.c
       via  fcf05b1d233 lib:util: Print data in ISO 8601 format
       via  55a49527d61 lib:util: Remove trailing whitespaces from time.c
      from  f7b50bc059d smbd: Use smbXsrv_open_global_parse_record() in 
.._verify_record()

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 56c6f0b6d64d29a34659c9af2e4f6ee397b3e0ca
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jan 25 10:46:03 2023 +0100

    selftest: Only run samba.tests.smb3unix in developer mode
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    
    Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date(master): Thu Jan 26 13:13:50 UTC 2023 on atb-devel-224

commit e6f0e4d53285177f7a60559394efeb5a78b6bd53
Author: Andreas Schneider <a...@samba.org>
Date:   Tue Jan 24 09:18:46 2023 +0100

    python:tests: Avoid exceptions in cleanup code if a test fails in 
smb3unix.py
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit ac0e844ea87be7974ba6ff81745b3b0cfeecaa57
Author: Andreas Schneider <a...@samba.org>
Date:   Tue Jan 24 21:44:34 2023 +0100

    param: Use a higher time resolution for lp_file_list_changed()
    
    It is possible that in our test environment one of the config 'include' 
files
    change more than once per second. To avoid missing a file update we use a
    higher time resolution than seconds.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 9440cb7322d35097d63455c3fe801e62cb29396c
Author: Andreas Schneider <a...@samba.org>
Date:   Tue Jan 24 21:43:09 2023 +0100

    lib:param: Remove trailing whitespaces from loadparm.c
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit fcf05b1d233aa90f6043730c17e94886b0a50be8
Author: Andreas Schneider <a...@samba.org>
Date:   Tue Jan 24 22:31:17 2023 +0100

    lib:util: Print data in ISO 8601 format
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 55a49527d61bc8ddae88178936b4e8fbba6a163c
Author: Andreas Schneider <a...@samba.org>
Date:   Tue Jan 24 22:31:00 2023 +0100

    lib:util: Remove trailing whitespaces from time.c
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/param/loadparm.c           | 28 ++++++++++++++++------------
 lib/param/loadparm.h           |  2 +-
 lib/util/time.c                | 42 +++++++++++++++++++++---------------------
 python/samba/tests/smb3unix.py | 12 +++++++-----
 source3/param/loadparm.c       | 38 ++++++++++++++++++++++++++++++--------
 source3/selftest/tests.py      |  5 ++++-
 source3/wscript                |  1 +
 7 files changed, 80 insertions(+), 48 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index fc0dc4df83f..c1d1f5393d1 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -1,4 +1,4 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    Parameter loading functions
    Copyright (C) Karl Auer 1993-1998
@@ -1009,6 +1009,8 @@ void add_to_file_list(TALLOC_CTX *mem_ctx, struct 
file_lists **list,
                             const char *fname, const char *subfname)
 {
        struct file_lists *f = *list;
+       struct stat sb = {0};
+       int rc;
 
        while (f) {
                if (f->name && !strcmp(f->name, fname))
@@ -1017,7 +1019,7 @@ void add_to_file_list(TALLOC_CTX *mem_ctx, struct 
file_lists **list,
        }
 
        if (!f) {
-               f = talloc(mem_ctx, struct file_lists);
+               f = talloc_zero(mem_ctx, struct file_lists);
                if (!f)
                        goto fail;
                f->next = *list;
@@ -1032,12 +1034,14 @@ void add_to_file_list(TALLOC_CTX *mem_ctx, struct 
file_lists **list,
                        goto fail;
                }
                *list = f;
-               f->modtime = file_modtime(subfname);
-       } else {
-               time_t t = file_modtime(subfname);
-               if (t)
-                       f->modtime = t;
        }
+
+       rc = stat(subfname, &sb);
+       if (rc != 0) {
+               return;
+       }
+       f->modtime = get_mtimespec(&sb);
+
        return;
 
 fail:
@@ -2146,7 +2150,7 @@ void lpcfg_print_parameter(struct parm_struct *p, void 
*ptr, FILE * f)
                        break;
 
                case P_OCTAL: {
-                       int val = *(int *)ptr; 
+                       int val = *(int *)ptr;
                        if (val == -1) {
                                fprintf(f, "-1");
                        } else {
@@ -3199,7 +3203,7 @@ struct loadparm_context *loadparm_init_global(bool 
load_default)
 /**
  * Initialise the global parameter structure.
  */
-struct loadparm_context *loadparm_init_s3(TALLOC_CTX *mem_ctx, 
+struct loadparm_context *loadparm_init_s3(TALLOC_CTX *mem_ctx,
                                          const struct loadparm_s3_helpers 
*s3_fns)
 {
        struct loadparm_context *loadparm_context = talloc_zero(mem_ctx, struct 
loadparm_context);
@@ -3227,7 +3231,7 @@ const char *lp_default_path(void)
 }
 
 /**
- * Update the internal state of a loadparm context after settings 
+ * Update the internal state of a loadparm context after settings
  * have changed.
  */
 static bool lpcfg_update(struct loadparm_context *lp_ctx)
@@ -3273,7 +3277,7 @@ static bool lpcfg_update(struct loadparm_context *lp_ctx)
                           lp_ctx->globals->syslog,
                           lp_ctx->globals->syslog_only);
 
-       /* FIXME: This is a bit of a hack, but we can't use a global, since 
+       /* FIXME: This is a bit of a hack, but we can't use a global, since
         * not everything that uses lp also uses the socket library */
        if (lpcfg_parm_bool(lp_ctx, NULL, "socket", "testnonblock", false)) {
                setenv("SOCKET_TESTNONBLOCK", "1", 1);
@@ -3305,7 +3309,7 @@ bool lpcfg_load_default(struct loadparm_context *lp_ctx)
     path = lp_default_path();
 
     if (!file_exist(path)) {
-           /* We allow the default smb.conf file to not exist, 
+           /* We allow the default smb.conf file to not exist,
             * basically the equivalent of an empty file. */
            return lpcfg_update(lp_ctx);
     }
diff --git a/lib/param/loadparm.h b/lib/param/loadparm.h
index 98263f0e62b..af6b530366a 100644
--- a/lib/param/loadparm.h
+++ b/lib/param/loadparm.h
@@ -102,7 +102,7 @@ struct file_lists {
        struct file_lists *next;
        char *name;
        char *subfname;
-       time_t modtime;
+       struct timespec modtime;
 };
 
 #define DEFAULT_NAME_RESOLVE_ORDER "lmhosts wins host bcast"
diff --git a/lib/util/time.c b/lib/util/time.c
index f1d6b566618..773fd611a33 100644
--- a/lib/util/time.c
+++ b/lib/util/time.c
@@ -1,9 +1,9 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    time handling functions
 
    Copyright (C) Andrew Tridgell               1992-2004
-   Copyright (C) Stefan (metze) Metzmacher     2002   
+   Copyright (C) Stefan (metze) Metzmacher     2002
    Copyright (C) Jeremy Allison                        2007
    Copyright (C) Andrew Bartlett                2011
 
@@ -11,12 +11,12 @@
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -137,12 +137,12 @@ This takes GMT as input
 **/
 _PUBLIC_ void unix_to_nt_time(NTTIME *nt, time_t t)
 {
-       uint64_t t2; 
+       uint64_t t2;
 
        if (t == (time_t)-1) {
                *nt = (NTTIME)-1LL;
                return;
-       }       
+       }
 
        if (t == TIME_T_MAX || t == INT64_MAX) {
                *nt = 0x7fffffffffffffffLL;
@@ -152,7 +152,7 @@ _PUBLIC_ void unix_to_nt_time(NTTIME *nt, time_t t)
        if (t == 0) {
                *nt = 0;
                return;
-       }               
+       }
 
        t2 = t;
        t2 += TIME_FIXUP_CONSTANT_INT;
@@ -167,8 +167,8 @@ check if it's a null unix time
 **/
 _PUBLIC_ bool null_time(time_t t)
 {
-       return t == 0 || 
-               t == (time_t)0xFFFFFFFF || 
+       return t == 0 ||
+               t == (time_t)0xFFFFFFFF ||
                t == (time_t)-1;
 }
 
@@ -271,7 +271,7 @@ void interpret_dos_date(uint32_t date,int *year,int 
*month,int *day,int *hour,in
 {
        uint32_t p0,p1,p2,p3;
 
-       p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF; 
+       p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF;
        p2=((date&0xFF0000)>>16)&0xFF; p3=((date&0xFF000000)>>24)&0xFF;
 
        *second = 2*(p0 & 0x1F);
@@ -295,11 +295,11 @@ _PUBLIC_ time_t pull_dos_date(const uint8_t *date_ptr, 
int zone_offset)
        dos_date = IVAL(date_ptr,0);
 
        if (dos_date == 0) return (time_t)0;
-  
+
        interpret_dos_date(dos_date,&t.tm_year,&t.tm_mon,
                           &t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec);
        t.tm_isdst = -1;
-  
+
        ret = timegm(&t);
 
        ret += zone_offset;
@@ -397,7 +397,7 @@ const char *timespec_string_buf(const struct timespec *tp,
                }
        } else if (!hires) {
                len = snprintf(buf->buf, sizeof(buf->buf),
-                              "%04d/%02d/%02d %02d:%02d:%02d",
+                              "%04d-%02d-%02d %02d:%02d:%02d",
                               1900 + tm->tm_year,
                               tm->tm_mon + 1,
                               tm->tm_mday,
@@ -406,7 +406,7 @@ const char *timespec_string_buf(const struct timespec *tp,
                               tm->tm_sec);
        } else {
                len = snprintf(buf->buf, sizeof(buf->buf),
-                              "%04d/%02d/%02d %02d:%02d:%02d.%09ld",
+                              "%04d-%02d-%02d %02d:%02d:%02d.%09ld",
                               1900 + tm->tm_year,
                               tm->tm_mon + 1,
                               tm->tm_mday,
@@ -693,7 +693,7 @@ _PUBLIC_ struct timeval timeval_current_ofs_usec(uint32_t 
usecs)
 }
 
 /**
-  compare two timeval structures. 
+  compare two timeval structures.
   Return -1 if tv1 < tv2
   Return 0 if tv1 == tv2
   Return 1 if tv1 > tv2
@@ -723,7 +723,7 @@ _PUBLIC_ bool timeval_expired(const struct timeval *tv)
 */
 _PUBLIC_ double timeval_elapsed2(const struct timeval *tv1, const struct 
timeval *tv2)
 {
-       return (tv2->tv_sec - tv1->tv_sec) + 
+       return (tv2->tv_sec - tv1->tv_sec) +
               (tv2->tv_usec - tv1->tv_usec)*1.0e-6;
 }
 
@@ -806,7 +806,7 @@ _PUBLIC_ struct timeval timeval_until(const struct timeval 
*tv1,
 */
 _PUBLIC_ NTTIME timeval_to_nttime(const struct timeval *tv)
 {
-       return 10*(tv->tv_usec + 
+       return 10*(tv->tv_usec +
                  ((TIME_FIXUP_CONSTANT + (uint64_t)tv->tv_sec) * 1000000));
 }
 
@@ -828,7 +828,7 @@ _PUBLIC_ void nttime_to_timeval(struct timeval *tv, NTTIME 
t)
                tv->tv_usec = 0;
                return;
        }
-       
+
        tv->tv_usec = t - tv->tv_sec*1000000;
 }
 
@@ -938,8 +938,8 @@ bool nt_time_equal(NTTIME *t1, NTTIME *t2)
 
 bool null_timespec(struct timespec ts)
 {
-       return ts.tv_sec == 0 || 
-               ts.tv_sec == (time_t)0xFFFFFFFF || 
+       return ts.tv_sec == 0 ||
+               ts.tv_sec == (time_t)0xFFFFFFFF ||
                ts.tv_sec == (time_t)-1;
 }
 
@@ -992,7 +992,7 @@ struct timespec timespec_min(const struct timespec *ts1,
 }
 
 /****************************************************************************
-  compare two timespec structures. 
+  compare two timespec structures.
   Return -1 if ts1 < ts2
   Return 0 if ts1 == ts2
   Return 1 if ts1 > ts2
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index 3ad49af09fa..d8f9b7d5c33 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -189,8 +189,9 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                              'SMB2_FIND_POSIX_INFORMATION failed to list 
contents')
 
         finally:
-            for fname in test_files:
-                self.delete_test_file(c, fname)
+            if len(test_files) > 0:
+                for fname in test_files:
+                    self.delete_test_file(c, fname)
 
             self.disable_smb3unix()
 
@@ -283,6 +284,7 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
             self.disable_smb3unix()
 
     def test_posix_perm_files(self):
+        test_files = {}
         try:
             self.enable_smb3unix()
 
@@ -294,7 +296,6 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                 posix=True)
             self.assertTrue(c.have_posix())
 
-            test_files = {}
             for perm in range(0o600, 0o7777+1):
                 # Owner write permission is required or cleanup will fail, and
                 # owner read is required to list the file if O_PATH is disabled
@@ -332,8 +333,9 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                                          (test_files[fname], 
found_files[fname]))
 
         finally:
-            for fname in test_files.keys():
-                self.delete_test_file(c, '\\%s' % fname)
+            if len(test_files) > 0:
+                for fname in test_files.keys():
+                    self.delete_test_file(c, '\\%s' % fname)
 
             self.disable_smb3unix()
 
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 56a8bc2d28b..05a5ae20abe 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -79,6 +79,7 @@
 #include "auth/credentials/credentials.h"
 #include "source3/lib/substitute.h"
 #include "source3/librpc/gen_ndr/ads.h"
+#include "lib/util/time_basic.h"
 
 #ifdef HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
@@ -2408,8 +2409,15 @@ bool lp_file_list_changed(void)
                                return true;
                        }
                } else {
-                       time_t mod_time;
+                       struct timespec mod_time = {
+                               .tv_sec = 0,
+                       };
+                       struct timeval_buf tbuf = {
+                               .buf = {0},
+                       };
                        char *n2 = NULL;
+                       struct stat sb = {0};
+                       int rc;
 
                        n2 = talloc_sub_basic(talloc_tos(),
                                              get_current_username(),
@@ -2419,19 +2427,29 @@ bool lp_file_list_changed(void)
                                return false;
                        }
                        DEBUGADD(6, ("file %s -> %s  last mod_time: %s\n",
-                                    f->name, n2, ctime(&f->modtime)));
-
-                       mod_time = file_modtime(n2);
+                                    f->name, n2,
+                                    timespec_string_buf(&f->modtime,
+                                                        true,
+                                                        &tbuf)));
+
+                       rc = stat(n2, &sb);
+                       if (rc == 0) {
+                               mod_time = get_mtimespec(&sb);
+                       }
 
-                       if (mod_time &&
-                           ((f->modtime != mod_time) ||
+                       if (mod_time.tv_sec > 0 &&
+                           ((timespec_compare(&mod_time, &f->modtime) != 0) ||
                             (f->subfname == NULL) ||
                             (strcmp(n2, f->subfname) != 0)))
                        {
+                               f->modtime = mod_time;
+
                                DEBUGADD(6,
                                         ("file %s modified: %s\n", n2,
-                                         ctime(&mod_time)));
-                               f->modtime = mod_time;
+                                         timespec_string_buf(&f->modtime,
+                                                             true,
+                                                             &tbuf)));
+
                                TALLOC_FREE(f->subfname);
                                f->subfname = talloc_strdup(f, n2);
                                if (f->subfname == NULL) {
@@ -4831,6 +4849,10 @@ uint32_t lp_get_async_dns_timeout(void)
 
 bool lp_smb3_unix_extensions(void)
 {
+       /*
+        * FIXME: If this gets always enabled, check source3/selftest/tests.py
+        * and source3/wscript for HAVE_SMB3_UNIX_EXTENSIONS.
+        */
 #if defined(DEVELOPER)
        return lp__smb3_unix_extensions();
 #else
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 8039b4a8171..187f3ccd9c0 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -92,6 +92,8 @@ have_inotify = ("HAVE_INOTIFY" in config_hash)
 have_ldwrap = ("HAVE_LDWRAP" in config_hash)
 with_pthreadpool = ("WITH_PTHREADPOOL" in config_hash)
 
+have_smb3_unix_extensions = ("HAVE_SMB3_UNIX_EXTENSIONS" in config_hash)
+
 def is_module_enabled(module):
     if module in config_hash["STRING_SHARED_MODULES"]:
         return True
@@ -1706,7 +1708,8 @@ for t in CLUSTERED_LOCAL_TESTS:
          smbtorture3,
          "-N 1000 -o 2000"])
 
-planpythontestsuite("fileserver", "samba.tests.smb3unix")
+if have_smb3_unix_extensions:
+    planpythontestsuite("fileserver", "samba.tests.smb3unix")
 planpythontestsuite("fileserver", "samba.tests.reparsepoints")
 planpythontestsuite("fileserver_smb1", "samba.tests.smb2symlink")
 planpythontestsuite("fileserver_smb1", "samba.tests.smb1posix")
diff --git a/source3/wscript b/source3/wscript
index e77cd127e60..0dbf02ed530 100644
--- a/source3/wscript
+++ b/source3/wscript
@@ -111,6 +111,7 @@ def configure(conf):
     if Options.options.developer:
         conf.ADD_CFLAGS('-DDEVELOPER -DDEBUG_PASSWORD')
         conf.env.developer = True
+        conf.DEFINE('HAVE_SMB3_UNIX_EXTENSIONS', '1')
 
     if sys.platform != 'openbsd5':
         conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True)


-- 
Samba Shared Repository

Reply via email to