mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
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@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Tue Nov 5 12:36:48 UTC 2019 on sn-devel-184
This commit is contained in:
parent
a58c93318d
commit
ff47cc661d
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user