[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Tue Nov 5 12:37:04 UTC 2019


The branch, master has been updated
       via  ff47cc661d4 s3: libsmb: Ensure return from net_share_enum_rpc() sets cli->raw_status on error.
      from  a58c93318d5 s3:libads: Fix mem leak in ads_create_machine_acct

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


- Log -----------------------------------------------------------------
commit ff47cc661d432a9337ade9a232a4f49164652812
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Oct 31 14:38:35 2019 -0700

    s3: libsmb: Ensure return from net_share_enum_rpc() sets cli->raw_status on error.
    
    Convert net_share_enum_rpc() to return an NTSTATUS and ensure the
    status is set correctly on error so SMBC_errno() can return it.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14176
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
    Autobuild-Date(master): Tue Nov  5 12:36:48 UTC 2019 on sn-devel-184

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

Summary of changes:
 source3/libsmb/libsmb_dir.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c
index 851be5de8ff..8eecde0668e 100644
--- a/source3/libsmb/libsmb_dir.c
+++ b/source3/libsmb/libsmb_dir.c
@@ -351,7 +351,7 @@ dir_list_fn(const char *mnt,
 	return NT_STATUS_OK;
 }
 
-static int
+static NTSTATUS
 net_share_enum_rpc(struct cli_state *cli,
                    void (*fn)(const char *name,
                               uint32_t type,
@@ -378,7 +378,7 @@ net_share_enum_rpc(struct cli_state *cli,
 					     &pipe_hnd);
         if (!NT_STATUS_IS_OK(nt_status)) {
                 DEBUG(1, ("net_share_enum_rpc pipe open fail!\n"));
-                return -1;
+		goto done;
         }
 
 	ZERO_STRUCT(info_ctr);
@@ -401,18 +401,18 @@ net_share_enum_rpc(struct cli_state *cli,
         /* Was it successful? */
 	if (!NT_STATUS_IS_OK(nt_status)) {
                 /*  Nope.  Go clean up. */
-		result = ntstatus_to_werror(nt_status);
 		goto done;
 	}
 
 	if (!W_ERROR_IS_OK(result)) {
                 /*  Nope.  Go clean up. */
+		nt_status = werror_to_ntstatus(result);
 		goto done;
         }
 
 	if (total_entries == 0) {
                 /*  Nope.  Go clean up. */
-		result = WERR_GEN_FAILURE;
+		nt_status = NT_STATUS_NOT_FOUND;
 		goto done;
 	}
 
@@ -437,7 +437,7 @@ done:
         TALLOC_FREE(pipe_hnd);
 
         /* Tell 'em if it worked */
-        return W_ERROR_IS_OK(result) ? 0 : -1;
+        return nt_status;
 }
 
 
@@ -826,7 +826,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
 				}
 			} else if (srv ||
                                    (resolve_name(server, &rem_ss, 0x20, false))) {
-				int rc;
+				NTSTATUS status;
 
                                 /*
                                  * If we hadn't found the server, get one now
@@ -853,27 +853,38 @@ SMBC_opendir_ctx(SMBCCTX *context,
 
                                 /* List the shares ... */
 
-				rc = net_share_enum_rpc(srv->cli,
+				status = net_share_enum_rpc(srv->cli,
 							list_fn,
 							(void *)dir);
-				if (rc != 0 &&
+				if (!NT_STATUS_IS_OK(status) &&
 				    smbXcli_conn_protocol(srv->cli->conn) <=
 						PROTOCOL_NT1) {
 					/*
 					 * Only call cli_RNetShareEnum()
 					 * on SMB1 connections, not SMB2+.
 					 */
-					rc = cli_RNetShareEnum(srv->cli,
+					int rc = cli_RNetShareEnum(srv->cli,
 							       list_fn,
 							       (void *)dir);
+					if (rc != 0) {
+						status = cli_nt_error(srv->cli);
+					} else {
+						status = NT_STATUS_OK;
+					}
 				}
-				if (rc != 0) {
-					errno = cli_errno(srv->cli);
+				if (!NT_STATUS_IS_OK(status)) {
+					/*
+					 * Set cli->raw_status so SMBC_errno()
+					 * will correctly return the error.
+					 */
+					srv->cli->raw_status = status;
 					if (dir != NULL) {
 						SAFE_FREE(dir->fname);
 						SAFE_FREE(dir);
 					}
 					TALLOC_FREE(frame);
+					errno = map_errno_from_nt_status(
+								status);
 					return NULL;
 				}
                         } else {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list