smbd: add a directory argument to safe_symlink_target_path()
authorRalph Boehme <slow@samba.org>
Tue, 2 Jan 2024 12:25:25 +0000 (13:25 +0100)
committerJule Anger <janger@samba.org>
Mon, 29 Jan 2024 10:46:17 +0000 (10:46 +0000)
Existing caller passes NULL, no change in behaviour. Prepares for
replacing symlink_target_below_conn() in open.c.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15549

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit fc80c72d658a41fe4d93b24b793b52c91b350175)

source3/include/proto.h
source3/smbd/filename.c

index 13240033bf16c1503ae7d917448653cd8ae14389..15c5839caf8209b9311720305a5c432ee2affa5b 100644 (file)
@@ -721,6 +721,7 @@ struct smb_filename *synthetic_smb_fname(TALLOC_CTX *mem_ctx,
                                         uint32_t flags);
 NTSTATUS safe_symlink_target_path(TALLOC_CTX *mem_ctx,
                                  const char *connectpath,
+                                 const char *dir,
                                  const char *target,
                                  size_t unparsed,
                                  char **_relative);
index 45fb90381e262d1e621d84d974979c3aef5d271e..55a49e0ba93c7975f8d3dd4b062eab485b9b6ac2 100644 (file)
@@ -944,6 +944,7 @@ static char *symlink_target_path(
 
 NTSTATUS safe_symlink_target_path(TALLOC_CTX *mem_ctx,
                                  const char *connectpath,
+                                 const char *dir,
                                  const char *target,
                                  size_t unparsed,
                                  char **_relative)
@@ -959,10 +960,21 @@ NTSTATUS safe_symlink_target_path(TALLOC_CTX *mem_ctx,
 
        if (target[0] == '/') {
                abs_target = talloc_strdup(mem_ctx, target);
-       } else {
+       } else if (dir == NULL) {
+               abs_target = talloc_asprintf(mem_ctx,
+                                            "%s/%s",
+                                            connectpath,
+                                            target);
+       } else if (dir[0] == '/') {
                abs_target = talloc_asprintf(mem_ctx,
                                             "%s/%s",
+                                            dir,
+                                            target);
+       } else {
+               abs_target = talloc_asprintf(mem_ctx,
+                                            "%s/%s/%s",
                                             connectpath,
+                                            dir,
                                             target);
        }
        if (abs_target == NULL) {
@@ -1473,6 +1485,7 @@ next:
 
        status = safe_symlink_target_path(mem_ctx,
                                          conn->connectpath,
+                                         NULL,
                                          target,
                                          unparsed,
                                          &safe_target);