added a smb.conf flag "rpc big endian" that tells our rpc server to
[samba.git] / source4 / rpc_server / dcesrv_auth.c
index 0f4b22ee3d068a68d260d0ae8d14e5b7c9efd6ed..776d394e99a8f71deda14345adea3149743414c6 100644 (file)
@@ -184,6 +184,10 @@ BOOL dcesrv_auth_request(struct dcesrv_call_state *call)
                return False;
        }
 
+       if (!(pkt->drep[0] & DCERPC_DREP_LE)) {
+               ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
+       }
+
        status = ndr_pull_dcerpc_auth(ndr, NDR_SCALARS|NDR_BUFFERS, &auth);
        if (!NT_STATUS_IS_OK(status)) {
                return False;
@@ -232,7 +236,7 @@ BOOL dcesrv_auth_response(struct dcesrv_call_state *call,
 
        /* non-signed packets are simple */
        if (!dce->auth_state.auth_info || !dce->auth_state.ntlmssp_state) {
-               status = dcerpc_push_auth(blob, call->mem_ctx, pkt, NULL, 0);
+               status = dcerpc_push_auth(blob, call->mem_ctx, pkt, NULL);
                return NT_STATUS_IS_OK(status);
        }
 
@@ -241,6 +245,10 @@ BOOL dcesrv_auth_response(struct dcesrv_call_state *call,
                return False;
        }
 
+       if (pkt->drep[0] & DCERPC_DREP_LE) {
+               ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
+       }
+
        status = ndr_push_dcerpc_packet(ndr, NDR_SCALARS|NDR_BUFFERS, pkt);
        if (!NT_STATUS_IS_OK(status)) {
                return False;
@@ -286,8 +294,8 @@ BOOL dcesrv_auth_response(struct dcesrv_call_state *call,
        /* fill in the fragment length and auth_length, we can't fill
           in these earlier as we don't know the signature length (it
           could be variable length) */
-       SSVAL(blob->data,  DCERPC_FRAG_LEN_OFFSET, blob->length);
-       SSVAL(blob->data,  DCERPC_AUTH_LEN_OFFSET, dce->auth_state.auth_info->credentials.length);
+       dcerpc_set_frag_length(blob, blob->length);
+       dcerpc_set_auth_length(blob, dce->auth_state.auth_info->credentials.length);
 
        data_blob_free(&dce->auth_state.auth_info->credentials);