[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Thu Jun 8 18:35:02 UTC 2023


The branch, master has been updated
       via  23ca540abfd smbd: Remove unused dptr_fill() and dptr_fetch_fsp()
       via  6578dc9a512 smbd: Make reply_search() easier to understand
       via  73ebbb7244d smbd: Do an early talloc_free() in reply_search()
       via  5aef4bb6be5 smbd: Do an early talloc_free() in fsp_attach_smb_fname()
       via  e4631270b73 smbd: Add dptr_RewindDir()
       via  d14b1e2d660 smbd: Add dptr_FileNumber()
       via  4e2de3a0cd2 smbd: Simplify make_dir_struct()
       via  288e591bfd4 smbd: Make SeekDir()/TellDir() static to dir.c
       via  4945b134d97 smbd: Fix a typo
      from  5c52f71c0d0 smbclient: Fix fd leak with "showacls;ls"

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


- Log -----------------------------------------------------------------
commit 23ca540abfd499007aa86d0be83adfc2f89c6a56
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jun 8 12:49:08 2023 +0200

    smbd: Remove unused dptr_fill() and dptr_fetch_fsp()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Thu Jun  8 18:34:44 UTC 2023 on atb-devel-224

commit 6578dc9a51293ee545196b497910097a8adf62ad
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jun 8 12:37:43 2023 +0200

    smbd: Make reply_search() easier to understand
    
    reply_search() is the only place in the code where we have to deal
    with [MS-CIFS] 2.2.4.59.1 ResumeKey structures. This concentrates the
    formatting of this to pure SMB1 code in reply_search(), moving away
    knowledge about the format from smbd/dir.c's dptr_fill() and
    dptr_fetch_fsp().
    
    With this code we just count up the FileIndex from behaviour note
    110. If the client is sane and sends us the last FileIndex we returned
    to it in a subsequent search, we can completely avoid any
    telldir/seekdir. If it skips back, with the new code we rewind and
    re-readdir the directory. This will be slower for a very special
    corner case, but it's a lot simpler to understand (at least to
    me). Also, it avoids calling telldir/seekdir for every entry.
    
    Tested both cases (sane and insane clients) manually with a modified
    cli_list_old_done(). Not doing automated tests. If this breaks real
    users, we'll fix it and write tests then.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 73ebbb7244d0ae77da3d73331125d5d585b95232
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jun 8 12:20:31 2023 +0200

    smbd: Do an early talloc_free() in reply_search()
    
    Don't wait for the main loop to free file names no longer used.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5aef4bb6be581020b5d22fcc5a0e50a65ab5e008
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jun 8 12:19:00 2023 +0200

    smbd: Do an early talloc_free() in fsp_attach_smb_fname()
    
    name_str can pile up when reading directories, we don't talloc_free()
    our stackframe before we have filled the whole readdir response packet.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit e4631270b73607d40359cf28375b7196f7de7a35
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jun 8 11:59:35 2023 +0200

    smbd: Add dptr_RewindDir()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d14b1e2d6603521938589cb8f9683e52bcb6a082
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jun 7 17:10:51 2023 +0200

    smbd: Add dptr_FileNumber()
    
    Return how many name entries have been returned from this dptr.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4e2de3a0cd2661af2321ec3a34348fcda9283c20
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jun 7 15:16:44 2023 +0200

    smbd: Simplify make_dir_struct()
    
    We don't need the talloc_strdup and thus we can return void.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 288e591bfd4efd6a1b1c2239e5cf43c79ea3446b
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 29 12:47:34 2023 +0200

    smbd: Make SeekDir()/TellDir() static to dir.c
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4945b134d9714603b39bc69b71b433afb4743011
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jun 7 17:18:28 2023 +0200

    smbd: Fix a typo
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 source3/smbd/dir.c        | 187 ++++------------------------------------------
 source3/smbd/files.c      |   4 +
 source3/smbd/proto.h      |   8 +-
 source3/smbd/smb1_reply.c | 123 +++++++++++++++++++-----------
 4 files changed, 102 insertions(+), 220 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 09029ee0c23..5979e1cf72b 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -38,11 +38,6 @@
 #define START_OF_DIRECTORY_OFFSET ((long)0)
 #define DOT_DOT_DIRECTORY_OFFSET ((long)0x80000000)
 
-/* "Special" directory offsets in 32-bit wire format. */
-#define WIRE_END_OF_DIRECTORY_OFFSET ((uint32_t)0xFFFFFFFF)
-#define WIRE_START_OF_DIRECTORY_OFFSET ((uint32_t)0)
-#define WIRE_DOT_DOT_DIRECTORY_OFFSET ((uint32_t)0x80000000)
-
 /* Make directory handle internals available. */
 
 struct name_cache_entry {
@@ -75,7 +70,6 @@ struct dptr_struct {
 	bool did_stat; /* Optimisation for non-wcard searches. */
 	bool priv;     /* Directory handle opened with privilege. */
 	uint32_t counter;
-	struct memcache *dptr_cache;
 };
 
 static NTSTATUS OpenDir_fsp(
@@ -91,6 +85,8 @@ static void DirCacheAdd(struct smb_Dir *dir_hnd, const char *name, long offset);
 static int smb_Dir_destructor(struct smb_Dir *dir_hnd);
 
 static bool SearchDir(struct smb_Dir *dir_hnd, const char *name, long *poffset);
+static void SeekDir(struct smb_Dir *dirp, long offset);
+static long TellDir(struct smb_Dir *dirp);
 
 #define INVALID_DPTR_KEY (-3)
 
@@ -360,6 +356,12 @@ void dptr_CloseDir(files_struct *fsp)
 	TALLOC_FREE(fsp->dptr);
 }
 
+void dptr_RewindDir(struct dptr_struct *dptr)
+{
+	long offset;
+	RewindDir(dptr->dir_hnd, &offset);
+}
+
 void dptr_SeekDir(struct dptr_struct *dptr, long offset)
 {
 	SeekDir(dptr->dir_hnd, offset);
@@ -370,6 +372,11 @@ 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;
+}
+
 bool dptr_has_wild(struct dptr_struct *dptr)
 {
 	return dptr->has_wild;
@@ -537,170 +544,6 @@ bool dptr_SearchDir(struct dptr_struct *dptr, const char *name, long *poffset, S
 	return SearchDir(dptr->dir_hnd, name, poffset);
 }
 
-/****************************************************************************
- Map a native directory offset to a 32-bit cookie.
-****************************************************************************/
-
-static uint32_t map_dir_offset_to_wire(struct dptr_struct *dptr, long offset)
-{
-	DATA_BLOB key;
-	DATA_BLOB val;
-
-	if (offset == END_OF_DIRECTORY_OFFSET) {
-		return WIRE_END_OF_DIRECTORY_OFFSET;
-	}
-	if (offset == START_OF_DIRECTORY_OFFSET) {
-		return WIRE_START_OF_DIRECTORY_OFFSET;
-	}
-	if (offset == DOT_DOT_DIRECTORY_OFFSET) {
-		return WIRE_DOT_DOT_DIRECTORY_OFFSET;
-	}
-	if (sizeof(long) == 4) {
-		/* 32-bit machine. We can cheat... */
-		return (uint32_t)offset;
-	}
-	if (dptr->dptr_cache == NULL) {
-		/* Lazy initialize cache. */
-		dptr->dptr_cache = memcache_init(dptr, 0);
-		if (dptr->dptr_cache == NULL) {
-			return WIRE_END_OF_DIRECTORY_OFFSET;
-		}
-	} else {
-		/* Have we seen this offset before ? */
-		key.data = (void *)&offset;
-		key.length = sizeof(offset);
-		if (memcache_lookup(dptr->dptr_cache,
-					SMB1_SEARCH_OFFSET_MAP,
-					key,
-					&val)) {
-			uint32_t wire_offset;
-			SMB_ASSERT(val.length == sizeof(wire_offset));
-			memcpy(&wire_offset, val.data, sizeof(wire_offset));
-			DEBUG(10,("found wire %u <-> offset %ld\n",
-				(unsigned int)wire_offset,
-				(long)offset));
-			return wire_offset;
-		}
-	}
-	/* Allocate a new wire cookie. */
-	do {
-		dptr->counter++;
-	} while (dptr->counter == WIRE_START_OF_DIRECTORY_OFFSET ||
-		 dptr->counter == WIRE_END_OF_DIRECTORY_OFFSET ||
-		 dptr->counter == WIRE_DOT_DOT_DIRECTORY_OFFSET);
-	/* Store it in the cache. */
-	key.data = (void *)&offset;
-	key.length = sizeof(offset);
-	val.data = (void *)&dptr->counter;
-	val.length = sizeof(dptr->counter); /* MUST BE uint32_t ! */
-	memcache_add(dptr->dptr_cache,
-			SMB1_SEARCH_OFFSET_MAP,
-			key,
-			val);
-	/* And the reverse mapping for lookup from
-	   map_wire_to_dir_offset(). */
-	memcache_add(dptr->dptr_cache,
-			SMB1_SEARCH_OFFSET_MAP,
-			val,
-			key);
-	DEBUG(10,("stored wire %u <-> offset %ld\n",
-		(unsigned int)dptr->counter,
-		(long)offset));
-	return dptr->counter;
-}
-
-/****************************************************************************
- Fill the 5 byte server reserved dptr field.
-****************************************************************************/
-
-bool dptr_fill(struct smbd_server_connection *sconn,
-	       char *buf1,unsigned int key)
-{
-	unsigned char *buf = (unsigned char *)buf1;
-	struct dptr_struct *dptr = dptr_get(sconn, key);
-	uint32_t wire_offset;
-	if (!dptr) {
-		DEBUG(1,("filling null dirptr %d\n",key));
-		return(False);
-	}
-	wire_offset = map_dir_offset_to_wire(dptr,TellDir(dptr->dir_hnd));
-	DEBUG(6,("fill on key %u dirptr 0x%lx now at %d\n",key,
-		(long)dptr->dir_hnd,(int)wire_offset));
-	buf[0] = key;
-	SIVAL(buf,1,wire_offset);
-	return(True);
-}
-
-/****************************************************************************
- Map a 32-bit wire cookie to a native directory offset.
-****************************************************************************/
-
-static long map_wire_to_dir_offset(struct dptr_struct *dptr, uint32_t wire_offset)
-{
-	DATA_BLOB key;
-	DATA_BLOB val;
-
-	if (wire_offset == WIRE_END_OF_DIRECTORY_OFFSET) {
-		return END_OF_DIRECTORY_OFFSET;
-	} else if(wire_offset == WIRE_START_OF_DIRECTORY_OFFSET) {
-		return START_OF_DIRECTORY_OFFSET;
-	} else if (wire_offset == WIRE_DOT_DOT_DIRECTORY_OFFSET) {
-		return DOT_DOT_DIRECTORY_OFFSET;
-	}
-	if (sizeof(long) == 4) {
-		/* 32-bit machine. We can cheat... */
-		return (long)wire_offset;
-	}
-	if (dptr->dptr_cache == NULL) {
-		/* Logic error, cache should be initialized. */
-		return END_OF_DIRECTORY_OFFSET;
-	}
-	key.data = (void *)&wire_offset;
-	key.length = sizeof(wire_offset);
-	if (memcache_lookup(dptr->dptr_cache,
-				SMB1_SEARCH_OFFSET_MAP,
-				key,
-				&val)) {
-		/* Found mapping. */
-		long offset;
-		SMB_ASSERT(val.length == sizeof(offset));
-		memcpy(&offset, val.data, sizeof(offset));
-		DEBUG(10,("lookup wire %u <-> offset %ld\n",
-			(unsigned int)wire_offset,
-			(long)offset));
-		return offset;
-	}
-	return END_OF_DIRECTORY_OFFSET;
-}
-
-/****************************************************************************
- Return the associated fsp and seek the dir_hnd on it it given the 5 byte
- server field.
-****************************************************************************/
-
-files_struct *dptr_fetch_fsp(struct smbd_server_connection *sconn,
-			       char *buf, int *num)
-{
-	unsigned int key = *(unsigned char *)buf;
-	struct dptr_struct *dptr = dptr_get(sconn, key);
-	uint32_t wire_offset;
-	long seekoff;
-
-	if (dptr == NULL) {
-		DEBUG(3,("fetched null dirptr %d\n",key));
-		return(NULL);
-	}
-	*num = key;
-	wire_offset = IVAL(buf,1);
-	seekoff = map_wire_to_dir_offset(dptr, wire_offset);
-	SeekDir(dptr->dir_hnd,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;
-}
-
 struct files_struct *dir_hnd_fetch_fsp(struct smb_Dir *dir_hnd)
 {
 	return dir_hnd->fsp;
@@ -1685,7 +1528,7 @@ void RewindDir(struct smb_Dir *dir_hnd, long *poffset)
  Seek a dir.
 ********************************************************************/
 
-void SeekDir(struct smb_Dir *dirp, long offset)
+static void SeekDir(struct smb_Dir *dirp, long offset)
 {
 	if (offset == dirp->offset) {
 		/*
@@ -1723,7 +1566,7 @@ void SeekDir(struct smb_Dir *dirp, long offset)
  Tell a dir position.
 ********************************************************************/
 
-long TellDir(struct smb_Dir *dir_hnd)
+static long TellDir(struct smb_Dir *dir_hnd)
 {
 	return(dir_hnd->offset);
 }
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 792e9424bdc..ac2bdbd4fde 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -2030,6 +2030,7 @@ NTSTATUS file_name_hash(connection_struct *conn,
 static NTSTATUS fsp_attach_smb_fname(struct files_struct *fsp,
 				     struct smb_filename **_smb_fname)
 {
+	TALLOC_CTX *frame = talloc_stackframe();
 	struct smb_filename *smb_fname_new = talloc_move(fsp, _smb_fname);
 	const char *name_str = NULL;
 	uint32_t name_hash = 0;
@@ -2037,12 +2038,15 @@ static NTSTATUS fsp_attach_smb_fname(struct files_struct *fsp,
 
 	name_str = smb_fname_str_dbg(smb_fname_new);
 	if (name_str == NULL) {
+		TALLOC_FREE(frame);
 		return NT_STATUS_NO_MEMORY;
 	}
 
 	status = file_name_hash(fsp->conn,
 				name_str,
 				&name_hash);
+	TALLOC_FREE(frame);
+	name_str = NULL;
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 5361678a922..daa5dc6bb48 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -192,17 +192,15 @@ NTSTATUS dptr_create(connection_struct *conn,
 		struct dptr_struct **dptr_ret);
 void dptr_CloseDir(files_struct *fsp);
 void dptr_SeekDir(struct dptr_struct *dptr, long offset);
+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);
 bool dptr_get_priv(struct dptr_struct *dptr);
 void dptr_set_priv(struct dptr_struct *dptr);
 bool dptr_case_sensitive(struct dptr_struct *dptr);
 bool dptr_SearchDir(struct dptr_struct *dptr, const char *name, long *poffset, SMB_STRUCT_STAT *pst);
-bool dptr_fill(struct smbd_server_connection *sconn,
-	       char *buf1,unsigned int key);
-files_struct *dptr_fetch_fsp(struct smbd_server_connection *sconn,
-			       char *buf,int *num);
 struct smb_Dir;
 struct files_struct *dir_hnd_fetch_fsp(struct smb_Dir *dir_hnd);
 files_struct *dptr_fetch_lanman2_fsp(struct smbd_server_connection *sconn,
@@ -233,8 +231,6 @@ NTSTATUS OpenDir_from_pathref(TALLOC_CTX *mem_ctx,
 const char *ReadDirName(struct smb_Dir *dir_hnd, long *poffset,
 			SMB_STRUCT_STAT *sbuf, char **talloced);
 void RewindDir(struct smb_Dir *dir_hnd, long *poffset);
-void SeekDir(struct smb_Dir *dirp, long offset);
-long TellDir(struct smb_Dir *dirp);
 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_reply.c b/source3/smbd/smb1_reply.c
index 652ff328b41..30142202022 100644
--- a/source3/smbd/smb1_reply.c
+++ b/source3/smbd/smb1_reply.c
@@ -1087,7 +1087,7 @@ void reply_dskattr(struct smb_request *req)
  Make a dir struct.
 ****************************************************************************/
 
-static bool make_dir_struct(TALLOC_CTX *ctx,
+static void make_dir_struct(TALLOC_CTX *ctx,
 			    char *buf,
 			    const char *mask,
 			    const char *fname,
@@ -1097,24 +1097,19 @@ static bool make_dir_struct(TALLOC_CTX *ctx,
 			    bool uc)
 {
 	char *p;
-	char *mask2 = talloc_strdup(ctx, mask);
-
-	if (!mask2) {
-		return False;
-	}
 
 	if ((mode & FILE_ATTRIBUTE_DIRECTORY) != 0) {
 		size = 0;
 	}
 
 	memset(buf+1,' ',11);
-	if ((p = strchr_m(mask2,'.')) != NULL) {
-		*p = 0;
-		push_ascii(buf+1,mask2,8, 0);
+	if ((p = strchr_m(mask, '.')) != NULL) {
+		char name[p - mask + 1];
+		strlcpy(name, mask, sizeof(name));
+		push_ascii(buf + 1, name, 8, 0);
 		push_ascii(buf+9,p+1,3, 0);
-		*p = '.';
 	} else {
-		push_ascii(buf+1,mask2,11, 0);
+		push_ascii(buf + 1, mask, 11, 0);
 	}
 
 	memset(buf+21,'\0',DIR_STRUCT_SIZE-21);
@@ -1126,7 +1121,6 @@ static bool make_dir_struct(TALLOC_CTX *ctx,
 	   Strange, but verified on W2K3. Needed for OS/2. JRA. */
 	push_ascii(buf+30,fname,12, uc ? STR_UPPER : 0);
 	DEBUG(8,("put name [%s] from [%s] into dir struct\n",buf+30, fname));
-	return True;
 }
 
 /****************************************************************************
@@ -1283,7 +1277,7 @@ void reply_search(struct smb_request *req)
 			/*
 			 * Use NULL here for the first parameter (req)
 			 * as this is not a client visible handle so
-			 * can'tbe part of an SMB1 chain.
+			 * can't be part of an SMB1 chain.
 			 */
 			close_file_free(NULL, &fsp, NORMAL_CLOSE);
 			reply_nterror(req, nt_status);
@@ -1301,6 +1295,8 @@ void reply_search(struct smb_request *req)
 	} else {
 		int status_dirtype;
 		const char *dirpath;
+		unsigned int dptr_filenum;
+		uint32_t resume_key_index;
 
 		if (smbreq_bufrem(req, p) < 21) {
 			reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -1313,10 +1309,55 @@ void reply_search(struct smb_request *req)
 			dirtype = status_dirtype;
 		}
 
-		fsp = dptr_fetch_fsp(sconn, status+12,&dptr_num);
+		dptr_num = CVAL(status, 12);
+		fsp = dptr_fetch_lanman2_fsp(sconn, dptr_num);
 		if (fsp == NULL) {
 			goto SearchEmpty;
 		}
+
+		resume_key_index = PULL_LE_U32(status, 13);
+		dptr_filenum = dptr_FileNumber(fsp->dptr);
+
+		if (resume_key_index > dptr_filenum) {
+			/*
+			 * Haven't seen this resume key yet. Just stop
+			 * the search.
+			 */
+			goto SearchEmpty;
+		}
+
+		if (resume_key_index < dptr_filenum) {
+			/*
+			 * The resume key was not the last one we
+			 * sent, rewind and skip to what the client
+			 * sent.
+			 */
+			dptr_RewindDir(fsp->dptr);
+
+			dptr_filenum = dptr_FileNumber(fsp->dptr);
+			SMB_ASSERT(dptr_filenum == 0);
+
+			while (dptr_filenum < resume_key_index) {
+				bool ok = get_dir_entry(
+					ctx,
+					fsp->dptr,
+					dptr_wcard(sconn, dptr_num),
+					dirtype,
+					&fname,
+					&size,
+					&mode,
+					&date,
+					check_descend,
+					false);
+				TALLOC_FREE(fname);
+				if (!ok) {
+					goto SearchEmpty;
+				}
+
+				dptr_filenum = dptr_FileNumber(fsp->dptr);
+			}
+		}
+
 		dirpath = dptr_path(sconn, dptr_num);
 		directory = talloc_strdup(ctx, dirpath);
 		if (!directory) {
@@ -1338,17 +1379,16 @@ void reply_search(struct smb_request *req)
 	if ((dirtype&0x1F) == FILE_ATTRIBUTE_VOLUME) {
 		char buf[DIR_STRUCT_SIZE];
 		memcpy(buf,status,21);
-		if (!make_dir_struct(ctx,buf,"???????????",volume_label(ctx, SNUM(conn)),
-				0,FILE_ATTRIBUTE_VOLUME,0,!allow_long_path_components)) {
-			reply_nterror(req, NT_STATUS_NO_MEMORY);
-			goto out;
-		}
-		dptr_fill(sconn, buf+12,dptr_num);
-		if (dptr_zero(buf+12) && (status_len==0)) {
-			numentries = 1;
-		} else {
-			numentries = 0;
-		}
+		make_dir_struct(ctx,
+				buf,
+				"???????????",
+				volume_label(ctx, SNUM(conn)),
+				0,
+				FILE_ATTRIBUTE_VOLUME,
+				0,
+				!allow_long_path_components);
+		SCVAL(buf, 12, dptr_num);
+		numentries = 1;
 		if (message_push_blob(&req->outbuf,
 				      data_blob_const(buf, sizeof(buf)))
 		    == -1) {
@@ -1385,20 +1425,19 @@ void reply_search(struct smb_request *req)
 			if (!finished) {
 				char buf[DIR_STRUCT_SIZE];
 				memcpy(buf,status,21);
-				if (!make_dir_struct(ctx,
-						buf,
-						mask,
-						fname,
-						size,
-						mode,
-						convert_timespec_to_time_t(date),
-						!allow_long_path_components)) {
-					reply_nterror(req, NT_STATUS_NO_MEMORY);
-					goto out;
-				}
-				if (!dptr_fill(sconn, buf+12,dptr_num)) {
-					break;
-				}
+				make_dir_struct(
+					ctx,
+					buf,
+					mask,
+					fname,
+					size,
+					mode,
+					convert_timespec_to_time_t(date),
+					!allow_long_path_components);
+				SCVAL(buf, 12, dptr_num);
+				PUSH_LE_U32(buf,
+					    13,
+					    dptr_FileNumber(fsp->dptr));
 				if (message_push_blob(&req->outbuf,
 						      data_blob_const(buf, sizeof(buf)))
 				    == -1) {
@@ -1407,6 +1446,7 @@ void reply_search(struct smb_request *req)
 				}
 				numentries++;
 			}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list