The branch, master has been updated via 5d8647376fb vfs: Fix whitespace in vfs_aixacl_util.c via 1a040c7f7ee smbd: Remove dptr_struct->expect_close via a49edcd0d26 smbd: Remove dptr_struct->spid via 5c19e6ca756 smbd: Simplify SeekDir() with an early return via a1d348fd5e1 smbd: Simplify struct dptr_struct via 8846b090079 lib: Fix a typo via 4bbf2b1127b lib: Simplify ms_has_wild() with strpbrk() via 6e856074b14 smbd: Use ISDOT() in dptr_create() from 54a8da86407 vfs_ceph: use fsp_get_pathref_fd in ceph fstatat and close vfs calls
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 5d8647376fbfe0ad3b479be3a4479f1c9d5ecd7b Author: Volker Lendecke <v...@samba.org> Date: Tue Feb 7 09:49:54 2023 +0100 vfs: Fix whitespace in vfs_aixacl_util.c Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Mon Feb 13 21:23:43 UTC 2023 on atb-devel-224 commit 1a040c7f7eebb4ed549cc59f0b7bab461bf6d06d Author: Volker Lendecke <v...@samba.org> Date: Mon Feb 6 21:40:38 2023 +0100 smbd: Remove dptr_struct->expect_close This was only set but never read Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a49edcd0d26058e41712e3d069bfe36a463b76dc Author: Volker Lendecke <v...@samba.org> Date: Mon Feb 6 21:36:51 2023 +0100 smbd: Remove dptr_struct->spid This was only set but never read Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5c19e6ca756fda9dd66fa2cd484e54d0e3e221f0 Author: Volker Lendecke <v...@samba.org> Date: Thu Feb 2 17:01:16 2023 +0100 smbd: Simplify SeekDir() with an early return Review with git show -w Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a1d348fd5e1b16ffc47e320d370a002dc9c9b8eb Author: Volker Lendecke <v...@samba.org> Date: Thu Feb 2 12:52:32 2023 +0100 smbd: Simplify struct dptr_struct We can access the file name via "dir_hnd" Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8846b0900794c717c6a9f72a743f600ae81f8406 Author: Volker Lendecke <v...@samba.org> Date: Thu Feb 2 12:28:56 2023 +0100 lib: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4bbf2b1127b93efe655360a185567de080faa943 Author: Volker Lendecke <v...@samba.org> Date: Thu Feb 2 12:25:05 2023 +0100 lib: Simplify ms_has_wild() with strpbrk() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6e856074b143ea595f3ab9e5184d21bec11b17ae Author: Volker Lendecke <v...@samba.org> Date: Thu Feb 2 12:19:46 2023 +0100 smbd: Use ISDOT() in dptr_create() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/lib/util.c | 17 +---- source3/modules/vfs_aixacl_util.c | 42 ++++++------- source3/smbd/dir.c | 120 +++++++++++++++++------------------- source3/smbd/proto.h | 2 - source3/smbd/smb1_reply.c | 2 - source3/smbd/smb1_trans2.c | 2 - source3/smbd/smb2_query_directory.c | 2 - 7 files changed, 79 insertions(+), 108 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/lib/util.c b/source3/lib/util.c index 83707b31e38..b010d035cdd 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1443,19 +1443,8 @@ bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent, bool ms_has_wild(const char *s) { - char c; - - while ((c = *s++)) { - switch (c) { - case '*': - case '?': - case '<': - case '>': - case '"': - return True; - } - } - return False; + const char *found = strpbrk(s, "*?<>\""); + return (found != NULL); } bool ms_has_wild_w(const smb_ucs2_t *s) @@ -1492,7 +1481,7 @@ bool mask_match(const char *string, const char *pattern, bool is_case_sensitive) /******************************************************************* A wrapper that handles case sensitivity and the special handling - of the ".." name. Varient that is only called by old search code which requires + of the ".." name. Variant that is only called by old search code which requires pattern translation. *******************************************************************/ diff --git a/source3/modules/vfs_aixacl_util.c b/source3/modules/vfs_aixacl_util.c index 1194d27df22..38b53eb3f53 100644 --- a/source3/modules/vfs_aixacl_util.c +++ b/source3/modules/vfs_aixacl_util.c @@ -26,20 +26,18 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) { struct acl_entry *acl_entry; struct ace_id *idp; - + struct smb_acl_t *result = sys_acl_init(mem_ctx); struct smb_acl_entry *ace; int i; - + if (result == NULL) { return NULL; } - + /* Point to the first acl entry in the acl */ acl_entry = file_acl->acl_ext; - - DEBUG(10,("acl_entry is %p\n",(void *)acl_entry)); DEBUG(10,("acl_last(file_acl) id %p\n",(void *)acl_last(file_acl))); @@ -62,20 +60,19 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) idp = acl_entry->ace_id; DEBUG(10,("idp->id_data is %d\n",idp->id_data[0])); - + result->acl = talloc_realloc(result, result->acl, struct smb_acl_entry, result->count+1); if (result == NULL) { DEBUG(0, ("talloc_realloc failed\n")); errno = ENOMEM; return NULL; } - DEBUG(10,("idp->id_type is %d\n",idp->id_type)); ace = &result->acl[result->count]; - + ace->a_type = idp->id_type; - + switch(ace->a_type) { case ACEID_USER: { ace->info.user.uid = idp->id_data[0]; @@ -83,7 +80,7 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) ace->a_type = SMB_ACL_USER; break; } - + case ACEID_GROUP: { ace->info.group.gid = idp->id_data[0]; DEBUG(10,("case ACEID_GROUP ace->info.group.gid is %d\n",ace->info.group.gid)); @@ -117,16 +114,16 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) TALLOC_FREE(result); return(0); } - + result->count++; ace->a_perm |= (ace->a_perm & S_IRUSR) ? SMB_ACL_READ : 0; ace->a_perm |= (ace->a_perm & S_IWUSR) ? SMB_ACL_WRITE : 0; ace->a_perm |= (ace->a_perm & S_IXUSR) ? SMB_ACL_EXECUTE : 0; DEBUG(10,("ace->a_perm is %d\n",ace->a_perm)); - + DEBUG(10,("acl_entry = %p\n",(void *)acl_entry)); DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type)); - + acl_entry = acl_nxt(acl_entry); } } /* end of if enabled */ @@ -146,13 +143,13 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno)); return NULL; } - + ace = &result->acl[result->count]; - + ace->info.user.uid = 0; ace->info.group.gid = 0; DEBUG(10,("ace->info.user.uid = %d\n",ace->info.user.uid)); - + switch(i) { case 2: ace->a_perm = file_acl->g_access << 6; @@ -163,12 +160,12 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) ace->a_perm = file_acl->o_access << 6; ace->a_type = SMB_ACL_OTHER; break; - + case 1: ace->a_perm = file_acl->u_access << 6; ace->a_type = SMB_ACL_USER_OBJ; break; - + default: return(NULL); @@ -176,17 +173,14 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx) ace->a_perm |= ((ace->a_perm & S_IRUSR) ? SMB_ACL_READ : 0); ace->a_perm |= ((ace->a_perm & S_IWUSR) ? SMB_ACL_WRITE : 0); ace->a_perm |= ((ace->a_perm & S_IXUSR) ? SMB_ACL_EXECUTE : 0); - + memcpy(&result->acl[result->count],ace,sizeof(struct smb_acl_entry)); result->count++; DEBUG(10,("ace->a_perm = %d\n",ace->a_perm)); DEBUG(10,("ace->a_type = %d\n",ace->a_type)); } - return result; - - } static ushort aixacl_smb_to_aixperm(SMB_ACL_PERM_T a_perm) @@ -211,7 +205,7 @@ struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl) unsigned int id_type; unsigned int acl_length; int i; - + DEBUG(10,("Entering aixacl_smb_to_aixacl\n")); /* AIX has no default ACL */ if(acltype == SMB_ACL_TYPE_DEFAULT) @@ -226,7 +220,7 @@ struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl) } memset(file_acl,0,BUFSIZ); - + file_acl->acl_len = ACL_SIZ; file_acl->acl_mode = S_IXACL; diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index eb263132adf..859c8f0dc83 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -67,13 +67,10 @@ struct smb_Dir { struct dptr_struct { struct dptr_struct *next, *prev; int dnum; - uint16_t spid; struct connection_struct *conn; struct smb_Dir *dir_hnd; - bool expect_close; char *wcard; uint32_t attr; - struct smb_filename *smb_dname; bool has_wild; /* Set to true if the wcard entry has MS wildcard characters in it. */ bool did_stat; /* Optimisation for non-wcard searches. */ bool priv; /* Directory handle opened with privilege. */ @@ -144,7 +141,7 @@ const char *dptr_path(struct smbd_server_connection *sconn, int key) { struct dptr_struct *dptr = dptr_get(sconn, key); if (dptr) - return(dptr->smb_dname->base_name); + return(dptr->dir_hnd->dir_smb_fname->base_name); return(NULL); } @@ -211,8 +208,6 @@ NTSTATUS dptr_create(connection_struct *conn, struct smb_request *req, files_struct *fsp, bool old_handle, - bool expect_close, - uint16_t spid, const char *wcard, uint32_t attr, struct dptr_struct **dptr_ret) @@ -251,24 +246,15 @@ NTSTATUS dptr_create(connection_struct *conn, return NT_STATUS_NO_MEMORY; } - dptr->smb_dname = cp_smb_filename(dptr, fsp->fsp_name); - if (dptr->smb_dname == NULL) { - TALLOC_FREE(dptr); - TALLOC_FREE(dir_hnd); - return NT_STATUS_NO_MEMORY; - } dptr->conn = conn; dptr->dir_hnd = dir_hnd; - dptr->spid = spid; - dptr->expect_close = expect_close; dptr->wcard = talloc_strdup(dptr, wcard); if (!dptr->wcard) { TALLOC_FREE(dptr); TALLOC_FREE(dir_hnd); return NT_STATUS_NO_MEMORY; } - if ((req != NULL && req->posix_pathnames) || - (wcard[0] == '.' && wcard[1] == 0)) { + if ((req != NULL && req->posix_pathnames) || ISDOT(wcard)) { dptr->has_wild = True; } else { dptr->has_wild = ms_has_wild(dptr->wcard); @@ -323,8 +309,8 @@ NTSTATUS dptr_create(connection_struct *conn, DLIST_ADD(sconn->searches.dirptrs, dptr); done: - DBG_INFO("creating new dirptr [%d] for path [%s], expect_close = %d\n", - dptr->dnum, fsp_str_dbg(fsp), expect_close); + DBG_INFO("creating new dirptr [%d] for path [%s]\n", + dptr->dnum, fsp_str_dbg(fsp)); *dptr_ret = dptr; @@ -460,7 +446,7 @@ static char *dptr_ReadDirName(TALLOC_CTX *ctx, pathreal = talloc_asprintf(ctx, "%s/%s", - dptr->smb_dname->base_name, + dptr->dir_hnd->dir_smb_fname->base_name, dptr->wcard); if (!pathreal) return NULL; @@ -469,7 +455,7 @@ static char *dptr_ReadDirName(TALLOC_CTX *ctx, smb_fname_base = (struct smb_filename) { .base_name = pathreal, .flags = dptr->dir_hnd->fsp->fsp_name->flags, - .twrp = dptr->smb_dname->twrp, + .twrp = dptr->dir_hnd->fsp->fsp_name->twrp, }; if (vfs_stat(dptr->conn, &smb_fname_base) == 0) { @@ -708,8 +694,10 @@ files_struct *dptr_fetch_fsp(struct smbd_server_connection *sconn, wire_offset = IVAL(buf,1); seekoff = map_wire_to_dir_offset(dptr, wire_offset); SeekDir(dptr->dir_hnd,seekoff); - DEBUG(3,("fetching dirptr %d for path %s at offset %d\n", - key, dptr->smb_dname->base_name, (int)seekoff)); + DBG_NOTICE("fetching dirptr %d for path %s at offset %ld\n", + key, + dptr->dir_hnd->dir_smb_fname->base_name, + seekoff); return dptr->dir_hnd->fsp; } @@ -730,8 +718,8 @@ files_struct *dptr_fetch_lanman2_fsp(struct smbd_server_connection *sconn, return NULL; } DBG_NOTICE("fetching dirptr %d for path %s\n", - dptr_num, - dptr->smb_dname->base_name); + dptr_num, + dptr->dir_hnd->dir_smb_fname->base_name); return dptr->dir_hnd->fsp; } @@ -775,7 +763,7 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, connection_struct *conn = dirptr->conn; size_t slashlen; size_t pathlen; - const char *dpath = dirptr->smb_dname->base_name; + const char *dpath = dirptr->dir_hnd->dir_smb_fname->base_name; bool dirptr_path_is_dot = ISDOT(dpath); NTSTATUS status; int ret; @@ -806,7 +794,8 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, dname = dptr_ReadDirName(ctx, dirptr, &cur_offset, &sbuf); DBG_DEBUG("dir [%s] dirptr [0x%lx] offset [%ld] => dname [%s]\n", - smb_fname_str_dbg(dirptr->smb_dname), (long)dirptr, + smb_fname_str_dbg(dirptr->dir_hnd->dir_smb_fname), + (long)dirptr, cur_offset, dname ? dname : "(finished)"); if (dname == NULL) { @@ -866,12 +855,13 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, } /* Create smb_fname with NULL stream_name. */ - smb_fname = synthetic_smb_fname(talloc_tos(), - pathreal, - NULL, - &sbuf, - dirptr->smb_dname->twrp, - dirptr->smb_dname->flags); + smb_fname = synthetic_smb_fname( + talloc_tos(), + pathreal, + NULL, + &sbuf, + dirptr->dir_hnd->dir_smb_fname->twrp, + dirptr->dir_hnd->dir_smb_fname->flags); TALLOC_FREE(pathreal); if (smb_fname == NULL) { TALLOC_FREE(dname); @@ -896,12 +886,13 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, } /* Create smb_fname with NULL stream_name. */ - atname = synthetic_smb_fname(talloc_tos(), - dname, - NULL, - &smb_fname->st, - dirptr->smb_dname->twrp, - dirptr->smb_dname->flags); + atname = synthetic_smb_fname( + talloc_tos(), + dname, + NULL, + &smb_fname->st, + dirptr->dir_hnd->dir_smb_fname->twrp, + dirptr->dir_hnd->dir_smb_fname->flags); if (atname == NULL) { TALLOC_FREE(dname); TALLOC_FREE(fname); @@ -1689,31 +1680,36 @@ void RewindDir(struct smb_Dir *dir_hnd, long *poffset) void SeekDir(struct smb_Dir *dirp, long offset) { - if (offset != dirp->offset) { - if (offset == START_OF_DIRECTORY_OFFSET) { - RewindDir(dirp, &offset); - /* - * Ok we should really set the file number here - * to 1 to enable ".." to be returned next. Trouble - * is I'm worried about callers using SeekDir(dirp,0) - * as equivalent to RewindDir(). So leave this alone - * for now. - */ - } else if (offset == DOT_DOT_DIRECTORY_OFFSET) { - RewindDir(dirp, &offset); - /* - * Set the file number to 2 - we want to get the first - * real file entry (the one we return after "..") - * on the next ReadDir. - */ - dirp->file_number = 2; - } else if (offset == END_OF_DIRECTORY_OFFSET) { - ; /* Don't seek in this case. */ - } else { - SMB_VFS_SEEKDIR(dirp->conn, dirp->dir, offset); - } - dirp->offset = offset; + if (offset == dirp->offset) { + /* + * Nothing to do + */ + return; + } + + if (offset == START_OF_DIRECTORY_OFFSET) { + RewindDir(dirp, &offset); + /* + * Ok we should really set the file number here + * to 1 to enable ".." to be returned next. Trouble + * is I'm worried about callers using SeekDir(dirp,0) + * as equivalent to RewindDir(). So leave this alone + * for now. + */ + } else if (offset == DOT_DOT_DIRECTORY_OFFSET) { + RewindDir(dirp, &offset); + /* + * Set the file number to 2 - we want to get the first + * real file entry (the one we return after "..") + * on the next ReadDir. + */ + dirp->file_number = 2; + } else if (offset == END_OF_DIRECTORY_OFFSET) { + ; /* Don't seek in this case. */ + } else { + SMB_VFS_SEEKDIR(dirp->conn, dirp->dir, offset); } + dirp->offset = offset; } /******************************************************************* diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 32e5c33896b..486d136bfbb 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -187,8 +187,6 @@ NTSTATUS dptr_create(connection_struct *conn, struct smb_request *req, files_struct *fsp, bool old_handle, - bool expect_close, - uint16_t spid, const char *wcard, uint32_t attr, struct dptr_struct **dptr_ret); diff --git a/source3/smbd/smb1_reply.c b/source3/smbd/smb1_reply.c index de6b4d99f79..1041e4f843b 100644 --- a/source3/smbd/smb1_reply.c +++ b/source3/smbd/smb1_reply.c @@ -1179,8 +1179,6 @@ void reply_search(struct smb_request *req) NULL, /* req */ fsp, /* fsp */ True, - expect_close, - req->smbpid, mask, dirtype, &fsp->dptr); diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c index 336024c9456..87c5ec697b5 100644 --- a/source3/smbd/smb1_trans2.c +++ b/source3/smbd/smb1_trans2.c @@ -1059,8 +1059,6 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd req, fsp, /* fsp */ False, - True, - req->smbpid, mask, dirtype, &fsp->dptr); diff --git a/source3/smbd/smb2_query_directory.c b/source3/smbd/smb2_query_directory.c index 2d58741738c..250b56633bb 100644 --- a/source3/smbd/smb2_query_directory.c +++ b/source3/smbd/smb2_query_directory.c @@ -426,8 +426,6 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx, NULL, /* req */ fsp, false, /* old_handle */ - false, /* expect_close */ - 0, /* spid */ state->in_file_name, /* wcard */ state->dirtype, &fsp->dptr); -- Samba Shared Repository