]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: build smb_fname per file to delete in unlink_internals()
authorRalph Boehme <slow@samba.org>
Fri, 19 Jun 2020 10:31:23 +0000 (12:31 +0200)
committerJeremy Allison <jra@samba.org>
Sat, 18 Jul 2020 07:21:10 +0000 (07:21 +0000)
Make sure to pass fresh smb_fname's to do_unlink(). Needed for path-ref fsps in
the future.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Jul 18 07:21:11 UTC 2020 on sn-devel-184

source3/smbd/reply.c

index f911fc006a34dede5446375d3c7d634a4f1c6da3..252b9556c3fa052963739ffaa483a9890cf62049 100644 (file)
@@ -3473,6 +3473,8 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                while ((dname = ReadDirName(dir_hnd, &offset,
                                            &smb_fname->st, &talloced))) {
                        TALLOC_CTX *frame = talloc_stackframe();
+                       char *p = NULL;
+                       struct smb_filename *f = NULL;
 
                        if (!is_visible_file(conn,
                                        dir_hnd,
@@ -3498,19 +3500,27 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                                continue;
                        }
 
-                       TALLOC_FREE(smb_fname->base_name);
                        if (ISDOT(fname_dir)) {
                                /* Ensure we use canonical names on open. */
-                               smb_fname->base_name =
-                                       talloc_asprintf(smb_fname, "%s",
-                                               dname);
+                               p = talloc_asprintf(smb_fname, "%s", dname);
                        } else {
-                               smb_fname->base_name =
-                                       talloc_asprintf(smb_fname, "%s/%s",
-                                               fname_dir, dname);
+                               p = talloc_asprintf(smb_fname, "%s/%s",
+                                                   fname_dir, dname);
                        }
-
-                       if (!smb_fname->base_name) {
+                       if (p == NULL) {
+                               TALLOC_FREE(dir_hnd);
+                               status = NT_STATUS_NO_MEMORY;
+                               TALLOC_FREE(frame);
+                               TALLOC_FREE(talloced);
+                               goto out;
+                       }
+                       f = synthetic_smb_fname(frame,
+                                               p,
+                                               NULL,
+                                               &smb_fname->st,
+                                               smb_fname->flags,
+                                               smb_fname->twrp);
+                       if (f == NULL) {
                                TALLOC_FREE(dir_hnd);
                                status = NT_STATUS_NO_MEMORY;
                                TALLOC_FREE(frame);
@@ -3518,7 +3528,7 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                                goto out;
                        }
 
-                       status = check_name(conn, smb_fname);
+                       status = check_name(conn, f);
                        if (!NT_STATUS_IS_OK(status)) {
                                TALLOC_FREE(dir_hnd);
                                TALLOC_FREE(frame);
@@ -3526,7 +3536,7 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                                goto out;
                        }
 
-                       status = do_unlink(conn, req, smb_fname, dirtype);
+                       status = do_unlink(conn, req, f, dirtype);
                        if (!NT_STATUS_IS_OK(status)) {
                                TALLOC_FREE(dir_hnd);
                                TALLOC_FREE(frame);
@@ -3535,8 +3545,8 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                        }
 
                        count++;
-                       DEBUG(3,("unlink_internals: successful unlink [%s]\n",
-                                smb_fname->base_name));
+                       DBG_DEBUG("successful unlink [%s]\n",
+                                 smb_fname_str_dbg(f));
 
                        TALLOC_FREE(frame);
                        TALLOC_FREE(talloced);