[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Thu Mar 28 09:14:02 UTC 2024


The branch, master has been updated
       via  a3126ebfe57 lib: Use struct initialization in imessaging_client_init()
       via  2d4aa599943 lib: Fix whitespace
       via  ff747f691ec lib: Fix dbwrap_tdb.h prerequisites
       via  b1b5d32c540 lib: Give tallocmsg.c its own header
       via  b8e409e755b lib: Fix whitespace
       via  00141ca4704 smbd: Remove an outdated comment
       via  18d9b1b17cf smbd: Remove struct open_symlink_err
       via  adca0ffd712 smbd: Remove "unparsed" from struct open_symlink_err
       via  8ca649025ae smbd: Remove "st" from struct open_symlink_err
       via  331a49ca394 smbd: Fix returning symlink stat info in the NO_OPATH case
       via  a2a77842a13 smbd: Make read_symlink_reparse() return a reparse_data_buffer
       via  57e548841f9 smbd: Simplify users of fsp_fullbasepath()
      from  06c589aaa1a python/samba/tests/krb5: Extend PKINIT tests to cover UF_SMARTCARD_REQUIRED

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


- Log -----------------------------------------------------------------
commit a3126ebfe5736f5e8af9bff3a6e8d7db1929e377
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 27 15:39:30 2024 +0100

    lib: Use struct initialization in imessaging_client_init()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
    Autobuild-Date(master): Thu Mar 28 09:13:43 UTC 2024 on atb-devel-224

commit 2d4aa599943a5860ebc0cc54d85012b360453bdc
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 27 15:39:16 2024 +0100

    lib: Fix whitespace
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit ff747f691ec30c964094550e6a9a0fc1f19fb0ff
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 21 10:55:55 2024 +0100

    lib: Fix dbwrap_tdb.h prerequisites
    
    It uses enum dbwrap_lock_order, so include dbwrap.h
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit b1b5d32c54099e4a1c61d0a81ceaab986b62ce52
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 20 13:04:28 2024 +0100

    lib: Give tallocmsg.c its own header
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit b8e409e755baf77184995f72d640f0de7ed6808e
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 28 16:45:57 2024 +0100

    lib: Fix whitespace
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 00141ca4704698028fa0137d4eecb37ba2385e8b
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Feb 10 14:27:38 2024 +0100

    smbd: Remove an outdated comment
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 18d9b1b17cfee79b8d2b78ac99ca31600b002a6e
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 18:07:19 2024 +0100

    smbd: Remove struct open_symlink_err
    
    This was just a wrapper for a single pointer, remove it
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit adca0ffd712ecfa26f2255f86e3882a9c124c429
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 17:42:28 2024 +0100

    smbd: Remove "unparsed" from struct open_symlink_err
    
    We have the reserved field unparsed_path_length as part of struct
    symlink_reparse_struct.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 8ca649025aee31b4a3a0f5f8fb62861d4a41b864
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 17:27:50 2024 +0100

    smbd: Remove "st" from struct open_symlink_err
    
    Since c96010a2a9f nobody reads it anymore
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 331a49ca394f185473d0b5ba1c566a32ab01b6ff
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 18:50:47 2024 +0100

    smbd: Fix returning symlink stat info in the NO_OPATH case
    
    Our callers don't look at symlink_err's struct stat anymore, they look
    at the fname's one since we return them properly even for symlinks. So
    don't bother filling in symlink_err->st, nobody reads it anyways.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit a2a77842a13c3c4a561ec8d5d298bbab60fafd1a
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 16:07:22 2024 +0100

    smbd: Make read_symlink_reparse() return a reparse_data_buffer
    
    Will make generalized handling of reparse point error returns easier
    once we will also allow creating symlink reparse point files over smb.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 57e548841f9b560e7caf84965e3ca4d36997bf17
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 4 11:10:18 2024 +0100

    smbd: Simplify users of fsp_fullbasepath()
    
    All three users had to strip a trailing "/.". Centralize this.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

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

Summary of changes:
 lib/dbwrap/dbwrap_tdb.h                            |   2 +-
 source3/include/proto.h                            |   5 -
 source3/lib/ctdbd_conn.c                           |   2 +-
 source3/lib/messages.c                             |   1 +
 source3/lib/tallocmsg.c                            |   6 +-
 .../lib/tallocmsg.h                                |  14 +-
 source3/smbd/filename.c                            |  38 +++--
 source3/smbd/files.c                               | 166 ++++++++++-----------
 source3/smbd/notify.c                              |  11 --
 source3/smbd/proto.h                               |  41 ++---
 source3/smbd/smb1_trans2.c                         |   5 -
 source4/lib/messaging/irpc.h                       |  11 +-
 source4/lib/messaging/messaging.c                  |  16 +-
 source4/lib/messaging/messaging.h                  |   8 +-
 14 files changed, 149 insertions(+), 177 deletions(-)
 copy lib/util/talloc_report_printf.h => source3/lib/tallocmsg.h (72%)


Changeset truncated at 500 lines:

diff --git a/lib/dbwrap/dbwrap_tdb.h b/lib/dbwrap/dbwrap_tdb.h
index d5f49c7d574..9251538705c 100644
--- a/lib/dbwrap/dbwrap_tdb.h
+++ b/lib/dbwrap/dbwrap_tdb.h
@@ -20,7 +20,7 @@
 #ifndef __DBWRAP_TDB_H__
 #define __DBWRAP_TDB_H__
 
-#include <talloc.h>
+#include "lib/dbwrap/dbwrap.h"
 
 struct db_context;
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index ed45485e654..389bb2fc935 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -222,11 +222,6 @@ bool getgroups_unix_user(TALLOC_CTX *mem_ctx, const char *user,
 			 gid_t primary_gid,
 			 gid_t **ret_groups, uint32_t *p_ngroups);
 
-/* The following definitions come from lib/tallocmsg.c  */
-
-void register_msg_pool_usage(TALLOC_CTX *mem_ctx,
-			     struct messaging_context *msg_ctx);
-
 /* The following definitions come from lib/time.c  */
 
 uint32_t convert_time_t_to_uint32_t(time_t t);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index f32397d9353..abee0eb87b1 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -1,4 +1,4 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    Samba internal messaging functions
    Copyright (C) 2007 by Volker Lendecke
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 7d3d46960a9..b856a2889b1 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -62,6 +62,7 @@
 #include "cluster_support.h"
 #include "ctdbd_conn.h"
 #include "ctdb_srvids.h"
+#include "source3/lib/tallocmsg.h"
 
 #ifdef CLUSTER_SUPPORT
 #include "ctdb_protocol.h"
diff --git a/source3/lib/tallocmsg.c b/source3/lib/tallocmsg.c
index af5a90bb434..da05357a4df 100644
--- a/source3/lib/tallocmsg.c
+++ b/source3/lib/tallocmsg.c
@@ -16,9 +16,11 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "includes.h"
-#include "messages.h"
+#include "replace.h"
+#include "source3/include/messages.h"
+#include "source3/lib/tallocmsg.h"
 #include "lib/util/talloc_report_printf.h"
+#include "lib/util/debug.h"
 
 static bool pool_usage_filter(struct messaging_rec *rec, void *private_data)
 {
diff --git a/lib/util/talloc_report_printf.h b/source3/lib/tallocmsg.h
similarity index 72%
copy from lib/util/talloc_report_printf.h
copy to source3/lib/tallocmsg.h
index 7881e655243..9dd31a7c4b3 100644
--- a/lib/util/talloc_report_printf.h
+++ b/source3/lib/tallocmsg.h
@@ -1,7 +1,6 @@
 /*
- * talloc_report into a FILE
- *
- * Copyright Volker Lendecke <vl at samba.org> 2019
+ * samba -- Unix SMB/CIFS implementation.
+ * Copyright (C) 2001, 2002 by Martin Pool
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,13 +16,14 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef _TALLOC_REPORT_PRINTF_H_
-#define _TALLOC_REPORT_PRINTF_H_
+#ifndef __SOURCE3_LIB_TALLOCMSG_H__
+#define __SOURCE3_LIB_TALLOCMSG_H__
 
 #include "replace.h"
-#include "system/filesys.h"
 #include <talloc.h>
+struct messaging_context;
 
-void talloc_full_report_printf(TALLOC_CTX *root, FILE *f);
+void register_msg_pool_usage(
+	TALLOC_CTX *mem_ctx, struct messaging_context *msg_ctx);
 
 #endif
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index f80f67c1291..4370d733048 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -737,12 +737,12 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
 	NTTIME twrp,
 	struct files_struct **_dirfsp,
 	struct smb_filename **_smb_fname,
-	struct open_symlink_err **_symlink_err)
+	struct reparse_data_buffer **_symlink_err)
 {
 	struct smb_filename *smb_dirname = NULL;
 	struct smb_filename *smb_fname_rel = NULL;
 	struct smb_filename *smb_fname = NULL;
-	struct open_symlink_err *symlink_err = NULL;
+	struct reparse_data_buffer *symlink_err = NULL;
 	const bool posix = (ucf_flags & UCF_POSIX_PATHNAMES);
 	char *dirname = NULL;
 	const char *fname_rel = NULL;
@@ -846,6 +846,9 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
 						      &symlink_err);
 
 		if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
+			struct symlink_reparse_struct
+				*lnk = &symlink_err->parsed.lnk;
+			size_t unparsed = lnk->unparsed_path_length;
 			size_t name_in_len, dirname_len;
 
 			name_in_len = strlen(name_in);
@@ -853,7 +856,14 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
 
 			SMB_ASSERT(name_in_len >= dirname_len);
 
-			symlink_err->unparsed += (name_in_len - dirname_len);
+			unparsed += (name_in_len - dirname_len);
+
+			if (unparsed > UINT16_MAX) {
+				status = NT_STATUS_BUFFER_OVERFLOW;
+				goto fail;
+			}
+
+			lnk->unparsed_path_length = unparsed;
 			*_symlink_err = symlink_err;
 
 			goto fail;
@@ -950,10 +960,10 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
 		 * Upper layers might need the link target. Here we
 		 * still have the relname around, get the symlink err.
 		 */
-		status = create_open_symlink_err(mem_ctx,
-						 smb_dirname->fsp,
-						 smb_fname_rel,
-						 &symlink_err);
+		status = read_symlink_reparse(mem_ctx,
+					      smb_dirname->fsp,
+					      smb_fname_rel,
+					      &symlink_err);
 		if (!NT_STATUS_IS_OK(status)) {
 			DBG_DEBUG("Could not read symlink for %s: %s\n",
 				  smb_fname_str_dbg(
@@ -1126,7 +1136,8 @@ NTSTATUS filename_convert_dirfsp(
 	struct files_struct **_dirfsp,
 	struct smb_filename **_smb_fname)
 {
-	struct open_symlink_err *symlink_err = NULL;
+	struct reparse_data_buffer *symlink_err = NULL;
+	struct symlink_reparse_struct *lnk = NULL;
 	NTSTATUS status;
 	char *target = NULL;
 	char *safe_target = NULL;
@@ -1161,13 +1172,14 @@ next:
 	if (!NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
 		return status;
 	}
+	lnk = &symlink_err->parsed.lnk;
 
 	/*
 	 * If we're on an MSDFS share, see if this is
 	 * an MSDFS link.
 	 */
 	if (lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&
-	    strnequal(symlink_err->reparse->substitute_name, "msdfs:", 6))
+	    strnequal(lnk->substitute_name, "msdfs:", 6))
 	{
 		TALLOC_FREE(*_smb_fname);
 		TALLOC_FREE(symlink_err);
@@ -1175,7 +1187,7 @@ next:
 	}
 
 	if (!lp_follow_symlinks(SNUM(conn))) {
-		status = (symlink_err->unparsed == 0)
+		status = (lnk->unparsed_path_length == 0)
 				 ? NT_STATUS_OBJECT_NAME_NOT_FOUND
 				 : NT_STATUS_OBJECT_PATH_NOT_FOUND;
 		TALLOC_FREE(symlink_err);
@@ -1196,8 +1208,8 @@ next:
 
 	target = symlink_target_path(mem_ctx,
 				     name_in,
-				     symlink_err->reparse->substitute_name,
-				     symlink_err->unparsed);
+				     lnk->substitute_name,
+				     lnk->unparsed_path_length);
 	if (target == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
@@ -1206,7 +1218,7 @@ next:
 					  conn->connectpath,
 					  NULL,
 					  target,
-					  symlink_err->unparsed,
+					  lnk->unparsed_path_length,
 					  &safe_target);
 	TALLOC_FREE(symlink_err);
 	if (!NT_STATUS_IS_OK(status)) {
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index ef1eb1a78a8..046b58023bd 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -733,28 +733,34 @@ NTSTATUS readlink_talloc(
 	return NT_STATUS_OK;
 }
 
-NTSTATUS read_symlink_reparse(
-	TALLOC_CTX *mem_ctx,
-	struct files_struct *dirfsp,
-	struct smb_filename *smb_relname,
-	struct symlink_reparse_struct **_symlink)
+NTSTATUS read_symlink_reparse(TALLOC_CTX *mem_ctx,
+			      struct files_struct *dirfsp,
+			      struct smb_filename *smb_relname,
+			      struct reparse_data_buffer **_reparse)
 {
-	struct symlink_reparse_struct *symlink = NULL;
+	struct reparse_data_buffer *reparse = NULL;
+	struct symlink_reparse_struct *lnk = NULL;
 	NTSTATUS status;
 
-	symlink = talloc_zero(mem_ctx, struct symlink_reparse_struct);
-	if (symlink == NULL) {
+	reparse = talloc_zero(mem_ctx, struct reparse_data_buffer);
+	if (reparse == NULL) {
 		goto nomem;
 	}
+	*reparse = (struct reparse_data_buffer){
+		.tag = IO_REPARSE_TAG_SYMLINK,
+	};
+	lnk = &reparse->parsed.lnk;
 
-	status = readlink_talloc(
-		symlink, dirfsp, smb_relname, &symlink->substitute_name);
+	status = readlink_talloc(reparse,
+				 dirfsp,
+				 smb_relname,
+				 &lnk->substitute_name);
 	if (!NT_STATUS_IS_OK(status)) {
 		DBG_DEBUG("readlink_talloc failed: %s\n", nt_errstr(status));
 		goto fail;
 	}
 
-	if (symlink->substitute_name[0] == '/') {
+	if (lnk->substitute_name[0] == '/') {
 		char *subdir_path = NULL;
 		char *abs_target_canon = NULL;
 		const char *relative = NULL;
@@ -768,9 +774,8 @@ NTSTATUS read_symlink_reparse(
 			goto nomem;
 		}
 
-		abs_target_canon =
-			canonicalize_absolute_path(talloc_tos(),
-						   symlink->substitute_name);
+		abs_target_canon = canonicalize_absolute_path(
+			talloc_tos(), lnk->substitute_name);
 		if (abs_target_canon == NULL) {
 			goto nomem;
 		}
@@ -780,25 +785,25 @@ NTSTATUS read_symlink_reparse(
 				     abs_target_canon,
 				     &relative);
 		if (in_share) {
-			TALLOC_FREE(symlink->substitute_name);
-			symlink->substitute_name =
-				talloc_strdup(symlink, relative);
-			if (symlink->substitute_name == NULL) {
+			TALLOC_FREE(lnk->substitute_name);
+			lnk->substitute_name = talloc_strdup(reparse,
+							     relative);
+			if (lnk->substitute_name == NULL) {
 				goto nomem;
 			}
 		}
 	}
 
-	if (!IS_DIRECTORY_SEP(symlink->substitute_name[0])) {
-		symlink->flags |= SYMLINK_FLAG_RELATIVE;
+	if (!IS_DIRECTORY_SEP(lnk->substitute_name[0])) {
+		lnk->flags |= SYMLINK_FLAG_RELATIVE;
 	}
 
-	*_symlink = symlink;
+	*_reparse = reparse;
 	return NT_STATUS_OK;
 nomem:
 	status = NT_STATUS_NO_MEMORY;
 fail:
-	TALLOC_FREE(symlink);
+	TALLOC_FREE(reparse);
 	return status;
 }
 
@@ -811,29 +816,6 @@ static bool full_path_extend(char **dir, const char *atname)
 	return (*dir) != NULL;
 }
 
-NTSTATUS create_open_symlink_err(TALLOC_CTX *mem_ctx,
-				 files_struct *dirfsp,
-				 struct smb_filename *smb_relname,
-				 struct open_symlink_err **_err)
-{
-	struct open_symlink_err *err = NULL;
-	NTSTATUS status;
-
-	err = talloc_zero(mem_ctx, struct open_symlink_err);
-	if (err == NULL) {
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	status = read_symlink_reparse(err, dirfsp, smb_relname, &err->reparse);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(err);
-		return status;
-	}
-
-	*_err = err;
-	return NT_STATUS_OK;
-}
-
 /*
  * Create the memcache-key for GETREALFILENAME_CACHE: This supplements
  * the stat cache for the last component to be looked up. Cache
@@ -1012,14 +994,15 @@ lookup:
 	return fd;
 }
 
-NTSTATUS openat_pathref_fsp_nosymlink(TALLOC_CTX *mem_ctx,
-				      struct connection_struct *conn,
-				      struct files_struct *in_dirfsp,
-				      const char *path_in,
-				      NTTIME twrp,
-				      bool posix,
-				      struct smb_filename **_smb_fname,
-				      struct open_symlink_err **_symlink_err)
+NTSTATUS openat_pathref_fsp_nosymlink(
+	TALLOC_CTX *mem_ctx,
+	struct connection_struct *conn,
+	struct files_struct *in_dirfsp,
+	const char *path_in,
+	NTTIME twrp,
+	bool posix,
+	struct smb_filename **_smb_fname,
+	struct reparse_data_buffer **_symlink_err)
 {
 	struct files_struct *dirfsp = in_dirfsp;
 	struct smb_filename full_fname = {
@@ -1033,7 +1016,7 @@ NTSTATUS openat_pathref_fsp_nosymlink(TALLOC_CTX *mem_ctx,
 		.flags = full_fname.flags,
 	};
 	struct smb_filename *result = NULL;
-	struct open_symlink_err *symlink_err = NULL;
+	struct reparse_data_buffer *symlink_err = NULL;
 	struct files_struct *fsp = NULL;
 	char *path = NULL, *next = NULL;
 	bool ok, is_toplevel;
@@ -1229,12 +1212,12 @@ next:
 		 * below.
 		 */
 
-		status = create_open_symlink_err(mem_ctx,
-						 dirfsp,
-						 &rel_fname,
-						 &symlink_err);
+		status = read_symlink_reparse(mem_ctx,
+					      dirfsp,
+					      &rel_fname,
+					      &symlink_err);
 		if (!NT_STATUS_IS_OK(status)) {
-			DBG_DEBUG("create_open_symlink_err failed: %s\n",
+			DBG_DEBUG("read_symlink_reparse failed: %s\n",
 				  nt_errstr(status));
 			goto fail;
 		}
@@ -1242,7 +1225,14 @@ next:
 		if (next != NULL) {
 			size_t parsed = next - path;
 			size_t len = talloc_get_size(path);
-			symlink_err->unparsed = len - parsed;
+			size_t unparsed = len - parsed;
+
+			if (unparsed > UINT16_MAX) {
+				status = NT_STATUS_BUFFER_OVERFLOW;
+				goto fail;
+			}
+			symlink_err->parsed.lnk
+				.unparsed_path_length = unparsed;
 		}
 
 		/*
@@ -1253,7 +1243,7 @@ next:
 		ret = SMB_VFS_FSTATAT(conn,
 				      dirfsp,
 				      &rel_fname,
-				      &symlink_err->st,
+				      &full_fname.st,
 				      AT_SYMLINK_NOFOLLOW);
 		if (ret == -1) {
 			status = map_nt_error_from_unix(errno);
@@ -1265,7 +1255,7 @@ next:
 			goto fail;
 		}
 
-		if (!S_ISLNK(symlink_err->st.st_ex_mode)) {
+		if (!S_ISLNK(full_fname.st.st_ex_mode)) {
 			/*
 			 * Hit a race: readlink_talloc() worked before
 			 * the fstatat(), but rel_fname changed to
@@ -1282,20 +1272,20 @@ next:
 #endif
 
 	if ((fd == -1) && (errno == ENOTDIR)) {
-		size_t parsed, len;
+		size_t parsed, len, unparsed;
 
 		/*
 		 * dirfsp does not point at a directory, try a
 		 * freadlink.
 		 */
 
-		status = create_open_symlink_err(mem_ctx,
-						 dirfsp,
-						 NULL,
-						 &symlink_err);
+		status = read_symlink_reparse(mem_ctx,
+					      dirfsp,
+					      NULL,
+					      &symlink_err);
 
 		if (!NT_STATUS_IS_OK(status)) {
-			DBG_DEBUG("create_open_symlink_err failed: %s\n",
+			DBG_DEBUG("read_symlink_reparse failed: %s\n",
 				  nt_errstr(status));
 			status = NT_STATUS_NOT_A_DIRECTORY;
 			goto fail;
@@ -1303,9 +1293,14 @@ next:
 
 		parsed = rel_fname.base_name - path;
 		len = talloc_get_size(path);
-		symlink_err->unparsed = len - parsed;
+		unparsed = len - parsed;
 
-		symlink_err->st = dirfsp->fsp_name->st;
+		if (unparsed > UINT16_MAX) {
+			status = NT_STATUS_BUFFER_OVERFLOW;
+			goto fail;
+		}
+
+		symlink_err->parsed.lnk.unparsed_path_length = unparsed;
 
 		status = NT_STATUS_STOPPED_ON_SYMLINK;
 		goto fail;
@@ -1383,14 +1378,13 @@ done:
 		 * Last component was a symlink we opened with O_PATH, fail it
 		 * here.
 		 */
-		status = create_open_symlink_err(mem_ctx,
-						 fsp,
-						 NULL,
-						 &symlink_err);
+		status = read_symlink_reparse(mem_ctx,
+					      fsp,
+					      NULL,
+					      &symlink_err);
 		if (!NT_STATUS_IS_OK(status)) {
 			return status;
 		}
-		symlink_err->st = fsp->fsp_name->st;
 
 		status = NT_STATUS_STOPPED_ON_SYMLINK;
 		goto fail;
@@ -2238,15 +2232,6 @@ void fsp_unbind_smb(struct smb_request *req, files_struct *fsp)
 
 		fsp_fullbasepath(fsp, fullpath, sizeof(fullpath));
 
-		/*
-		 * Avoid /. at the end of the path name. notify can't


-- 
Samba Shared Repository



More information about the samba-cvs mailing list