From: Volker Lendecke Date: Tue, 15 Dec 2020 16:05:34 +0000 (+0100) Subject: libsmb: Factor out cli_status_to_errno() from cli_errno() X-Git-Tag: tevent-0.11.0~378 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f877d832095fdaacd3b871966b9189faf8420f5f;p=thirdparty%2Fsamba.git libsmb: Factor out cli_status_to_errno() from cli_errno() cli_errno() calls far too many trivial but subtle functions, all referencing cli->raw_status. This might be the first step towards getting rid of that. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/libsmb/clierror.c b/source3/libsmb/clierror.c index b92b3160174..cb75878bba3 100644 --- a/source3/libsmb/clierror.c +++ b/source3/libsmb/clierror.c @@ -66,39 +66,48 @@ void cli_dos_error(struct cli_state *cli, uint8_t *eclass, uint32_t *ecode) *ecode = NT_STATUS_DOS_CODE(cli->raw_status); } +int cli_status_to_errno(NTSTATUS status) +{ + int err; + + if (NT_STATUS_IS_DOS(status)) { + uint8_t eclass = NT_STATUS_DOS_CLASS(status); + uint32_t ecode = NT_STATUS_DOS_CODE(status); + status = dos_to_ntstatus(eclass, ecode); + } + + if (NT_STATUS_EQUAL(status, NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT)) { + /* + * Legacy code from cli_errno, see Samba up to 4.13: A + * special case for this Vista error. Since its + * high-order byte isn't 0xc0, it won't match + * correctly in map_errno_from_nt_status(). + */ + err = EACCES; + } else { + err = map_errno_from_nt_status(status); + } + + DBG_NOTICE("0x%"PRIx32" -> %d\n", NT_STATUS_V(status), err); + + return err; +} /* Return a UNIX errno appropriate for the error received in the last packet. */ int cli_errno(struct cli_state *cli) { - NTSTATUS status; + bool connected; + int err; - if (cli_is_nt_error(cli)) { - status = cli_nt_error(cli); - return map_errno_from_nt_status(status); + connected = cli_state_is_connected(cli); + if (!connected) { + return EPIPE; } - if (cli_is_dos_error(cli)) { - uint8_t eclass; - uint32_t ecode; - - cli_dos_error(cli, &eclass, &ecode); - status = dos_to_ntstatus(eclass, ecode); - return map_errno_from_nt_status(status); - } - - /* - * Yuck! A special case for this Vista error. Since its high-order - * byte isn't 0xc0, it doesn't match cli_is_nt_error() above. - */ - status = cli_nt_error(cli); - if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT)) { - return EACCES; - } - - /* for other cases */ - return EINVAL; + err = cli_status_to_errno(cli->raw_status); + return err; } /* Return true if the last packet was in error */ diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index e560e6697b8..bd67e56b60f 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -203,6 +203,7 @@ NTSTATUS cli_smb(TALLOC_CTX *mem_ctx, struct cli_state *cli, NTSTATUS cli_nt_error(struct cli_state *cli); void cli_dos_error(struct cli_state *cli, uint8_t *eclass, uint32_t *ecode); +int cli_status_to_errno(NTSTATUS status); int cli_errno(struct cli_state *cli); bool cli_is_error(struct cli_state *cli); bool cli_is_nt_error(struct cli_state *cli);