]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Add dptr_struct->last_name_sent
authorVolker Lendecke <vl@samba.org>
Fri, 9 Jun 2023 13:22:31 +0000 (15:22 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 13 Jun 2023 23:33:39 +0000 (23:33 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/dir.c
source3/smbd/globals.h
source3/smbd/smb2_trans2.c

index 02e7181c3b832d9b4ebd6e8a33fdfadcf59bbee5..6fad63dc0d2b8a660a600cf14f33b0f603cef0a0 100644 (file)
@@ -71,6 +71,8 @@ struct dptr_struct {
        bool priv;     /* Directory handle opened with privilege. */
        uint32_t counter;
 
+       char *last_name_sent;   /* for name-based trans2 resume */
+
        struct {
                char *fname;
                struct smb_filename *smb_fname;
@@ -905,6 +907,18 @@ void smbd_dirptr_push_overflow(struct dptr_struct *dirptr,
        dirptr->overflow.mode = mode;
 }
 
+void smbd_dirptr_set_last_name_sent(struct dptr_struct *dirptr,
+                                   char **_fname)
+{
+       TALLOC_FREE(dirptr->last_name_sent);
+       dirptr->last_name_sent = talloc_move(dirptr, _fname);
+}
+
+char *smbd_dirptr_get_last_name_sent(struct dptr_struct *dirptr)
+{
+       return dirptr->last_name_sent;
+}
+
 /*******************************************************************
  Check to see if a user can read an fsp . This is only approximate,
  it is used as part of the "hide unreadable" option. Don't
index 3d9f046a15be32371dba90c7ebe5a8aa3f33eb24..c365f3b821a117731b4693ba55db693906ebafe9 100644 (file)
@@ -186,6 +186,9 @@ void smbd_dirptr_push_overflow(struct dptr_struct *dirptr,
                               char **_fname,
                               struct smb_filename **_smb_fname,
                               uint32_t mode);
+void smbd_dirptr_set_last_name_sent(struct dptr_struct *dirptr,
+                                   char **_fname);
+char *smbd_dirptr_get_last_name_sent(struct dptr_struct *dirptr);
 
 NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
                               connection_struct *conn,
index 9b72d8637528949cff061d133eda5cd5a2b4993f..955aee68fb5179d1b9db6483b17ba120562c8ba9 100644 (file)
@@ -2011,6 +2011,8 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
                return status;
        }
 
+       smbd_dirptr_set_last_name_sent(dirptr, &smb_fname->base_name);
+
        if (_smb_fname != NULL) {
                /*
                 * smb_fname is already talloc'ed off ctx.
@@ -2021,7 +2023,11 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
                 * for asynchronous handle lookups.
                 */
                TALLOC_FREE(smb_fname->stream_name);
-               TALLOC_FREE(smb_fname->base_name);
+
+               /*
+                * smbd_dirptr_set_last_name_sent() above consumed
+                * base_name
+                */
                smb_fname->base_name = talloc_strdup(smb_fname, fname);
 
                if (smb_fname->base_name == NULL) {