From: Stefan Metzmacher Date: Wed, 28 Oct 2015 11:16:05 +0000 (+0100) Subject: s3:librpc: remove bigendian argument from dcerpc_pull_ncacn_packet() X-Git-Tag: samba-4.4.10~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=878f56ff3d48e401e8c7ed005b2df7f585df64c3;p=thirdparty%2Fsamba.git s3:librpc: remove bigendian argument from dcerpc_pull_ncacn_packet() We should get this from the packet itself. Signed-off-by: Stefan Metzmacher Reviewed-by: Günther Deschner Reviewed-by: Andreas Schneider (cherry picked from commit 1bfba2c5161c0e27f8c27301f258360aedf1b018) BUG: https://bugzilla.samba.org/show_bug.cgi?id=12581 smbclient fails on bad endianess when listing shares from Solaris kernel SMB server on SPARC Autobuild-User(v4-4-test): Karolin Seeger Autobuild-Date(v4-4-test): Wed Feb 15 15:14:04 CET 2017 on sn-devel-144 --- diff --git a/source3/librpc/rpc/dcerpc.h b/source3/librpc/rpc/dcerpc.h index 183801228f5..f58ef4c3bef 100644 --- a/source3/librpc/rpc/dcerpc.h +++ b/source3/librpc/rpc/dcerpc.h @@ -61,8 +61,7 @@ NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx, DATA_BLOB *blob); NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, - struct ncacn_packet *r, - bool bigendian); + struct ncacn_packet *r); NTSTATUS dcerpc_push_dcerpc_auth(TALLOC_CTX *mem_ctx, enum dcerpc_AuthType auth_type, enum dcerpc_AuthLevel auth_level, diff --git a/source3/librpc/rpc/dcerpc_helpers.c b/source3/librpc/rpc/dcerpc_helpers.c index aab43a1abd4..11b445f0fa1 100644 --- a/source3/librpc/rpc/dcerpc_helpers.c +++ b/source3/librpc/rpc/dcerpc_helpers.c @@ -88,14 +88,12 @@ NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx, * elements * @param blob The blob of data to decode * @param r An empty ncacn_packet, must not be NULL -* @param bigendian Whether the packet is bignedian encoded * * @return a NTSTATUS error code */ NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, - struct ncacn_packet *r, - bool bigendian) + struct ncacn_packet *r) { enum ndr_err_code ndr_err; struct ndr_pull *ndr; @@ -104,11 +102,12 @@ NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx, if (!ndr) { return NT_STATUS_NO_MEMORY; } - if (bigendian) { + + if (!(CVAL(ndr->data, DCERPC_DREP_OFFSET) & DCERPC_DREP_LE)) { ndr->flags |= LIBNDR_FLAG_BIGENDIAN; } - if (CVAL(blob->data, DCERPC_PFC_OFFSET) & DCERPC_PFC_FLAG_OBJECT_UUID) { + if (CVAL(ndr->data, DCERPC_PFC_OFFSET) & DCERPC_PFC_FLAG_OBJECT_UUID) { ndr->flags |= LIBNDR_FLAG_OBJECT_PRESENT; } diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c index 97f49446312..3b2eff5b8ec 100644 --- a/source3/rpc_client/cli_pipe.c +++ b/source3/rpc_client/cli_pipe.c @@ -948,8 +948,7 @@ static void rpc_api_pipe_got_pdu(struct tevent_req *subreq) status = dcerpc_pull_ncacn_packet(state->pkt, &state->incoming_frag, - state->pkt, - !state->endianess); + state->pkt); if (!NT_STATUS_IS_OK(status)) { /* * TODO: do a real async disconnect ...