From: Volker Lendecke Date: Fri, 28 Feb 2020 10:15:58 +0000 (+0100) Subject: libsmb: Use posix result in SMBC_readdirplus2_ctx X-Git-Tag: ldb-2.2.0~1523 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2e012fe11c0f18650fa796a6f67aae838e1c791;p=thirdparty%2Fsamba.git libsmb: Use posix result in SMBC_readdirplus2_ctx Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/selftest/knownfail.d/libsmbclient b/selftest/knownfail.d/libsmbclient index e69de29bb2d..3f1ba03f3bf 100644 --- a/selftest/knownfail.d/libsmbclient +++ b/selftest/knownfail.d/libsmbclient @@ -0,0 +1 @@ +samba4.unix_ext.libsmbclient.readdirplus2.NT1.readdirplus2.* diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h index 27eaeb5fd89..78c2cb555e0 100644 --- a/source3/include/libsmb_internal.h +++ b/source3/include/libsmb_internal.h @@ -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; }; diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c index eaae38664cf..801d556f53b 100644 --- a/source3/libsmb/libsmb_dir.c +++ b/source3/libsmb/libsmb_dir.c @@ -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);