From: Volker Lendecke Date: Sat, 10 Jun 2023 13:29:35 +0000 (+0200) Subject: smbd: Remove the offset argument from ReadDirName() X-Git-Tag: talloc-2.4.1~416 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2fbe361bab52e906886e70cbaf689393d129285;p=thirdparty%2Fsamba.git smbd: Remove the offset argument from ReadDirName() Nobody does anything with this anymore, we just call ReadDirName() in sequence or do a RewindDir(). So we don't have to look at offsets as given by the file system anymore. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/modules/vfs_ceph_snapshots.c b/source3/modules/vfs_ceph_snapshots.c index c981cebd8a2..c09b1895f88 100644 --- a/source3/modules/vfs_ceph_snapshots.c +++ b/source3/modules/vfs_ceph_snapshots.c @@ -221,7 +221,6 @@ static int ceph_snap_enum_snapdir(struct vfs_handle_struct *handle, struct files_struct *dirfsp = NULL; const char *dname = NULL; char *talloced = NULL; - long offset = 0; NTSTATUS status; int ret; uint32_t slots; @@ -265,7 +264,7 @@ static int ceph_snap_enum_snapdir(struct vfs_handle_struct *handle, sc_data->num_volumes = 0; sc_data->labels = NULL; - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { if (ISDOT(dname) || ISDOTDOT(dname)) { @@ -518,7 +517,6 @@ static int ceph_snap_gmt_convert_dir(struct vfs_handle_struct *handle, struct files_struct *dirfsp = NULL; const char *dname = NULL; char *talloced = NULL; - long offset = 0; struct smb_filename *snaps_dname = NULL; const char *snapdir = lp_parm_const_string(SNUM(handle->conn), "ceph", "snapdir", @@ -589,7 +587,7 @@ static int ceph_snap_gmt_convert_dir(struct vfs_handle_struct *handle, goto err_out; } - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { struct smb_filename *smb_fname = NULL; diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index ce5ae38505e..8be6b4c7791 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -5188,7 +5188,6 @@ static bool fruit_get_num_bands(vfs_handle_struct *handle, struct smb_Dir *dir_hnd = NULL; const char *dname = NULL; char *talloced = NULL; - long offset = 0; size_t nbands; NTSTATUS status; @@ -5225,7 +5224,7 @@ static bool fruit_get_num_bands(vfs_handle_struct *handle, nbands = 0; - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { if (ISDOT(dname) || ISDOTDOT(dname)) { @@ -5336,7 +5335,6 @@ static uint64_t fruit_disk_free(vfs_handle_struct *handle, struct smb_Dir *dir_hnd = NULL; const char *dname = NULL; char *talloced = NULL; - long offset = 0; uint64_t dfree; uint64_t dsize; bool ok; @@ -5367,7 +5365,7 @@ static uint64_t fruit_disk_free(vfs_handle_struct *handle, return UINT64_MAX; } - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { ok = fruit_tmsize_do_dirent(handle, &state, dname); diff --git a/source3/modules/vfs_shadow_copy.c b/source3/modules/vfs_shadow_copy.c index 29163b179f7..36545ee05f5 100644 --- a/source3/modules/vfs_shadow_copy.c +++ b/source3/modules/vfs_shadow_copy.c @@ -178,7 +178,6 @@ static int shadow_copy_get_shadow_copy_data(vfs_handle_struct *handle, struct smb_Dir *dir_hnd = NULL; const char *dname = NULL; char *talloced = NULL; - long offset = 0; NTSTATUS status; struct smb_filename *smb_fname = synthetic_smb_fname(talloc_tos(), fsp->conn->connectpath, @@ -211,7 +210,7 @@ static int shadow_copy_get_shadow_copy_data(vfs_handle_struct *handle, SHADOW_COPY_LABEL *tlabels; int ret; - dname = ReadDirName(dir_hnd, &offset, NULL, &talloced); + dname = ReadDirName(dir_hnd, NULL, &talloced); if (dname == NULL) { break; } diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c index 83019fa07da..08c3114771c 100644 --- a/source3/modules/vfs_streams_depot.c +++ b/source3/modules/vfs_streams_depot.c @@ -508,7 +508,6 @@ static NTSTATUS walk_streams(vfs_handle_struct *handle, struct smb_filename *dir_smb_fname = NULL; struct smb_Dir *dir_hnd = NULL; const char *dname = NULL; - long offset = 0; char *talloced = NULL; NTSTATUS status; @@ -564,7 +563,7 @@ static NTSTATUS walk_streams(vfs_handle_struct *handle, return status; } - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { if (ISDOT(dname) || ISDOTDOT(dname)) { diff --git a/source3/smbd/close.c b/source3/smbd/close.c index d1e89325780..38c2a5ac73e 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -949,7 +949,6 @@ NTSTATUS recursive_rmdir(TALLOC_CTX *ctx, { const char *dname = NULL; char *talloced = NULL; - long offset = 0; struct smb_Dir *dir_hnd = NULL; struct files_struct *dirfsp = NULL; int retval; @@ -969,7 +968,7 @@ NTSTATUS recursive_rmdir(TALLOC_CTX *ctx, dirfsp = dir_hnd_fetch_fsp(dir_hnd); - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced))) { + while ((dname = ReadDirName(dir_hnd, NULL, &talloced))) { struct smb_filename *atname = NULL; struct smb_filename *smb_dname_full = NULL; char *fullname = NULL; @@ -1072,7 +1071,6 @@ static NTSTATUS rmdir_internals(TALLOC_CTX *ctx, struct files_struct *fsp) struct smb_filename *at_fname = NULL; const char *dname = NULL; char *talloced = NULL; - long dirpos = 0; struct smb_Dir *dir_hnd = NULL; struct files_struct *dirfsp = NULL; int unlink_flags = 0; @@ -1172,7 +1170,7 @@ static NTSTATUS rmdir_internals(TALLOC_CTX *ctx, struct files_struct *fsp) dirfsp = dir_hnd_fetch_fsp(dir_hnd); while ((dname = ReadDirName( - dir_hnd, &dirpos, NULL, &talloced)) != NULL) { + dir_hnd, NULL, &talloced)) != NULL) { struct smb_filename *smb_dname_full = NULL; struct smb_filename *direntry_fname = NULL; char *fullname = NULL; @@ -1318,10 +1316,10 @@ static NTSTATUS rmdir_internals(TALLOC_CTX *ctx, struct files_struct *fsp) } /* Do a recursive delete. */ - RewindDir(dir_hnd,&dirpos); + RewindDir(dir_hnd); while ((dname = ReadDirName( - dir_hnd, &dirpos, NULL, &talloced)) != NULL) { + dir_hnd, NULL, &talloced)) != NULL) { struct smb_filename *direntry_fname = NULL; struct smb_filename *smb_dname_full = NULL; char *fullname = NULL; diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index e28f04b0fe7..9435d693011 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -43,7 +43,6 @@ struct smb_Dir { connection_struct *conn; DIR *dir; - long offset; struct smb_filename *dir_smb_fname; unsigned int file_number; bool case_sensitive; @@ -82,9 +81,6 @@ static NTSTATUS OpenDir_fsp( static int smb_Dir_destructor(struct smb_Dir *dir_hnd); -static void SeekDir(struct smb_Dir *dirp, long offset); -static long TellDir(struct smb_Dir *dirp); - #define INVALID_DPTR_KEY (-3) /**************************************************************************** @@ -355,18 +351,12 @@ void dptr_CloseDir(files_struct *fsp) void dptr_RewindDir(struct dptr_struct *dptr) { - long offset; - RewindDir(dptr->dir_hnd, &offset); + RewindDir(dptr->dir_hnd); dptr->did_stat = false; TALLOC_FREE(dptr->overflow.fname); TALLOC_FREE(dptr->overflow.smb_fname); } -long dptr_TellDir(struct dptr_struct *dptr) -{ - return TellDir(dptr->dir_hnd); -} - unsigned int dptr_FileNumber(struct dptr_struct *dptr) { return dptr->dir_hnd->file_number; @@ -403,7 +393,6 @@ bool dptr_case_sensitive(struct dptr_struct *dptr) char *dptr_ReadDirName(TALLOC_CTX *ctx, struct dptr_struct *dptr, - long *poffset, SMB_STRUCT_STAT *pst) { struct smb_Dir *dir_hnd = dptr->dir_hnd; @@ -419,8 +408,7 @@ char *dptr_ReadDirName(TALLOC_CTX *ctx, if (dptr->has_wild) { const char *name_temp = NULL; char *talloced = NULL; - - name_temp = ReadDirName(dir_hnd, poffset, pst, &talloced); + name_temp = ReadDirName(dir_hnd, pst, &talloced); if (name_temp == NULL) { return NULL; } @@ -564,7 +552,6 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, slashlen = ( dpath[pathlen-1] != '/') ? 1 : 0; while (true) { - long cur_offset; SMB_STRUCT_STAT sbuf = { 0 }; char *dname = NULL; bool isdots; @@ -577,14 +564,13 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, bool get_dosmode = get_dosmode_in; bool ok; - cur_offset = dptr_TellDir(dirptr); - dname = dptr_ReadDirName(ctx, dirptr, &cur_offset, &sbuf); + dname = dptr_ReadDirName(ctx, dirptr, &sbuf); - DBG_DEBUG("dir [%s] dirptr [0x%lx] offset [%ld] => " + DBG_DEBUG("dir [%s] dirptr [0x%lx] offset [%u] => " "dname [%s]\n", smb_fname_str_dbg(dir_hnd->dir_smb_fname), (long)dirptr, - cur_offset, + dirptr->dir_hnd->file_number, dname ? dname : "(finished)"); if (dname == NULL) { @@ -1275,50 +1261,34 @@ static NTSTATUS OpenDir_fsp( Don't check for veto or invisible files. ********************************************************************/ -const char *ReadDirName(struct smb_Dir *dir_hnd, long *poffset, +const char *ReadDirName(struct smb_Dir *dir_hnd, SMB_STRUCT_STAT *sbuf, char **ptalloced) { const char *n; char *talloced = NULL; connection_struct *conn = dir_hnd->conn; - /* Cheat to allow . and .. to be the first entries returned. */ - if (((*poffset == START_OF_DIRECTORY_OFFSET) || - (*poffset == DOT_DOT_DIRECTORY_OFFSET)) && - (dir_hnd->file_number < 2)) - { + if (dir_hnd->file_number < 2) { if (dir_hnd->file_number == 0) { n = "."; - *poffset = dir_hnd->offset = START_OF_DIRECTORY_OFFSET; } else { n = ".."; - *poffset = dir_hnd->offset = DOT_DOT_DIRECTORY_OFFSET; } dir_hnd->file_number++; *ptalloced = NULL; return n; } - if (*poffset == END_OF_DIRECTORY_OFFSET) { - *poffset = dir_hnd->offset = END_OF_DIRECTORY_OFFSET; - return NULL; - } - - /* A real offset, seek to it. */ - SeekDir(dir_hnd, *poffset); - while ((n = vfs_readdirname(conn, dir_hnd->fsp, dir_hnd->dir, sbuf, &talloced))) { /* Ignore . and .. - we've already returned them. */ if (ISDOT(n) || ISDOTDOT(n)) { TALLOC_FREE(talloced); continue; } - *poffset = dir_hnd->offset = SMB_VFS_TELLDIR(conn, dir_hnd->dir); *ptalloced = talloced; dir_hnd->file_number++; return n; } - *poffset = dir_hnd->offset = END_OF_DIRECTORY_OFFSET; *ptalloced = NULL; return NULL; } @@ -1327,59 +1297,10 @@ const char *ReadDirName(struct smb_Dir *dir_hnd, long *poffset, Rewind to the start. ********************************************************************/ -void RewindDir(struct smb_Dir *dir_hnd, long *poffset) +void RewindDir(struct smb_Dir *dir_hnd) { SMB_VFS_REWINDDIR(dir_hnd->conn, dir_hnd->dir); dir_hnd->file_number = 0; - dir_hnd->offset = START_OF_DIRECTORY_OFFSET; - *poffset = START_OF_DIRECTORY_OFFSET; -} - -/******************************************************************* - Seek a dir. -********************************************************************/ - -static void SeekDir(struct smb_Dir *dirp, long 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; -} - -/******************************************************************* - Tell a dir position. -********************************************************************/ - -static long TellDir(struct smb_Dir *dir_hnd) -{ - return(dir_hnd->offset); } struct files_below_forall_state { @@ -1505,7 +1426,6 @@ bool have_file_open_below(connection_struct *conn, NTSTATUS can_delete_directory_fsp(files_struct *fsp) { NTSTATUS status = NT_STATUS_OK; - long dirpos = 0; const char *dname = NULL; char *talloced = NULL; struct connection_struct *conn = fsp->conn; @@ -1517,7 +1437,7 @@ NTSTATUS can_delete_directory_fsp(files_struct *fsp) return status; } - while ((dname = ReadDirName(dir_hnd, &dirpos, NULL, &talloced))) { + while ((dname = ReadDirName(dir_hnd, NULL, &talloced))) { struct smb_filename *smb_dname_full = NULL; struct smb_filename *direntry_fname = NULL; char *fullname = NULL; diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index a5ee0392bae..963251c40ed 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -277,7 +277,6 @@ NTSTATUS get_real_filename_full_scan_at(struct files_struct *dirfsp, const char *dname = NULL; char *talloced = NULL; char *unmangled_name = NULL; - long curpos; NTSTATUS status; /* If we have a case-sensitive filesystem, it doesn't do us any @@ -324,8 +323,7 @@ NTSTATUS get_real_filename_full_scan_at(struct files_struct *dirfsp, } /* now scan for matching names */ - curpos = 0; - while ((dname = ReadDirName(cur_dir, &curpos, NULL, &talloced))) { + while ((dname = ReadDirName(cur_dir, NULL, &talloced))) { /* Is it dot or dot dot. */ if (ISDOT(dname) || ISDOTDOT(dname)) { diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index dfb801a3f55..2487ea18c94 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -1485,7 +1485,6 @@ static size_t count_dfs_links(TALLOC_CTX *ctx, NTSTATUS status; struct smb_filename *smb_fname = NULL; struct smb_Dir *dir_hnd = NULL; - long offset = 0; if(*connect_path == '\0') { TALLOC_FREE(frame); @@ -1539,7 +1538,7 @@ static size_t count_dfs_links(TALLOC_CTX *ctx, goto out; } - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { struct smb_filename *smb_dname = @@ -1591,7 +1590,6 @@ static int form_junctions(TALLOC_CTX *ctx, struct referral *ref = NULL; struct smb_filename *smb_fname = NULL; struct smb_Dir *dir_hnd = NULL; - long offset = 0; NTSTATUS status; if (jn_remain == 0) { @@ -1682,7 +1680,7 @@ static int form_junctions(TALLOC_CTX *ctx, goto out; } - while ((dname = ReadDirName(dir_hnd, &offset, NULL, &talloced)) + while ((dname = ReadDirName(dir_hnd, NULL, &talloced)) != NULL) { struct smb_filename *smb_dname = NULL; diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 8fce5e02a19..6b48d7c918d 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -192,7 +192,6 @@ NTSTATUS dptr_create(connection_struct *conn, struct dptr_struct **dptr_ret); void dptr_CloseDir(files_struct *fsp); void dptr_RewindDir(struct dptr_struct *dptr); -long dptr_TellDir(struct dptr_struct *dptr); unsigned int dptr_FileNumber(struct dptr_struct *dptr); bool dptr_has_wild(struct dptr_struct *dptr); int dptr_dnum(struct dptr_struct *dptr); @@ -201,7 +200,6 @@ void dptr_set_priv(struct dptr_struct *dptr); bool dptr_case_sensitive(struct dptr_struct *dptr); char *dptr_ReadDirName(TALLOC_CTX *ctx, struct dptr_struct *dptr, - long *poffset, SMB_STRUCT_STAT *pst); struct smb_Dir; struct files_struct *dir_hnd_fetch_fsp(struct smb_Dir *dir_hnd); @@ -220,9 +218,9 @@ NTSTATUS OpenDir_from_pathref(TALLOC_CTX *mem_ctx, const char *mask, uint32_t attr, struct smb_Dir **_dir_hnd); -const char *ReadDirName(struct smb_Dir *dir_hnd, long *poffset, +const char *ReadDirName(struct smb_Dir *dir_hnd, SMB_STRUCT_STAT *sbuf, char **talloced); -void RewindDir(struct smb_Dir *dir_hnd, long *poffset); +void RewindDir(struct smb_Dir *dir_hnd); NTSTATUS can_delete_directory(struct connection_struct *conn, const char *dirname); bool have_file_open_below(connection_struct *conn, diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c index 7761303e6dd..62f184fc1b0 100644 --- a/source3/smbd/smb1_trans2.c +++ b/source3/smbd/smb1_trans2.c @@ -1494,11 +1494,10 @@ static void call_trans2findnext(connection_struct *conn, backup_priv = dptr_get_priv(fsp->dptr); - DEBUG(3,("dptr_num is %d, mask = %s, attr = %x, dirptr=(0x%lX,%ld) " + DEBUG(3,("dptr_num is %d, mask = %s, attr = %x, dirptr=(0x%lX) " "backup_priv = %d\n", dptr_num, mask, dirtype, (long)fsp->dptr, - dptr_TellDir(fsp->dptr), (int)backup_priv)); /* We don't need to check for VOL here as this is returned by @@ -1561,7 +1560,6 @@ static void call_trans2findnext(connection_struct *conn, resume_name, last_name_sent); if (!sequential) { - long offset = 0; struct stat_ex st; char *name = NULL; bool found = false; @@ -1570,7 +1568,6 @@ static void call_trans2findnext(connection_struct *conn, while ((name = dptr_ReadDirName(talloc_tos(), fsp->dptr, - &offset, &st)) != NULL) { found = smbd_dptr_name_equal(fsp->dptr, resume_name, diff --git a/source3/torture/cmd_vfs.c b/source3/torture/cmd_vfs.c index af54466fe9f..f8da602ec43 100644 --- a/source3/torture/cmd_vfs.c +++ b/source3/torture/cmd_vfs.c @@ -180,8 +180,6 @@ static NTSTATUS cmd_opendir(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc return NT_STATUS_UNSUCCESSFUL; } - vfs->currentdir_offset = 0; - TALLOC_FREE(smb_fname); printf("opendir: ok\n"); return NT_STATUS_OK; @@ -205,7 +203,6 @@ static NTSTATUS cmd_readdir(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc } dname = ReadDirName(vfs->currentdir, - &vfs->currentdir_offset, NULL, &talloced); if (dname == NULL) { @@ -304,7 +301,6 @@ static NTSTATUS cmd_closedir(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int arg } TALLOC_FREE(vfs->currentdir); - vfs->currentdir_offset = 0; printf("closedir: ok\n"); return NT_STATUS_OK; @@ -2155,12 +2151,10 @@ static NTSTATUS cmd_translate_name(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, errno = err; return NT_STATUS_UNSUCCESSFUL; } - vfs->currentdir_offset = 0; while (true) { /* ReadDirName() returns Windows "encoding" */ dname = ReadDirName(vfs->currentdir, - &vfs->currentdir_offset, NULL, &dname_talloced); if (dname == NULL) { @@ -2208,7 +2202,6 @@ cleanup: TALLOC_FREE(translated); TALLOC_FREE(smb_fname); TALLOC_FREE(vfs->currentdir); - vfs->currentdir_offset = 0; return status; } diff --git a/source3/torture/vfstest.h b/source3/torture/vfstest.h index b80592fd208..bc28d4926f5 100644 --- a/source3/torture/vfstest.h +++ b/source3/torture/vfstest.h @@ -32,7 +32,6 @@ struct vfs_state { uint64_t mid; struct files_struct *files[1024]; struct smb_Dir *currentdir; - long currentdir_offset; void *data; size_t data_size; };