15772Sas200622 /* 25772Sas200622 * CDDL HEADER START 35772Sas200622 * 45772Sas200622 * The contents of this file are subject to the terms of the 55772Sas200622 * Common Development and Distribution License (the "License"). 65772Sas200622 * You may not use this file except in compliance with the License. 75772Sas200622 * 85772Sas200622 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95772Sas200622 * or http://www.opensolaris.org/os/licensing. 105772Sas200622 * See the License for the specific language governing permissions 115772Sas200622 * and limitations under the License. 125772Sas200622 * 135772Sas200622 * When distributing Covered Code, include this CDDL HEADER in each 145772Sas200622 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155772Sas200622 * If applicable, add the following below this CDDL HEADER, with the 165772Sas200622 * fields enclosed by brackets "[]" replaced with your own identifying 175772Sas200622 * information: Portions Copyright [yyyy] [name of copyright owner] 185772Sas200622 * 195772Sas200622 * CDDL HEADER END 205772Sas200622 */ 215772Sas200622 /* 22*9914Samw@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 235772Sas200622 * Use is subject to license terms. 245772Sas200622 */ 255772Sas200622 26*9914Samw@Sun.COM #include <assert.h> 275772Sas200622 #include <strings.h> 285772Sas200622 #include <sys/param.h> 295772Sas200622 305772Sas200622 #include <smbsrv/libsmb.h> 318334SJose.Borrego@Sun.COM #include <smbsrv/libmlrpc.h> 325772Sas200622 335772Sas200622 #ifdef _BIG_ENDIAN 348334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_BIG_ENDIAN; 355772Sas200622 #else 368334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_LITTLE_ENDIAN; 375772Sas200622 #endif 385772Sas200622 39*9914Samw@Sun.COM static int ndr_decode_hdr_common(ndr_stream_t *, ndr_common_header_t *); 40*9914Samw@Sun.COM 41*9914Samw@Sun.COM static int 42*9914Samw@Sun.COM ndr_encode_decode_common(ndr_stream_t *nds, unsigned opnum, 438334SJose.Borrego@Sun.COM ndr_typeinfo_t *ti, void *datum) 445772Sas200622 { 45*9914Samw@Sun.COM int rc; 465772Sas200622 475772Sas200622 /* 485772Sas200622 * Perform the (un)marshalling 495772Sas200622 */ 508334SJose.Borrego@Sun.COM if (ndo_operation(nds, ti, opnum, datum)) 518334SJose.Borrego@Sun.COM return (NDR_DRC_OK); 525772Sas200622 538334SJose.Borrego@Sun.COM switch (nds->error) { 545772Sas200622 case NDR_ERR_MALLOC_FAILED: 558334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_OUT_OF_MEMORY; 565772Sas200622 break; 575772Sas200622 585772Sas200622 case NDR_ERR_SWITCH_VALUE_INVALID: 598334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_PARAM_0_INVALID; 605772Sas200622 break; 615772Sas200622 625772Sas200622 case NDR_ERR_UNDERFLOW: 638334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_RECEIVED_RUNT; 645772Sas200622 break; 655772Sas200622 665772Sas200622 case NDR_ERR_GROW_FAILED: 678334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_TOO_BIG; 685772Sas200622 break; 695772Sas200622 705772Sas200622 default: 71*9914Samw@Sun.COM if (nds->m_op == NDR_M_OP_MARSHALL) 728334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_FAILED; 735772Sas200622 else 748334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_DECODE_FAILED; 755772Sas200622 break; 765772Sas200622 } 775772Sas200622 785772Sas200622 return (rc); 795772Sas200622 } 805772Sas200622 81*9914Samw@Sun.COM ndr_buf_t * 82*9914Samw@Sun.COM ndr_buf_init(ndr_typeinfo_t *ti) 83*9914Samw@Sun.COM { 84*9914Samw@Sun.COM ndr_buf_t *nbuf; 85*9914Samw@Sun.COM 86*9914Samw@Sun.COM if ((nbuf = calloc(1, sizeof (ndr_buf_t))) == NULL) 87*9914Samw@Sun.COM return (NULL); 88*9914Samw@Sun.COM 89*9914Samw@Sun.COM if ((nbuf->nb_heap = ndr_heap_create()) == NULL) { 90*9914Samw@Sun.COM free(nbuf); 91*9914Samw@Sun.COM return (NULL); 92*9914Samw@Sun.COM } 93*9914Samw@Sun.COM 94*9914Samw@Sun.COM nbuf->nb_ti = ti; 95*9914Samw@Sun.COM nbuf->nb_magic = NDR_BUF_MAGIC; 96*9914Samw@Sun.COM return (nbuf); 97*9914Samw@Sun.COM } 98*9914Samw@Sun.COM 99*9914Samw@Sun.COM void 100*9914Samw@Sun.COM ndr_buf_fini(ndr_buf_t *nbuf) 101*9914Samw@Sun.COM { 102*9914Samw@Sun.COM assert(nbuf->nb_magic == NDR_BUF_MAGIC); 103*9914Samw@Sun.COM 104*9914Samw@Sun.COM nds_destruct(&nbuf->nb_nds); 105*9914Samw@Sun.COM ndr_heap_destroy(nbuf->nb_heap); 106*9914Samw@Sun.COM nbuf->nb_magic = 0; 107*9914Samw@Sun.COM free(nbuf); 108*9914Samw@Sun.COM } 109*9914Samw@Sun.COM 110*9914Samw@Sun.COM /* 111*9914Samw@Sun.COM * Decode an NDR encoded buffer. The buffer is expected to contain 112*9914Samw@Sun.COM * a single fragment packet with a valid PDU header followed by NDR 113*9914Samw@Sun.COM * encoded data. The structure to which result points should be 114*9914Samw@Sun.COM * of the appropriate type to hold the decoded output. For example: 115*9914Samw@Sun.COM * 116*9914Samw@Sun.COM * pac_info_t info; 117*9914Samw@Sun.COM * 118*9914Samw@Sun.COM * if ((nbuf = ndr_buf_init(&TYPEINFO(ndr_pac)) != NULL) { 119*9914Samw@Sun.COM * rc = ndr_decode_buf(nbuf, opnum, data, datalen, &info); 120*9914Samw@Sun.COM * ... 121*9914Samw@Sun.COM * ndr_buf_fini(nbuf); 122*9914Samw@Sun.COM * } 123*9914Samw@Sun.COM */ 124*9914Samw@Sun.COM int 125*9914Samw@Sun.COM ndr_buf_decode(ndr_buf_t *nbuf, unsigned opnum, const char *data, 126*9914Samw@Sun.COM size_t datalen, void *result) 127*9914Samw@Sun.COM { 128*9914Samw@Sun.COM ndr_common_header_t hdr; 129*9914Samw@Sun.COM unsigned pdu_size_hint; 130*9914Samw@Sun.COM int rc; 131*9914Samw@Sun.COM 132*9914Samw@Sun.COM assert(nbuf->nb_magic == NDR_BUF_MAGIC); 133*9914Samw@Sun.COM assert(nbuf->nb_heap != NULL); 134*9914Samw@Sun.COM assert(nbuf->nb_ti != NULL); 135*9914Samw@Sun.COM 136*9914Samw@Sun.COM if (datalen < NDR_PDU_SIZE_HINT_DEFAULT) 137*9914Samw@Sun.COM pdu_size_hint = NDR_PDU_SIZE_HINT_DEFAULT; 138*9914Samw@Sun.COM else 139*9914Samw@Sun.COM pdu_size_hint = datalen; 140*9914Samw@Sun.COM 141*9914Samw@Sun.COM nds_destruct(&nbuf->nb_nds); 142*9914Samw@Sun.COM nds_initialize(&nbuf->nb_nds, pdu_size_hint, NDR_MODE_BUF_DECODE, 143*9914Samw@Sun.COM nbuf->nb_heap); 144*9914Samw@Sun.COM bcopy(data, nbuf->nb_nds.pdu_base_addr, datalen); 145*9914Samw@Sun.COM 146*9914Samw@Sun.COM rc = ndr_decode_hdr_common(&nbuf->nb_nds, &hdr); 147*9914Samw@Sun.COM if (NDR_DRC_IS_FAULT(rc)) 148*9914Samw@Sun.COM return (rc); 149*9914Samw@Sun.COM 150*9914Samw@Sun.COM if (!NDR_IS_SINGLE_FRAG(hdr.pfc_flags)) 151*9914Samw@Sun.COM return (rc); 152*9914Samw@Sun.COM 153*9914Samw@Sun.COM rc = ndr_encode_decode_common(&nbuf->nb_nds, opnum, nbuf->nb_ti, 154*9914Samw@Sun.COM result); 155*9914Samw@Sun.COM return (rc); 156*9914Samw@Sun.COM } 157*9914Samw@Sun.COM 158*9914Samw@Sun.COM /* 159*9914Samw@Sun.COM * Use the receive stream to unmarshall data (NDR_MODE_CALL_RECV). 160*9914Samw@Sun.COM */ 1615772Sas200622 int 1628334SJose.Borrego@Sun.COM ndr_decode_call(ndr_xa_t *mxa, void *params) 1635772Sas200622 { 164*9914Samw@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 165*9914Samw@Sun.COM int rc; 1665772Sas200622 167*9914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_RECV)) 168*9914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 169*9914Samw@Sun.COM 170*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 171*9914Samw@Sun.COM mxa->binding->service->interface_ti, params); 1725772Sas200622 1738334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 1745772Sas200622 } 1755772Sas200622 176*9914Samw@Sun.COM /* 177*9914Samw@Sun.COM * Use the send stream to marshall data (NDR_MODE_RETURN_SEND). 178*9914Samw@Sun.COM */ 1795772Sas200622 int 1808334SJose.Borrego@Sun.COM ndr_encode_return(ndr_xa_t *mxa, void *params) 1815772Sas200622 { 182*9914Samw@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 183*9914Samw@Sun.COM int rc; 1845772Sas200622 185*9914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_SEND)) 186*9914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 187*9914Samw@Sun.COM 188*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 189*9914Samw@Sun.COM mxa->binding->service->interface_ti, params); 1905772Sas200622 1918334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 1925772Sas200622 } 1935772Sas200622 194*9914Samw@Sun.COM /* 195*9914Samw@Sun.COM * Use the send stream to marshall data (NDR_MODE_CALL_SEND). 196*9914Samw@Sun.COM */ 1975772Sas200622 int 1988334SJose.Borrego@Sun.COM ndr_encode_call(ndr_xa_t *mxa, void *params) 1995772Sas200622 { 200*9914Samw@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 201*9914Samw@Sun.COM int rc; 2025772Sas200622 203*9914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_SEND)) 204*9914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 205*9914Samw@Sun.COM 206*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 207*9914Samw@Sun.COM mxa->binding->service->interface_ti, params); 2085772Sas200622 2098334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 2105772Sas200622 } 2115772Sas200622 212*9914Samw@Sun.COM /* 213*9914Samw@Sun.COM * Use the receive stream to unmarshall data (NDR_MODE_RETURN_RECV). 214*9914Samw@Sun.COM */ 2155772Sas200622 int 2168334SJose.Borrego@Sun.COM ndr_decode_return(ndr_xa_t *mxa, void *params) 2175772Sas200622 { 218*9914Samw@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 219*9914Samw@Sun.COM int rc; 2205772Sas200622 221*9914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_RECV)) 222*9914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 223*9914Samw@Sun.COM 224*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 225*9914Samw@Sun.COM mxa->binding->service->interface_ti, params); 2265772Sas200622 2278334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 2285772Sas200622 } 2295772Sas200622 2305772Sas200622 int 2318334SJose.Borrego@Sun.COM ndr_decode_pdu_hdr(ndr_xa_t *mxa) 2325772Sas200622 { 2338334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->recv_hdr.common_hdr; 2348334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 235*9914Samw@Sun.COM int rc; 236*9914Samw@Sun.COM 237*9914Samw@Sun.COM rc = ndr_decode_hdr_common(nds, hdr); 238*9914Samw@Sun.COM if (NDR_DRC_IS_FAULT(rc)) 239*9914Samw@Sun.COM return (rc); 240*9914Samw@Sun.COM 241*9914Samw@Sun.COM /* 242*9914Samw@Sun.COM * Verify the protocol version. 243*9914Samw@Sun.COM */ 244*9914Samw@Sun.COM if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0)) 245*9914Samw@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 246*9914Samw@Sun.COM 247*9914Samw@Sun.COM mxa->ptype = hdr->ptype; 248*9914Samw@Sun.COM return (NDR_DRC_OK); 249*9914Samw@Sun.COM } 250*9914Samw@Sun.COM 251*9914Samw@Sun.COM static int 252*9914Samw@Sun.COM ndr_decode_hdr_common(ndr_stream_t *nds, ndr_common_header_t *hdr) 253*9914Samw@Sun.COM { 2545772Sas200622 int ptype; 2555772Sas200622 int rc; 2565772Sas200622 int charset; 2575772Sas200622 int byte_order; 2585772Sas200622 2598334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_UNMARSHALL) 2608334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 2615772Sas200622 2625772Sas200622 /* 2635772Sas200622 * All PDU headers are at least this big 2645772Sas200622 */ 2658334SJose.Borrego@Sun.COM rc = NDS_GROW_PDU(nds, sizeof (ndr_common_header_t), 0); 2665772Sas200622 if (!rc) 2678334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_RECEIVED_RUNT)); 2685772Sas200622 2695772Sas200622 /* 2705772Sas200622 * Peek at the first eight bytes to figure out what we're doing. 2715772Sas200622 */ 2728334SJose.Borrego@Sun.COM rc = NDS_GET_PDU(nds, 0, 8, (char *)hdr, 0, 0); 2735772Sas200622 if (!rc) 2748334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 2755772Sas200622 2765772Sas200622 /* 2775772Sas200622 * Check for ASCII as the character set. This is an ASCII 2785772Sas200622 * versus EBCDIC option and has nothing to do with Unicode. 2795772Sas200622 */ 2808334SJose.Borrego@Sun.COM charset = hdr->packed_drep.intg_char_rep & NDR_REPLAB_CHAR_MASK; 2818334SJose.Borrego@Sun.COM if (charset != NDR_REPLAB_CHAR_ASCII) 2828334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 2835772Sas200622 2845772Sas200622 /* 2855772Sas200622 * Set the byte swap flag if the PDU byte-order 2865772Sas200622 * is different from the local byte-order. 2875772Sas200622 */ 2888334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 2898334SJose.Borrego@Sun.COM nds->swap = (byte_order != ndr_native_byte_order) ? 1 : 0; 2905772Sas200622 2915772Sas200622 ptype = hdr->ptype; 2928334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 2938334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 2948334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 2955772Sas200622 } 2965772Sas200622 297*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr); 2985772Sas200622 2998334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 3005772Sas200622 } 3015772Sas200622 3025772Sas200622 /* 3038334SJose.Borrego@Sun.COM * Decode an RPC fragment header. Use ndr_decode_pdu_hdr() to process 3045772Sas200622 * the first fragment header then this function to process additional 3055772Sas200622 * fragment headers. 3065772Sas200622 */ 3075772Sas200622 void 3088334SJose.Borrego@Sun.COM ndr_decode_frag_hdr(ndr_stream_t *nds, ndr_common_header_t *hdr) 3095772Sas200622 { 3107619SJose.Borrego@Sun.COM ndr_common_header_t *tmp; 3115772Sas200622 uint8_t *pdu; 3125772Sas200622 int byte_order; 3135772Sas200622 3148334SJose.Borrego@Sun.COM pdu = (uint8_t *)nds->pdu_base_offset + nds->pdu_scan_offset; 3158334SJose.Borrego@Sun.COM bcopy(pdu, hdr, NDR_RSP_HDR_SIZE); 3165772Sas200622 3175772Sas200622 /* 3185772Sas200622 * Swap non-byte fields if the PDU byte-order 3195772Sas200622 * is different from the local byte-order. 3205772Sas200622 */ 3218334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 3225772Sas200622 3238334SJose.Borrego@Sun.COM if (byte_order != ndr_native_byte_order) { 3245772Sas200622 /*LINTED E_BAD_PTR_CAST_ALIGN*/ 3257619SJose.Borrego@Sun.COM tmp = (ndr_common_header_t *)pdu; 3265772Sas200622 3278334SJose.Borrego@Sun.COM nds_bswap(&tmp->frag_length, &hdr->frag_length, 3285772Sas200622 sizeof (WORD)); 3298334SJose.Borrego@Sun.COM nds_bswap(&tmp->auth_length, &hdr->auth_length, 3305772Sas200622 sizeof (WORD)); 3318334SJose.Borrego@Sun.COM nds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD)); 3325772Sas200622 } 3335772Sas200622 } 3345772Sas200622 3355772Sas200622 int 3368334SJose.Borrego@Sun.COM ndr_encode_pdu_hdr(ndr_xa_t *mxa) 3375772Sas200622 { 3388334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->send_hdr.common_hdr; 3398334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 3405772Sas200622 int ptype; 3415772Sas200622 int rc; 3425772Sas200622 3438334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_MARSHALL) 3448334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 3455772Sas200622 3465772Sas200622 ptype = hdr->ptype; 3478334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 3488334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 3498334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 3505772Sas200622 } 3515772Sas200622 352*9914Samw@Sun.COM rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr); 3535772Sas200622 3548334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 3555772Sas200622 } 3565772Sas200622 3575772Sas200622 /* 3585772Sas200622 * This is a hand-coded derivative of the automatically generated 3595772Sas200622 * (un)marshalling routine for bind_ack headers. bind_ack headers 3605772Sas200622 * have an interior conformant array, which is inconsistent with 3615772Sas200622 * IDL/NDR rules. 3625772Sas200622 */ 3635772Sas200622 extern struct ndr_typeinfo ndt__uchar; 3645772Sas200622 extern struct ndr_typeinfo ndt__ushort; 3655772Sas200622 extern struct ndr_typeinfo ndt__ulong; 3665772Sas200622 3678334SJose.Borrego@Sun.COM int ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref); 3688334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_bind_ack_hdr = { 3695772Sas200622 1, /* NDR version */ 3705772Sas200622 3, /* alignment */ 3715772Sas200622 NDR_F_STRUCT, /* flags */ 3728334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr, /* ndr_func */ 3735772Sas200622 68, /* pdu_size_fixed_part */ 3745772Sas200622 0, /* pdu_size_variable_part */ 3755772Sas200622 68, /* c_size_fixed_part */ 3765772Sas200622 0, /* c_size_variable_part */ 3775772Sas200622 }; 3785772Sas200622 3795772Sas200622 /* 3805772Sas200622 * [_no_reorder] 3815772Sas200622 */ 3825772Sas200622 int 3838334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref) 3845772Sas200622 { 3858334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 3867619SJose.Borrego@Sun.COM struct ndr_bind_ack_hdr *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 3877619SJose.Borrego@Sun.COM (struct ndr_bind_ack_hdr *)encl_ref->datum; 3888334SJose.Borrego@Sun.COM ndr_ref_t myref; 3895772Sas200622 unsigned long offset; 3905772Sas200622 3915772Sas200622 bzero(&myref, sizeof (myref)); 3925772Sas200622 myref.enclosing = encl_ref; 3935772Sas200622 myref.stream = encl_ref->stream; 3945772Sas200622 myref.packed_alignment = 0; 3955772Sas200622 3965772Sas200622 /* do all members in order */ 3977619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 3985772Sas200622 NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 3995772Sas200622 NDR_MEMBER(_ushort, max_recv_frag, 18UL); 4005772Sas200622 NDR_MEMBER(_ulong, assoc_group_id, 20UL); 4015772Sas200622 4025772Sas200622 /* port any is the conformant culprit */ 4035772Sas200622 offset = 24UL; 4045772Sas200622 4058334SJose.Borrego@Sun.COM switch (nds->m_op) { 4065772Sas200622 case NDR_M_OP_MARSHALL: 4075772Sas200622 val->sec_addr.length = 4085772Sas200622 strlen((char *)val->sec_addr.port_spec) + 1; 4095772Sas200622 break; 4105772Sas200622 4115772Sas200622 case NDR_M_OP_UNMARSHALL: 4125772Sas200622 break; 4135772Sas200622 4145772Sas200622 default: 4155772Sas200622 NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 4165772Sas200622 return (0); 4175772Sas200622 } 4185772Sas200622 4195772Sas200622 NDR_MEMBER(_ushort, sec_addr.length, offset); 4205772Sas200622 NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 4215772Sas200622 offset+2UL, val->sec_addr.length); 4225772Sas200622 4235772Sas200622 offset += 2; 4245772Sas200622 offset += val->sec_addr.length; 4258334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 4265772Sas200622 4278334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 4285772Sas200622 return (1); 4295772Sas200622 } 4305772Sas200622 4317619SJose.Borrego@Sun.COM /* 4327619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 4337619SJose.Borrego@Sun.COM */ 4345772Sas200622 unsigned 4358334SJose.Borrego@Sun.COM ndr_bind_ack_hdr_size(ndr_xa_t *mxa) 4365772Sas200622 { 4377619SJose.Borrego@Sun.COM ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr; 4385772Sas200622 unsigned offset; 4395772Sas200622 unsigned length; 4405772Sas200622 4415772Sas200622 /* port any is the conformant culprit */ 4425772Sas200622 offset = 24UL; 4435772Sas200622 4445772Sas200622 length = strlen((char *)bahdr->sec_addr.port_spec) + 1; 4455772Sas200622 4465772Sas200622 offset += 2; 4475772Sas200622 offset += length; 4488334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 4498334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 4505772Sas200622 return (offset); 4515772Sas200622 } 4527619SJose.Borrego@Sun.COM 4537619SJose.Borrego@Sun.COM /* 4547619SJose.Borrego@Sun.COM * This is a hand-coded derivative of the automatically generated 4557619SJose.Borrego@Sun.COM * (un)marshalling routine for alter_context_rsp headers. 4567619SJose.Borrego@Sun.COM * Alter context response headers have an interior conformant array, 4577619SJose.Borrego@Sun.COM * which is inconsistent with IDL/NDR rules. 4587619SJose.Borrego@Sun.COM */ 4598334SJose.Borrego@Sun.COM int ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref); 4608334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_alter_context_rsp_hdr = { 4617619SJose.Borrego@Sun.COM 1, /* NDR version */ 4627619SJose.Borrego@Sun.COM 3, /* alignment */ 4637619SJose.Borrego@Sun.COM NDR_F_STRUCT, /* flags */ 4648334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr, /* ndr_func */ 4657619SJose.Borrego@Sun.COM 56, /* pdu_size_fixed_part */ 4667619SJose.Borrego@Sun.COM 0, /* pdu_size_variable_part */ 4677619SJose.Borrego@Sun.COM 56, /* c_size_fixed_part */ 4687619SJose.Borrego@Sun.COM 0, /* c_size_variable_part */ 4697619SJose.Borrego@Sun.COM }; 4707619SJose.Borrego@Sun.COM 4717619SJose.Borrego@Sun.COM /* 4727619SJose.Borrego@Sun.COM * [_no_reorder] 4737619SJose.Borrego@Sun.COM */ 4747619SJose.Borrego@Sun.COM int 4758334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref) 4767619SJose.Borrego@Sun.COM { 4778334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 4787619SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 4797619SJose.Borrego@Sun.COM (ndr_alter_context_rsp_hdr_t *)encl_ref->datum; 4808334SJose.Borrego@Sun.COM ndr_ref_t myref; 4817619SJose.Borrego@Sun.COM unsigned long offset; 4827619SJose.Borrego@Sun.COM 4837619SJose.Borrego@Sun.COM bzero(&myref, sizeof (myref)); 4847619SJose.Borrego@Sun.COM myref.enclosing = encl_ref; 4857619SJose.Borrego@Sun.COM myref.stream = encl_ref->stream; 4867619SJose.Borrego@Sun.COM myref.packed_alignment = 0; 4877619SJose.Borrego@Sun.COM 4887619SJose.Borrego@Sun.COM /* do all members in order */ 4897619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 4907619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 4917619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_recv_frag, 18UL); 4927619SJose.Borrego@Sun.COM NDR_MEMBER(_ulong, assoc_group_id, 20UL); 4937619SJose.Borrego@Sun.COM 4947619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 4957619SJose.Borrego@Sun.COM 4968334SJose.Borrego@Sun.COM switch (nds->m_op) { 4977619SJose.Borrego@Sun.COM case NDR_M_OP_MARSHALL: 4987619SJose.Borrego@Sun.COM val->sec_addr.length = 0; 4997619SJose.Borrego@Sun.COM break; 5007619SJose.Borrego@Sun.COM 5017619SJose.Borrego@Sun.COM case NDR_M_OP_UNMARSHALL: 5027619SJose.Borrego@Sun.COM break; 5037619SJose.Borrego@Sun.COM 5047619SJose.Borrego@Sun.COM default: 5057619SJose.Borrego@Sun.COM NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 5067619SJose.Borrego@Sun.COM return (0); 5077619SJose.Borrego@Sun.COM } 5087619SJose.Borrego@Sun.COM 5097619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, sec_addr.length, offset); 5107619SJose.Borrego@Sun.COM NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 5117619SJose.Borrego@Sun.COM offset+2UL, val->sec_addr.length); 5127619SJose.Borrego@Sun.COM 5137619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 5148334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 5157619SJose.Borrego@Sun.COM 5168334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 5177619SJose.Borrego@Sun.COM return (1); 5187619SJose.Borrego@Sun.COM } 5197619SJose.Borrego@Sun.COM 5207619SJose.Borrego@Sun.COM /* 5217619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 5227619SJose.Borrego@Sun.COM */ 5237619SJose.Borrego@Sun.COM unsigned 5248334SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_size(void) 5257619SJose.Borrego@Sun.COM { 5267619SJose.Borrego@Sun.COM unsigned offset; 5277619SJose.Borrego@Sun.COM 5287619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 5297619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 5308334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 5318334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 5327619SJose.Borrego@Sun.COM return (offset); 5337619SJose.Borrego@Sun.COM } 534