libsmb: Use posix result in SMBC_readdirplus2_ctx
authorVolker Lendecke <vl@samba.org>
Fri, 28 Feb 2020 10:15:58 +0000 (11:15 +0100)
committerJeremy Allison <jra@samba.org>
Tue, 3 Mar 2020 17:48:37 +0000 (17:48 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
selftest/knownfail.d/libsmbclient
source3/include/libsmb_internal.h
source3/libsmb/libsmb_dir.c

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3f1ba03f3bf00c462f9857a564dc5a7842eb0831 100644 (file)
@@ -0,0 +1 @@
+samba4.unix_ext.libsmbclient.readdirplus2.NT1.readdirplus2.*
index 27eaeb5fd89ad20e1075297f24100b6103aa7967..78c2cb555e0422e84d200cb41b0a9be08e994043 100644 (file)
@@ -98,6 +98,7 @@ struct smbc_dir_list {
 struct smbc_dirplus_list {
        struct smbc_dirplus_list *next;
        struct libsmb_file_info *smb_finfo;
+       SMB_STRUCT_STAT *posix_sbuf;
        uint64_t ino;
 };
 
index eaae38664cfb79f07c228b3cad21d5f8a07ef172..801d556f53bae3d54f80c5b8d839a18cc2d30de4 100644 (file)
@@ -49,6 +49,7 @@ static void remove_dirplus(SMBCFILE *dir)
                struct smbc_dirplus_list *f = d;
                d = d->next;
 
+               SAFE_FREE(f->posix_sbuf);
                SAFE_FREE(f->smb_finfo->short_name);
                SAFE_FREE(f->smb_finfo->name);
                SAFE_FREE(f->smb_finfo);
@@ -212,6 +213,20 @@ static int add_dirplus(SMBCFILE *dir, struct file_info *finfo)
        }
        new_entry->smb_finfo = info;
 
+       if (finfo->posix_sbuf.st_ex_nlink != 0) {
+               new_entry->posix_sbuf = SMB_MALLOC_P(SMB_STRUCT_STAT);
+               if (new_entry->posix_sbuf == NULL) {
+                       SAFE_FREE(info->short_name);
+                       SAFE_FREE(info->name);
+                       SAFE_FREE(info);
+                       SAFE_FREE(new_entry);
+                       dir->dir_error = ENOMEM;
+                       return -1;
+               }
+               *new_entry->posix_sbuf = finfo->posix_sbuf;
+               new_entry->posix_sbuf->st_ex_dev = dir->srv->dev;
+       }
+
        /* Now add to the list. */
        if (dir->dirplus_list == NULL) {
                /* Empty list - point everything at new_entry. */
@@ -1360,15 +1375,20 @@ const struct libsmb_file_info *SMBC_readdirplus2_ctx(SMBCCTX *context,
                return NULL;
        }
 
-       setup_stat(st,
-               path,
-               smb_finfo->size,
-               smb_finfo->attrs,
-               ino,
-               dir->srv->dev,
-               smb_finfo->atime_ts,
-               smb_finfo->ctime_ts,
-               smb_finfo->mtime_ts);
+       if (dp_list->posix_sbuf != NULL) {
+               setup_stat_from_stat_ex(dp_list->posix_sbuf, path, st);
+       } else {
+               setup_stat(
+                       st,
+                       path,
+                       smb_finfo->size,
+                       smb_finfo->attrs,
+                       ino,
+                       dir->srv->dev,
+                       smb_finfo->atime_ts,
+                       smb_finfo->ctime_ts,
+                       smb_finfo->mtime_ts);
+       }
 
        TALLOC_FREE(full_pathname);