From 95fcd43555ef9007939b8b0ddb46d5a80336afe7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 31 Oct 2019 14:38:35 -0700 Subject: [PATCH] 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 --- source3/libsmb/libsmb_dir.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) 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 { -- 2.24.0.rc1.363.gb1bccd3e3d-goog