LCOV - code coverage report
Current view: top level - librpc/ndr - ndr_basic.c (source / functions) Hit Total Coverage
Test: coverage report for support-claim-type-attributes 6b5c566e Lines: 585 754 77.6 %
Date: 2023-11-21 12:31:41 Functions: 106 128 82.8 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             : 
       4             :    routines for marshalling/unmarshalling basic types
       5             : 
       6             :    Copyright (C) Andrew Tridgell 2003
       7             : 
       8             :    This program is free software; you can redistribute it and/or modify
       9             :    it under the terms of the GNU General Public License as published by
      10             :    the Free Software Foundation; either version 3 of the License, or
      11             :    (at your option) any later version.
      12             : 
      13             :    This program is distributed in the hope that it will be useful,
      14             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :    GNU General Public License for more details.
      17             : 
      18             :    You should have received a copy of the GNU General Public License
      19             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      20             : */
      21             : 
      22             : #include "replace.h"
      23             : #include "system/network.h"
      24             : #include "librpc/ndr/libndr.h"
      25             : #include "lib/util/util_net.h"
      26             : #include "lib/util/debug.h"
      27             : #include "lib/util/util.h"
      28             : #include "lib/util/bytearray.h"
      29             : 
      30             : #define NDR_PULL_U16(ndr, ofs) \
      31             :         (NDR_BE(ndr) ? PULL_BE_U16(ndr->data,ofs) : PULL_LE_U16(ndr->data,ofs))
      32             : 
      33             : #define NDR_PULL_U32(ndr, ofs) \
      34             :         (NDR_BE(ndr) ? PULL_BE_U32(ndr->data,ofs) : PULL_LE_U32(ndr->data,ofs))
      35             : 
      36             : #define NDR_PULL_I32(ndr, ofs) \
      37             :         (int32_t)(NDR_BE(ndr) ? PULL_BE_U32(ndr->data,ofs) : PULL_LE_U32(ndr->data,ofs))
      38             : 
      39             : #define NDR_PULL_I64(ndr, ofs) \
      40             :         (NDR_BE(ndr) ? PULL_BE_I64((ndr)->data, (ofs)) : PULL_LE_I64((ndr)->data, (ofs)))
      41             : 
      42             : #define NDR_PUSH_U16(ndr, ofs, v) \
      43             :         do { \
      44             :                 if (NDR_BE(ndr)) { \
      45             :                         PUSH_BE_U16(ndr->data, ofs, v); \
      46             :                 } else { \
      47             :                         PUSH_LE_U16(ndr->data, ofs, v); \
      48             :                 } \
      49             :         } while (0)
      50             : 
      51             : #define NDR_PUSH_U32(ndr, ofs, v) \
      52             :         do { \
      53             :                 if (NDR_BE(ndr)) { \
      54             :                         PUSH_BE_U32(ndr->data, ofs, v); \
      55             :                 } else { \
      56             :                         PUSH_LE_U32(ndr->data, ofs, v); \
      57             :                 } \
      58             :         } while (0)
      59             : 
      60             : #define NDR_PUSH_I32(ndr, ofs, v) \
      61             :         do { \
      62             :                 if (NDR_BE(ndr)) { \
      63             :                         PUSH_BE_U32(ndr->data, ofs, v); \
      64             :                 } else { \
      65             :                         PUSH_LE_U32(ndr->data, ofs, v); \
      66             :                 } \
      67             :         } while (0)
      68             : 
      69             : #define NDR_PUSH_I64(ndr, ofs, v) \
      70             :         do { \
      71             :                 if (NDR_BE(ndr)) { \
      72             :                         PUSH_BE_I64((ndr)->data, (ofs), (v));        \
      73             :                 } else { \
      74             :                         PUSH_LE_I64((ndr)->data, (ofs), (v));        \
      75             :                 } \
      76             :         } while (0)
      77             : 
      78             : static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len);
      79             : 
      80             : /*
      81             :   check for data leaks from the server by looking for non-zero pad bytes
      82             :   these could also indicate that real structure elements have been
      83             :   mistaken for padding in the IDL
      84             : */
      85           0 : _PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
      86             : {
      87           0 :         size_t ofs2 = (ndr->offset + (n-1)) & ~(n-1);
      88           0 :         size_t i;
      89           0 :         for (i=ndr->offset;i<ofs2;i++) {
      90           0 :                 if (ndr->data[i] != 0) {
      91           0 :                         break;
      92             :                 }
      93             :         }
      94           0 :         if (i<ofs2) {
      95           0 :                 DEBUG(0,("WARNING: Non-zero padding to %zu: ", n));
      96           0 :                 for (i=ndr->offset;i<ofs2;i++) {
      97           0 :                         DEBUG(0,("%02x ", ndr->data[i]));
      98             :                 }
      99           0 :                 DEBUG(0,("\n"));
     100             :         }
     101             : 
     102           0 : }
     103             : 
     104             : /*
     105             :   parse a int8_t
     106             : */
     107   336407338 : _PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int8_t *v)
     108             : {
     109   336407338 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     110   336407338 :         NDR_PULL_NEED_BYTES(ndr, 1);
     111   336407288 :         *v = (int8_t)PULL_BE_U8(ndr->data, ndr->offset);
     112   336407288 :         ndr->offset += 1;
     113   336407288 :         return NDR_ERR_SUCCESS;
     114             : }
     115             : 
     116             : /*
     117             :   parse a uint8_t
     118             : */
     119   785307917 : _PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
     120             : {
     121   785307917 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     122   785307917 :         NDR_PULL_NEED_BYTES(ndr, 1);
     123   785307532 :         *v = PULL_BE_U8(ndr->data, ndr->offset);
     124   785307532 :         ndr->offset += 1;
     125   785307532 :         return NDR_ERR_SUCCESS;
     126             : }
     127             : 
     128             : /*
     129             :   parse a int16_t
     130             : */
     131           0 : _PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int16_t *v)
     132             : {
     133           0 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     134           0 :         NDR_PULL_ALIGN(ndr, 2);
     135           0 :         NDR_PULL_NEED_BYTES(ndr, 2);
     136           0 :         *v = (uint16_t)NDR_PULL_U16(ndr, ndr->offset);
     137           0 :         ndr->offset += 2;
     138           0 :         return NDR_ERR_SUCCESS;
     139             : }
     140             : 
     141             : /*
     142             :   parse a uint16_t
     143             : */
     144  1452062676 : _PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     145             : {
     146  1452062676 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     147  1452062676 :         NDR_PULL_ALIGN(ndr, 2);
     148  1452062676 :         NDR_PULL_NEED_BYTES(ndr, 2);
     149  1452062671 :         *v = NDR_PULL_U16(ndr, ndr->offset);
     150  1452062671 :         ndr->offset += 2;
     151  1452062671 :         return NDR_ERR_SUCCESS;
     152             : }
     153             : 
     154             : /*
     155             :   parse a uint1632_t
     156             : */
     157       52117 : _PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     158             : {
     159       52117 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     160       52117 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     161           8 :                 uint32_t v32 = 0;
     162           8 :                 enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32);
     163           8 :                 *v = v32;
     164           8 :                 if (unlikely(v32 != *v)) {
     165           0 :                         DEBUG(0,(__location__ ": non-zero upper 16 bits 0x%08"PRIx32"\n", v32));
     166           0 :                         return NDR_ERR_NDR64;
     167             :                 }
     168           0 :                 return err;
     169             :         }
     170       52109 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     171             : }
     172             : 
     173             : /*
     174             :   parse a int32_t
     175             : */
     176     2804879 : _PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int32_t *v)
     177             : {
     178     2804879 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     179     2804879 :         NDR_PULL_ALIGN(ndr, 4);
     180     2804879 :         NDR_PULL_NEED_BYTES(ndr, 4);
     181     2804879 :         *v = NDR_PULL_I32(ndr, ndr->offset);
     182     2804879 :         ndr->offset += 4;
     183     2804879 :         return NDR_ERR_SUCCESS;
     184             : }
     185             : 
     186             : /*
     187             :   parse a uint32_t
     188             : */
     189  2842976340 : _PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     190             : {
     191  2842976340 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     192  2842976340 :         NDR_PULL_ALIGN(ndr, 4);
     193  2842976340 :         NDR_PULL_NEED_BYTES(ndr, 4);
     194  2842976268 :         *v = NDR_PULL_U32(ndr, ndr->offset);
     195  2842976268 :         ndr->offset += 4;
     196  2842976268 :         return NDR_ERR_SUCCESS;
     197             : }
     198             : 
     199             : /*
     200             :   parse a arch dependent uint32/uint64
     201             : */
     202   478937474 : _PUBLIC_ enum ndr_err_code ndr_pull_uint3264(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     203             : {
     204   478937474 :         uint64_t v64 = 0;
     205     3795139 :         enum ndr_err_code err;
     206   478937474 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     207   478937474 :         if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
     208   478936874 :                 return ndr_pull_uint32(ndr, ndr_flags, v);
     209             :         }
     210         600 :         err = ndr_pull_hyper(ndr, ndr_flags, &v64);
     211         600 :         if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
     212           0 :                 return err;
     213             :         }
     214         600 :         *v = (uint32_t)v64;
     215         600 :         if (unlikely(v64 != *v)) {
     216           0 :                 DEBUG(0,(__location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
     217             :                          v64));
     218           0 :                 return ndr_pull_error(ndr, NDR_ERR_NDR64, __location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
     219             :                          v64);
     220             :         }
     221           0 :         return err;
     222             : }
     223             : 
     224             : /*
     225             :   parse a double
     226             : */
     227           0 : _PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, ndr_flags_type ndr_flags, double *v)
     228             : {
     229           0 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     230           0 :         NDR_PULL_ALIGN(ndr, 8);
     231           0 :         NDR_PULL_NEED_BYTES(ndr, 8);
     232           0 :         memcpy(v, ndr->data+ndr->offset, 8);
     233           0 :         ndr->offset += 8;
     234           0 :         return NDR_ERR_SUCCESS;
     235             : }
     236             : 
     237             : /*
     238             :   parse a pointer referent identifier stored in 2 bytes
     239             : */
     240      541680 : _PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v)
     241             : {
     242      541680 :         NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, v));
     243      541680 :         if (*v != 0) {
     244      541628 :                 ndr->ptr_count++;
     245             :         }
     246      541680 :         *(v) -= ndr->relative_rap_convert;
     247      541680 :         return NDR_ERR_SUCCESS;
     248             : }
     249             : 
     250             : /*
     251             :   parse a pointer referent identifier
     252             : */
     253    96482437 : _PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
     254             : {
     255    96482437 :         NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
     256    96482437 :         if (*v != 0) {
     257    88125861 :                 ndr->ptr_count++;
     258             :         }
     259    93875414 :         return NDR_ERR_SUCCESS;
     260             : }
     261             : 
     262             : /*
     263             :   parse a ref pointer referent identifier
     264             : */
     265       33993 : _PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
     266             : {
     267       33993 :         NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
     268             :         /* ref pointers always point to data */
     269       33993 :         *v = 1;
     270       33993 :         return NDR_ERR_SUCCESS;
     271             : }
     272             : 
     273             : /*
     274             :   parse a udlong
     275             : */
     276   375426466 : _PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     277             : {
     278   375426466 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     279   375426466 :         NDR_PULL_ALIGN(ndr, 4);
     280   375426466 :         NDR_PULL_NEED_BYTES(ndr, 8);
     281   375426458 :         *v = NDR_PULL_U32(ndr, ndr->offset);
     282   375426458 :         *v |= (uint64_t)(NDR_PULL_U32(ndr, ndr->offset+4)) << 32;
     283   375426458 :         ndr->offset += 8;
     284   375426458 :         return NDR_ERR_SUCCESS;
     285             : }
     286             : 
     287             : /*
     288             :   parse a udlongr
     289             : */
     290       14727 : _PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     291             : {
     292       14727 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     293       14727 :         NDR_PULL_ALIGN(ndr, 4);
     294       14727 :         NDR_PULL_NEED_BYTES(ndr, 8);
     295       14727 :         *v = ((uint64_t)NDR_PULL_U32(ndr, ndr->offset)) << 32;
     296       14727 :         *v |= NDR_PULL_U32(ndr, ndr->offset+4);
     297       14727 :         ndr->offset += 8;
     298       14727 :         return NDR_ERR_SUCCESS;
     299             : }
     300             : 
     301             : /*
     302             :   parse a dlong
     303             : */
     304         734 : _PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
     305             : {
     306         734 :         return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
     307             : }
     308             : 
     309             : /*
     310             :   parse a hyper
     311             : */
     312   363624041 : _PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     313             : {
     314   363624041 :         NDR_PULL_ALIGN(ndr, 8);
     315   363624041 :         if (NDR_BE(ndr)) {
     316        9253 :                 return ndr_pull_udlongr(ndr, ndr_flags, v);
     317             :         }
     318   363614788 :         return ndr_pull_udlong(ndr, ndr_flags, v);
     319             : }
     320             : 
     321             : /*
     322             :   parse an int64
     323             : */
     324         477 : _PUBLIC_ enum ndr_err_code ndr_pull_int64(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
     325             : {
     326         477 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     327         477 :         NDR_PULL_ALIGN(ndr, 8);
     328         477 :         NDR_PULL_NEED_BYTES(ndr, 8);
     329         477 :         *v = NDR_PULL_I64(ndr, ndr->offset);
     330         477 :         ndr->offset += 8;
     331         477 :         return NDR_ERR_SUCCESS;
     332             : }
     333             : 
     334             : /*
     335             :   parse a pointer
     336             : */
     337      636522 : _PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, ndr_flags_type ndr_flags, void* *v)
     338             : {
     339           0 :         uintptr_t h;
     340      636522 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     341      636522 :         NDR_PULL_ALIGN(ndr, sizeof(h));
     342      636522 :         NDR_PULL_NEED_BYTES(ndr, sizeof(h));
     343      636522 :         memcpy(&h, ndr->data+ndr->offset, sizeof(h));
     344      636522 :         ndr->offset += sizeof(h);
     345      636522 :         *v = (void *)h;
     346      636522 :         return NDR_ERR_SUCCESS;
     347             : }
     348             : 
     349             : /*
     350             :   pull a NTSTATUS
     351             : */
     352      473103 : _PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTSTATUS *status)
     353             : {
     354       28468 :         uint32_t v;
     355      473103 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     356      473103 :         NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     357      473103 :         *status = NT_STATUS(v);
     358      473103 :         return NDR_ERR_SUCCESS;
     359             : }
     360             : 
     361             : /*
     362             :   push a NTSTATUS
     363             : */
     364      918157 : _PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTSTATUS status)
     365             : {
     366      918157 :         return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
     367             : }
     368             : 
     369       26346 : _PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
     370             : {
     371       26346 :         ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
     372       26346 : }
     373             : 
     374             : /*
     375             :   pull a WERROR
     376             : */
     377      805876 : _PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, WERROR *status)
     378             : {
     379        2027 :         uint32_t v;
     380      805876 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     381      805876 :         NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     382      805876 :         *status = W_ERROR(v);
     383      805876 :         return NDR_ERR_SUCCESS;
     384             : }
     385             : 
     386             : /*
     387             :   pull a HRESULT
     388             : */
     389           8 : _PUBLIC_ enum ndr_err_code ndr_pull_HRESULT(struct ndr_pull *ndr, ndr_flags_type ndr_flags, HRESULT *status)
     390             : {
     391           8 :         uint32_t v;
     392           8 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     393           8 :         NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     394           8 :         *status = HRES_ERROR(v);
     395           8 :         return NDR_ERR_SUCCESS;
     396             : }
     397             : 
     398             : /*
     399             :   parse a uint8_t enum
     400             : */
     401   221073537 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
     402             : {
     403   221073537 :         return ndr_pull_uint8(ndr, ndr_flags, v);
     404             : }
     405             : 
     406             : /*
     407             :   parse a uint16_t enum
     408             : */
     409     1579111 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     410             : {
     411     1579111 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     412             : }
     413             : 
     414             : /*
     415             :   parse a uint1632_t enum (uint32_t on NDR64)
     416             : */
     417    73504996 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     418             : {
     419    73504996 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     420          12 :                 uint32_t v32;
     421          12 :                 NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &v32));
     422          12 :                 *v = v32;
     423          12 :                 if (v32 != *v) {
     424           0 :                         DEBUG(0,(__location__ ": non-zero upper 16 bits 0x%08"PRIx32"\n", v32));
     425           0 :                         return NDR_ERR_NDR64;
     426             :                 }
     427           0 :                 return NDR_ERR_SUCCESS;
     428             :         }
     429    73504984 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     430             : }
     431             : 
     432             : /*
     433             :   parse a uint32_t enum
     434             : */
     435   110051287 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     436             : {
     437   110051287 :         return ndr_pull_uint32(ndr, ndr_flags, v);
     438             : }
     439             : 
     440             : /*
     441             :   push a uint8_t enum
     442             : */
     443    69188842 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
     444             : {
     445    69188842 :         return ndr_push_uint8(ndr, ndr_flags, v);
     446             : }
     447             : 
     448             : /*
     449             :   push a uint16_t enum
     450             : */
     451     1499964 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     452             : {
     453     1499964 :         return ndr_push_uint16(ndr, ndr_flags, v);
     454             : }
     455             : 
     456             : /*
     457             :   push a uint32_t enum
     458             : */
     459   100547919 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     460             : {
     461   100547919 :         return ndr_push_uint32(ndr, ndr_flags, v);
     462             : }
     463             : 
     464             : /*
     465             :   push a uint1632_t enum
     466             : */
     467    61886927 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     468             : {
     469    61886927 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     470           0 :                 return ndr_push_uint32(ndr, ndr_flags, v);
     471             :         }
     472    61886927 :         return ndr_push_uint16(ndr, ndr_flags, v);
     473             : }
     474             : 
     475             : /*
     476             :   push a WERROR
     477             : */
     478     2520930 : _PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, ndr_flags_type ndr_flags, WERROR status)
     479             : {
     480     2520930 :         return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
     481             : }
     482             : 
     483       20026 : _PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
     484             : {
     485       20026 :         ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
     486       20026 : }
     487             : 
     488             : /*
     489             :   push a HRESULT
     490             : */
     491           0 : _PUBLIC_ enum ndr_err_code ndr_push_HRESULT(struct ndr_push *ndr, ndr_flags_type ndr_flags, HRESULT status)
     492             : {
     493           0 :         return ndr_push_uint32(ndr, NDR_SCALARS, HRES_ERROR_V(status));
     494             : }
     495             : 
     496           8 : _PUBLIC_ void ndr_print_HRESULT(struct ndr_print *ndr, const char *name, HRESULT r)
     497             : {
     498           8 :         ndr->print(ndr, "%-25s: %s", name, hresult_errstr(r));
     499           8 : }
     500             : 
     501             : 
     502             : /*
     503             :   parse a set of bytes
     504             : */
     505  1434432087 : _PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
     506             : {
     507  1434432087 :         NDR_PULL_NEED_BYTES(ndr, n);
     508  1434432087 :         memcpy(data, ndr->data + ndr->offset, n);
     509  1434432087 :         ndr->offset += n;
     510  1434432087 :         return NDR_ERR_SUCCESS;
     511             : }
     512             : 
     513             : /*
     514             :   pull an array of uint8
     515             : */
     516  1433532806 : _PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *data, uint32_t n)
     517             : {
     518  1433532806 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     519  1433532806 :         if (!(ndr_flags & NDR_SCALARS)) {
     520           0 :                 return NDR_ERR_SUCCESS;
     521             :         }
     522  1433532806 :         return ndr_pull_bytes(ndr, data, n);
     523             : }
     524             : 
     525             : /*
     526             :   push a int8_t
     527             : */
     528   186771236 : _PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, ndr_flags_type ndr_flags, int8_t v)
     529             : {
     530   186771236 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     531   186771236 :         NDR_PUSH_NEED_BYTES(ndr, 1);
     532   186771236 :         PUSH_BE_U8(ndr->data, ndr->offset, (uint8_t)v);
     533   186771236 :         ndr->offset += 1;
     534   186771236 :         return NDR_ERR_SUCCESS;
     535             : }
     536             : 
     537             : /*
     538             :   push a uint8_t
     539             : */
     540   800550431 : _PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
     541             : {
     542   800550431 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     543   800550431 :         NDR_PUSH_NEED_BYTES(ndr, 1);
     544   800550431 :         PUSH_BE_U8(ndr->data, ndr->offset, v);
     545   800550431 :         ndr->offset += 1;
     546   800550431 :         return NDR_ERR_SUCCESS;
     547             : }
     548             : 
     549             : /*
     550             :   push a int16_t
     551             : */
     552           0 : _PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, ndr_flags_type ndr_flags, int16_t v)
     553             : {
     554           0 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     555           0 :         NDR_PUSH_ALIGN(ndr, 2);
     556           0 :         NDR_PUSH_NEED_BYTES(ndr, 2);
     557           0 :         NDR_PUSH_U16(ndr, ndr->offset, (uint16_t)v);
     558           0 :         ndr->offset += 2;
     559           0 :         return NDR_ERR_SUCCESS;
     560             : }
     561             : 
     562             : /*
     563             :   push a uint16_t
     564             : */
     565   788827513 : _PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     566             : {
     567   788827513 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     568   794572167 :         NDR_PUSH_ALIGN(ndr, 2);
     569   788827513 :         NDR_PUSH_NEED_BYTES(ndr, 2);
     570   788827513 :         NDR_PUSH_U16(ndr, ndr->offset, v);
     571   788827513 :         ndr->offset += 2;
     572   788827513 :         return NDR_ERR_SUCCESS;
     573             : }
     574             : 
     575             : /*
     576             :   push a uint1632
     577             : */
     578           0 : _PUBLIC_ enum ndr_err_code ndr_push_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     579             : {
     580           0 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     581           0 :                 return ndr_push_uint32(ndr, ndr_flags, v);
     582             :         }
     583           0 :         return ndr_push_uint16(ndr, ndr_flags, v);
     584             : }
     585             : 
     586             : /*
     587             :   push a int32_t
     588             : */
     589     2826966 : _PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, ndr_flags_type ndr_flags, int32_t v)
     590             : {
     591     2826966 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     592     2827245 :         NDR_PUSH_ALIGN(ndr, 4);
     593     2826966 :         NDR_PUSH_NEED_BYTES(ndr, 4);
     594     2826966 :         NDR_PUSH_I32(ndr, ndr->offset, v);
     595     2826966 :         ndr->offset += 4;
     596     2826966 :         return NDR_ERR_SUCCESS;
     597             : }
     598             : 
     599             : /*
     600             :   push a uint32_t
     601             : */
     602  2303925986 : _PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     603             : {
     604  2303925986 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     605  2366018963 :         NDR_PUSH_ALIGN(ndr, 4);
     606  2303925986 :         NDR_PUSH_NEED_BYTES(ndr, 4);
     607  2303925986 :         NDR_PUSH_U32(ndr, ndr->offset, v);
     608  2303925986 :         ndr->offset += 4;
     609  2303925986 :         return NDR_ERR_SUCCESS;
     610             : }
     611             : 
     612             : /*
     613             :   push a uint3264
     614             : */
     615   666542329 : _PUBLIC_ enum ndr_err_code ndr_push_uint3264(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     616             : {
     617   666542329 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     618           0 :                 return ndr_push_hyper(ndr, ndr_flags, v);
     619             :         }
     620   666542329 :         return ndr_push_uint32(ndr, ndr_flags, v);
     621             : }
     622             : 
     623             : /*
     624             :   push a udlong
     625             : */
     626   285962323 : _PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     627             : {
     628   285962323 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     629   286634916 :         NDR_PUSH_ALIGN(ndr, 4);
     630   285962323 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     631   285962323 :         NDR_PUSH_U32(ndr, ndr->offset, (v & 0xFFFFFFFF));
     632   285962323 :         NDR_PUSH_U32(ndr, ndr->offset+4, (v>>32));
     633   285962323 :         ndr->offset += 8;
     634   285962323 :         return NDR_ERR_SUCCESS;
     635             : }
     636             : 
     637             : /*
     638             :   push a udlongr
     639             : */
     640      417372 : _PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     641             : {
     642      417372 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     643      417372 :         NDR_PUSH_ALIGN(ndr, 4);
     644      417372 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     645      417372 :         NDR_PUSH_U32(ndr, ndr->offset, (v>>32));
     646      417372 :         NDR_PUSH_U32(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
     647      417372 :         ndr->offset += 8;
     648      417372 :         return NDR_ERR_SUCCESS;
     649             : }
     650             : 
     651             : /*
     652             :   push a dlong
     653             : */
     654        1036 : _PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
     655             : {
     656        1036 :         return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
     657             : }
     658             : 
     659             : /*
     660             :   push a hyper
     661             : */
     662   274764792 : _PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     663             : {
     664   590437561 :         NDR_PUSH_ALIGN(ndr, 8);
     665   274764792 :         if (NDR_BE(ndr)) {
     666      406424 :                 return ndr_push_udlongr(ndr, NDR_SCALARS, v);
     667             :         }
     668   274358368 :         return ndr_push_udlong(ndr, NDR_SCALARS, v);
     669             : }
     670             : 
     671             : /*
     672             :   push an int64
     673             : */
     674        3226 : _PUBLIC_ enum ndr_err_code ndr_push_int64(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
     675             : {
     676        3226 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     677        4206 :         NDR_PUSH_ALIGN(ndr, 8);
     678        3226 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     679        3226 :         NDR_PUSH_I64(ndr, ndr->offset, v);
     680        3226 :         ndr->offset += 8;
     681        3226 :         return NDR_ERR_SUCCESS;
     682             : }
     683             : 
     684             : /*
     685             :   push a double
     686             : */
     687           0 : _PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, ndr_flags_type ndr_flags, double v)
     688             : {
     689           0 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     690           0 :         NDR_PUSH_ALIGN(ndr, 8);
     691           0 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     692           0 :         memcpy(ndr->data+ndr->offset, &v, 8);
     693           0 :         ndr->offset += 8;
     694           0 :         return NDR_ERR_SUCCESS;
     695             : }
     696             : 
     697             : /*
     698             :   push a pointer
     699             : */
     700      481223 : _PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, ndr_flags_type ndr_flags, void* v)
     701             : {
     702      481223 :         uintptr_t h = (intptr_t)v;
     703      481223 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     704     1437191 :         NDR_PUSH_ALIGN(ndr, sizeof(h));
     705      481223 :         NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
     706      481223 :         memcpy(ndr->data+ndr->offset, &h, sizeof(h));
     707      481223 :         ndr->offset += sizeof(h);
     708      481223 :         return NDR_ERR_SUCCESS;
     709             : }
     710             : 
     711  1074698494 : _PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
     712             : {
     713             :         /* this is a nasty hack to make pidl work with NDR64 */
     714  1074698494 :         if (size == 5) {
     715   332459549 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     716           0 :                         size = 8;
     717             :                 } else {
     718   332459549 :                         size = 4;
     719             :                 }
     720   742238945 :         } else if (size == 3) {
     721      129018 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     722           0 :                         size = 4;
     723             :                 } else {
     724      129018 :                         size = 2;
     725             :                 }
     726             :         }
     727  1144963814 :         NDR_PUSH_ALIGN(ndr, size);
     728  1061895369 :         return NDR_ERR_SUCCESS;
     729             : }
     730             : 
     731  1620207806 : _PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
     732             : {
     733             :         /* this is a nasty hack to make pidl work with NDR64 */
     734  1620207806 :         if (size == 5) {
     735   278304820 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     736           0 :                         size = 8;
     737             :                 } else {
     738   278304508 :                         size = 4;
     739             :                 }
     740  1341902986 :         } else if (size == 3) {
     741      315782 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     742           0 :                         size = 4;
     743             :                 } else {
     744      315782 :                         size = 2;
     745             :                 }
     746             :         }
     747  1620207806 :         NDR_PULL_ALIGN(ndr, size);
     748  1582656638 :         return NDR_ERR_SUCCESS;
     749             : }
     750             : 
     751   194813066 : _PUBLIC_ enum ndr_err_code ndr_push_union_align(struct ndr_push *ndr, size_t size)
     752             : {
     753             :         /* MS-RPCE section 2.2.5.3.4.4 */
     754   194813066 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     755           0 :                 return ndr_push_align(ndr, size);
     756             :         }
     757   190397359 :         return NDR_ERR_SUCCESS;
     758             : }
     759             : 
     760   703905711 : _PUBLIC_ enum ndr_err_code ndr_pull_union_align(struct ndr_pull *ndr, size_t size)
     761             : {
     762             :         /* MS-RPCE section 2.2.5.3.4.4 */
     763   703905711 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     764          76 :                 return ndr_pull_align(ndr, size);
     765             :         }
     766   683779299 :         return NDR_ERR_SUCCESS;
     767             : }
     768             : 
     769   867771737 : _PUBLIC_ enum ndr_err_code ndr_push_trailer_align(struct ndr_push *ndr, size_t size)
     770             : {
     771             :         /* MS-RPCE section 2.2.5.3.4.1 */
     772   867771737 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     773           0 :                 return ndr_push_align(ndr, size);
     774             :         }
     775   858253629 :         return NDR_ERR_SUCCESS;
     776             : }
     777             : 
     778  1281999231 : _PUBLIC_ enum ndr_err_code ndr_pull_trailer_align(struct ndr_pull *ndr, size_t size)
     779             : {
     780             :         /* MS-RPCE section 2.2.5.3.4.1 */
     781  1281999231 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     782         202 :                 return ndr_pull_align(ndr, size);
     783             :         }
     784  1252568162 :         return NDR_ERR_SUCCESS;
     785             : }
     786             : 
     787             : /*
     788             :   push some bytes
     789             : */
     790  1023537252 : _PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
     791             : {
     792  1023537252 :         if (unlikely(n == 0)) {
     793   108602448 :                 return NDR_ERR_SUCCESS;
     794             :         }
     795   911823311 :         if (unlikely(data == NULL)) {
     796           0 :                 return NDR_ERR_INVALID_POINTER;
     797             :         }
     798   911823311 :         NDR_PUSH_NEED_BYTES(ndr, n);
     799   911823309 :         memcpy(ndr->data + ndr->offset, data, n);
     800   911823309 :         ndr->offset += n;
     801   911823309 :         return NDR_ERR_SUCCESS;
     802             : }
     803             : 
     804             : /*
     805             :   push some zero bytes
     806             : */
     807    18420392 : _PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
     808             : {
     809    18420392 :         NDR_PUSH_NEED_BYTES(ndr, n);
     810    18420392 :         memset(ndr->data + ndr->offset, 0, n);
     811    18420392 :         ndr->offset += n;
     812    18420392 :         return NDR_ERR_SUCCESS;
     813             : }
     814             : 
     815             : /*
     816             :   push an array of uint8
     817             : */
     818   799832964 : _PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, const uint8_t *data, uint32_t n)
     819             : {
     820   799832964 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     821   799832964 :         if (!(ndr_flags & NDR_SCALARS)) {
     822           0 :                 return NDR_ERR_SUCCESS;
     823             :         }
     824   799832964 :         return ndr_push_bytes(ndr, data, n);
     825             : }
     826             : 
     827             : /*
     828             :   push a unique non-zero value if a pointer is non-NULL, otherwise 0
     829             : */
     830   216250122 : _PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
     831             : {
     832   216250122 :         uint32_t ptr = 0;
     833   216250122 :         if (p) {
     834   210379796 :                 ptr = ndr->ptr_count * 4;
     835   210379796 :                 ptr |= 0x00020000;
     836   210379796 :                 ndr->ptr_count++;
     837             :         }
     838   216250122 :         return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
     839             : }
     840             : 
     841             : /*
     842             :   push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
     843             : */
     844       68074 : _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
     845             : {
     846       68074 :         enum ndr_err_code ret = NDR_ERR_SUCCESS;
     847       68074 :         uint32_t ptr = 0;
     848       68074 :         if (p) {
     849             :                 /* Check if the pointer already exists and has an id */
     850       67874 :                 ret = ndr_token_peek(&ndr->full_ptr_list, p, &ptr);
     851       67874 :                 if (ret == NDR_ERR_TOKEN) {
     852       67874 :                         ndr->ptr_count++;
     853       67874 :                         ptr = ndr->ptr_count;
     854       67874 :                         ret = ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
     855       67874 :                         if (ret != NDR_ERR_SUCCESS) {
     856           0 :                                 return ret;
     857             :                         }
     858           0 :                 } else if (ret != NDR_ERR_SUCCESS) {
     859           0 :                         return ret;
     860             :                 }
     861             :         }
     862       68074 :         return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
     863             : }
     864             : 
     865             : /*
     866             :   push always a 0, if a pointer is NULL it's a fatal error
     867             : */
     868       21393 : _PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
     869             : {
     870       21393 :         return ndr_push_uint3264(ndr, NDR_SCALARS, 0xAEF1AEF1);
     871             : }
     872             : 
     873             : 
     874             : /*
     875             :   push a NTTIME
     876             : */
     877     9014777 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     878             : {
     879     9014777 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     880     9014777 :         NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
     881     8909152 :         return NDR_ERR_SUCCESS;
     882             : }
     883             : 
     884             : /*
     885             :   pull a NTTIME
     886             : */
     887     9254421 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     888             : {
     889     9254421 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     890     9254421 :         NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
     891     9183243 :         return NDR_ERR_SUCCESS;
     892             : }
     893             : 
     894             : /*
     895             :   push a NTTIME_1sec
     896             : */
     897    95468371 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     898             : {
     899    95468371 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     900    95468371 :         t /= 10000000;
     901    95468371 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
     902    93604003 :         return NDR_ERR_SUCCESS;
     903             : }
     904             : 
     905             : /*
     906             :   pull a NTTIME_1sec
     907             : */
     908   104902482 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     909             : {
     910   104902482 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     911   104902482 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
     912   104902482 :         (*t) *= 10000000;
     913   104902482 :         return NDR_ERR_SUCCESS;
     914             : }
     915             : 
     916             : /*
     917             :   pull a NTTIME_hyper
     918             : */
     919       24114 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     920             : {
     921       24114 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     922       24114 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
     923       24074 :         return NDR_ERR_SUCCESS;
     924             : }
     925             : 
     926             : /*
     927             :   push a NTTIME_hyper
     928             : */
     929       34515 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     930             : {
     931       34515 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     932       34515 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
     933       34483 :         return NDR_ERR_SUCCESS;
     934             : }
     935             : 
     936             : /*
     937             :   push a time_t
     938             : */
     939       77857 : _PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, time_t t)
     940             : {
     941       77857 :         return ndr_push_uint32(ndr, ndr_flags, t);
     942             : }
     943             : 
     944             : /*
     945             :   pull a time_t
     946             : */
     947      179596 : _PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, time_t *t)
     948             : {
     949        6201 :         uint32_t tt;
     950      179596 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
     951      179596 :         *t = tt;
     952      179596 :         return NDR_ERR_SUCCESS;
     953             : }
     954             : 
     955             : 
     956             : /*
     957             :   push a uid_t
     958             : */
     959     2367785 : _PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, uid_t u)
     960             : {
     961     2367785 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     962     2367785 :         return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
     963             : }
     964             : 
     965             : /*
     966             :   pull a uid_t
     967             : */
     968     1442776 : _PUBLIC_ enum ndr_err_code ndr_pull_uid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uid_t *u)
     969             : {
     970     1442776 :         uint64_t uu = 0;
     971     1442776 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &uu));
     972     1442776 :         *u = (uid_t)uu;
     973     1442776 :         if (unlikely(uu != *u)) {
     974           0 :                 DEBUG(0,(__location__ ": uid_t pull doesn't fit 0x%016"PRIx64"\n",
     975             :                          uu));
     976           0 :                 return NDR_ERR_NDR64;
     977             :         }
     978     1436667 :         return NDR_ERR_SUCCESS;
     979             : }
     980             : 
     981             : 
     982             : /*
     983             :   push a gid_t
     984             : */
     985     5453618 : _PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, gid_t g)
     986             : {
     987     5453618 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     988     5453618 :         return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
     989             : }
     990             : 
     991             : /*
     992             :   pull a gid_t
     993             : */
     994     3853492 : _PUBLIC_ enum ndr_err_code ndr_pull_gid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, gid_t *g)
     995             : {
     996     3853492 :         uint64_t gg = 0;
     997     3853492 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &gg));
     998     3853492 :         *g = (gid_t)gg;
     999     3853492 :         if (unlikely(gg != *g)) {
    1000           0 :                 DEBUG(0,(__location__ ": gid_t pull doesn't fit 0x%016"PRIx64"\n",
    1001             :                          gg));
    1002           0 :                 return NDR_ERR_NDR64;
    1003             :         }
    1004     3801171 :         return NDR_ERR_SUCCESS;
    1005             : }
    1006             : 
    1007             : 
    1008             : /*
    1009             :   pull a ipv4address
    1010             : */
    1011       85086 : _PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
    1012             : {
    1013         353 :         uint32_t addr;
    1014         353 :         struct in_addr in;
    1015       85086 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &addr));
    1016       85086 :         in.s_addr = htonl(addr);
    1017       85086 :         *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
    1018       85086 :         NDR_ERR_HAVE_NO_MEMORY(*address);
    1019       84733 :         return NDR_ERR_SUCCESS;
    1020             : }
    1021             : 
    1022             : /*
    1023             :   push a ipv4address
    1024             : */
    1025      161047 : _PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
    1026             : {
    1027        1868 :         uint32_t addr;
    1028      161047 :         if (!is_ipaddress_v4(address)) {
    1029          88 :                 return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
    1030             :                                       "Invalid IPv4 address: '%s'",
    1031             :                                       address);
    1032             :         }
    1033      160959 :         addr = inet_addr(address);
    1034      160959 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
    1035      159091 :         return NDR_ERR_SUCCESS;
    1036             : }
    1037             : 
    1038             : /*
    1039             :   print a ipv4address
    1040             : */
    1041         325 : _PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name,
    1042             :                            const char *address)
    1043             : {
    1044         325 :         ndr->print(ndr, "%-25s: %s", name, address);
    1045         325 : }
    1046             : 
    1047             : /*
    1048             :   pull a ipv6address
    1049             : */
    1050             : #define IPV6_BYTES 16
    1051             : #define IPV6_ADDR_STR_LEN 39
    1052       33081 : _PUBLIC_ enum ndr_err_code ndr_pull_ipv6address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
    1053             : {
    1054          12 :         uint8_t addr[IPV6_BYTES];
    1055       33081 :         char *addr_str = talloc_strdup(ndr->current_mem_ctx, "");
    1056          12 :         int i;
    1057       33081 :         NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1058       33081 :         NDR_CHECK(ndr_pull_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
    1059      562377 :         for (i = 0; i < IPV6_BYTES; ++i) {
    1060      529296 :                 addr_str = talloc_asprintf_append(addr_str, "%02x", addr[i]);
    1061      529296 :                 NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1062             :                 /* We need a ':' every second byte but the last one */
    1063      529296 :                 if (i%2 == 1 && i != (IPV6_BYTES - 1)) {
    1064      231567 :                         addr_str = talloc_strdup_append(addr_str, ":");
    1065      231675 :                         NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1066             :                 }
    1067             :         }
    1068       33081 :         *address = addr_str;
    1069       33081 :         NDR_ERR_HAVE_NO_MEMORY(*address);
    1070       33069 :         return NDR_ERR_SUCCESS;
    1071             : }
    1072             : 
    1073             : /*
    1074             :   push a ipv6address
    1075             : */
    1076       52528 : _PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
    1077             : {
    1078             : #ifdef AF_INET6
    1079         232 :         uint8_t addr[IPV6_BYTES];
    1080         232 :         int ret;
    1081             : 
    1082       52528 :         if (!is_ipaddress(address)) {
    1083         264 :                 return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS,
    1084             :                                       "Invalid IPv6 address: '%s'",
    1085             :                                       address);
    1086             :         }
    1087       52264 :         ret = inet_pton(AF_INET6, address, addr);
    1088       52264 :         if (ret <= 0) {
    1089           0 :                 return NDR_ERR_IPV6ADDRESS;
    1090             :         }
    1091             : 
    1092       52264 :         NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
    1093             : 
    1094       52032 :         return NDR_ERR_SUCCESS;
    1095             : #else
    1096             :         return NDR_ERR_IPV6ADDRESS;
    1097             : #endif
    1098             : }
    1099             : 
    1100             : /*
    1101             :   print a ipv6address
    1102             : */
    1103          69 : _PUBLIC_ void ndr_print_ipv6address(struct ndr_print *ndr, const char *name,
    1104             :                            const char *address)
    1105             : {
    1106          69 :         ndr->print(ndr, "%-25s: %s", name, address);
    1107          69 : }
    1108             : #undef IPV6_BYTES
    1109             : 
    1110     1251366 : _PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
    1111             : {
    1112     1251366 :         ndr->print(ndr, "%s: struct %s", name, type);
    1113     1251366 : }
    1114             : 
    1115           0 : _PUBLIC_ void ndr_print_null(struct ndr_print *ndr)
    1116             : {
    1117           0 :         ndr->print(ndr, "UNEXPECTED NULL POINTER");
    1118           0 : }
    1119             : 
    1120      264178 : _PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
    1121             :                     const char *val, uint32_t value)
    1122             : {
    1123      264178 :         if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
    1124      213812 :                 ndr->print(ndr, "%-25s: %s (0x%"PRIX32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
    1125             :         } else {
    1126       50415 :                 ndr->print(ndr, "%-25s: %s (%"PRIu32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
    1127             :         }
    1128      264178 : }
    1129             : 
    1130      550669 : _PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
    1131             : {
    1132      550669 :         if (flag == 0) {
    1133          88 :                 return;
    1134             :         }
    1135             : 
    1136             :         /* this is an attempt to support multi-bit bitmap masks */
    1137      550581 :         value &= flag;
    1138             : 
    1139     5090100 :         while (!(flag & 1)) {
    1140     4539519 :                 flag >>= 1;
    1141     4539519 :                 value >>= 1;
    1142             :         }
    1143      550581 :         if (flag == 1) {
    1144      524554 :                 ndr->print(ndr, "   %"PRIu32": %-25s", value, flag_name);
    1145             :         } else {
    1146       26027 :                 ndr->print(ndr, "0x%02"PRIx32": %-25s (%"PRIu32")", value, flag_name, value);
    1147             :         }
    1148             : }
    1149             : 
    1150           0 : _PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
    1151             : {
    1152           0 :         if (NDR_HIDE_SECRET(ndr)) {
    1153           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1154           0 :                 return;
    1155             :         }
    1156           0 :         ndr->print(ndr, "%-25s: %"PRId8, name, v);
    1157             : }
    1158             : 
    1159      487308 : _PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
    1160             : {
    1161      487308 :         if (NDR_HIDE_SECRET(ndr)) {
    1162           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1163           0 :                 return;
    1164             :         }
    1165      487308 :         ndr->print(ndr, "%-25s: 0x%02"PRIx8" (%"PRIu8")", name, v, v);
    1166             : }
    1167             : 
    1168           0 : _PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
    1169             : {
    1170           0 :         if (NDR_HIDE_SECRET(ndr)) {
    1171           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1172           0 :                 return;
    1173             :         }
    1174           0 :         ndr->print(ndr, "%-25s: %"PRId16, name, v);
    1175             : }
    1176             : 
    1177      141385 : _PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
    1178             : {
    1179      141385 :         if (NDR_HIDE_SECRET(ndr)) {
    1180           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1181           0 :                 return;
    1182             :         }
    1183      141385 :         ndr->print(ndr, "%-25s: 0x%04"PRIx16" (%"PRIu16")", name, v, v);
    1184             : }
    1185             : 
    1186          10 : _PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
    1187             : {
    1188          10 :         if (NDR_HIDE_SECRET(ndr)) {
    1189           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1190           0 :                 return;
    1191             :         }
    1192          10 :         ndr->print(ndr, "%-25s: %"PRId32, name, v);
    1193             : }
    1194             : 
    1195      943715 : _PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
    1196             : {
    1197      943715 :         if (NDR_HIDE_SECRET(ndr)) {
    1198           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1199           0 :                 return;
    1200             :         }
    1201      943715 :         ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
    1202             : }
    1203             : 
    1204           0 : _PUBLIC_ void ndr_print_int3264(struct ndr_print *ndr, const char *name, int32_t v)
    1205             : {
    1206           0 :         if (NDR_HIDE_SECRET(ndr)) {
    1207           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1208           0 :                 return;
    1209             :         }
    1210           0 :         ndr->print(ndr, "%-25s: %"PRId32, name, v);
    1211             : }
    1212             : 
    1213         696 : _PUBLIC_ void ndr_print_uint3264(struct ndr_print *ndr, const char *name, uint32_t v)
    1214             : {
    1215         696 :         if (NDR_HIDE_SECRET(ndr)) {
    1216           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1217           0 :                 return;
    1218             :         }
    1219         696 :         ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
    1220             : }
    1221             : 
    1222          24 : _PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
    1223             : {
    1224          24 :         ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRIu64")", name, v, v);
    1225          24 : }
    1226             : 
    1227           0 : _PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
    1228             : {
    1229           0 :         ndr_print_udlong(ndr, name, v);
    1230           0 : }
    1231             : 
    1232      221021 : _PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
    1233             : {
    1234      221021 :         if (NDR_HIDE_SECRET(ndr)) {
    1235           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1236           0 :                 return;
    1237             :         }
    1238      221021 :         ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRId64")", name, v, v);
    1239             : }
    1240             : 
    1241           0 : _PUBLIC_ void ndr_print_double(struct ndr_print *ndr, const char *name, double v)
    1242             : {
    1243           0 :         ndr->print(ndr, "%-25s: %f", name, v);
    1244           0 : }
    1245             : 
    1246      221013 : _PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
    1247             : {
    1248      221013 :         ndr_print_dlong(ndr, name, v);
    1249      221013 : }
    1250             : 
    1251           0 : _PUBLIC_ void ndr_print_int64(struct ndr_print *ndr, const char *name, int64_t v)
    1252             : {
    1253           0 :         ndr_print_dlong(ndr, name, v);
    1254           0 : }
    1255             : 
    1256           0 : _PUBLIC_ void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
    1257             : {
    1258           0 :         ndr->print(ndr, "%-25s: %p", name, v);
    1259           0 : }
    1260             : 
    1261      648362 : _PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
    1262             : {
    1263      648362 :         if (p) {
    1264      621823 :                 ndr->print(ndr, "%-25s: *", name);
    1265             :         } else {
    1266       26539 :                 ndr->print(ndr, "%-25s: NULL", name);
    1267             :         }
    1268      648362 : }
    1269             : 
    1270      245274 : _PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
    1271             : {
    1272      245274 :         ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
    1273      245274 : }
    1274             : 
    1275      213396 : _PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
    1276             : {
    1277             :         /* this is a standard NTTIME here
    1278             :          * as it's already converted in the pull/push code
    1279             :          */
    1280      213396 :         ndr_print_NTTIME(ndr, name, t);
    1281      213396 : }
    1282             : 
    1283         136 : _PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
    1284             : {
    1285         136 :         ndr_print_NTTIME(ndr, name, t);
    1286         136 : }
    1287             : 
    1288        3438 : _PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
    1289             : {
    1290        3438 :         if (t == (time_t)-1 || t == 0) {
    1291        3420 :                 ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t);
    1292             :         } else {
    1293          18 :                 ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t));
    1294             :         }
    1295        3438 : }
    1296             : 
    1297           0 : _PUBLIC_ void ndr_print_uid_t(struct ndr_print *ndr, const char *name, uid_t u)
    1298             : {
    1299           0 :         ndr_print_dlong(ndr, name, u);
    1300           0 : }
    1301             : 
    1302           0 : _PUBLIC_ void ndr_print_gid_t(struct ndr_print *ndr, const char *name, gid_t g)
    1303             : {
    1304           0 :         ndr_print_dlong(ndr, name, g);
    1305           0 : }
    1306             : 
    1307       28666 : _PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
    1308             : {
    1309       28666 :         if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
    1310          89 :                 ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
    1311             :         } else {
    1312       28577 :                 ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
    1313             :         }
    1314       28666 : }
    1315             : 
    1316           0 : _PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
    1317             : {
    1318           0 :         ndr->print(ndr, "UNKNOWN LEVEL %"PRIu16, level);
    1319           0 : }
    1320             : 
    1321       17254 : _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
    1322             :                            const uint8_t *data, uint32_t count)
    1323             : {
    1324        2295 :         uint32_t i;
    1325             : #define _ONELINE_LIMIT 32
    1326             : 
    1327       17254 :         if (data == NULL) {
    1328           0 :                 ndr->print(ndr, "%s: ARRAY(%"PRIu32") : NULL", name, count);
    1329           0 :                 return;
    1330             :         }
    1331             : 
    1332       17254 :         if (NDR_HIDE_SECRET(ndr)) {
    1333        7771 :                 ndr->print(ndr, "%s: ARRAY(%"PRIu32"): <REDACTED SECRET VALUES>", name, count);
    1334        7771 :                 return;
    1335             :         }
    1336             : 
    1337        9483 :         if (count <= _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
    1338             :                 char s[(_ONELINE_LIMIT + 1) * 2];
    1339       82307 :                 for (i=0;i<count;i++) {
    1340       73596 :                         snprintf(&s[i*2], 3, "%02"PRIx8, data[i]);
    1341             :                 }
    1342        8711 :                 s[i*2] = 0;
    1343        8711 :                 ndr->print(ndr, "%-25s: %s", name, s);
    1344        8711 :                 return;
    1345             :         }
    1346             : 
    1347         772 :         ndr->print(ndr, "%s: ARRAY(%"PRIu32")", name, count);
    1348         772 :         if (count > _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
    1349           8 :                 ndr_dump_data(ndr, data, count);
    1350           8 :                 return;
    1351             :         }
    1352             : 
    1353         764 :         ndr->depth++;
    1354      474632 :         for (i=0;i<count;i++) {
    1355      473868 :                 char *idx=NULL;
    1356      473868 :                 if (asprintf(&idx, "[%"PRIu32"]", i) != -1) {
    1357      473868 :                         ndr_print_uint8(ndr, idx, data[i]);
    1358      473868 :                         free(idx);
    1359             :                 }
    1360             :         }
    1361         764 :         ndr->depth--;
    1362             : #undef _ONELINE_LIMIT
    1363             : }
    1364             : 
    1365    33014240 : static void ndr_print_dump_data_cb(const char *buf, void *private_data)
    1366             : {
    1367    33014240 :         struct ndr_print *ndr = (struct ndr_print *)private_data;
    1368             : 
    1369    33014240 :         ndr->print(ndr, "%s", buf);
    1370    33014240 : }
    1371             : 
    1372             : /*
    1373             :   ndr_print version of dump_data()
    1374             :  */
    1375      192220 : static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len)
    1376             : {
    1377      192220 :         if (NDR_HIDE_SECRET(ndr)) {
    1378           6 :                 return;
    1379             :         }
    1380      192214 :         ndr->no_newline = true;
    1381      192214 :         dump_data_cb(buf, len, true, ndr_print_dump_data_cb, ndr);
    1382      192214 :         ndr->no_newline = false;
    1383             : }
    1384             : 
    1385             : 
    1386      198454 : _PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
    1387             : {
    1388      198454 :         ndr->print(ndr, "%-25s: DATA_BLOB length=%zu", name, r.length);
    1389      198454 :         if (r.length) {
    1390      192212 :                 ndr_dump_data(ndr, r.data, r.length);
    1391             :         }
    1392      198454 : }
    1393             : 
    1394             : 
    1395             : /*
    1396             :  * Push a DATA_BLOB onto the wire.
    1397             :  * 1) When called with LIBNDR_FLAG_ALIGN* alignment flags set, push padding
    1398             :  *    bytes _only_. The length is determined by the alignment required and the
    1399             :  *    current ndr offset.
    1400             :  * 2) When called with the LIBNDR_FLAG_REMAINING flag, push the byte array to
    1401             :  *    the ndr buffer.
    1402             :  * 3) Otherwise, push a uint3264 length _and_ a corresponding byte array to the
    1403             :  *    ndr buffer.
    1404             :  */
    1405   160779580 : _PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, ndr_flags_type ndr_flags, DATA_BLOB blob)
    1406             : {
    1407   160779580 :         if (ndr->flags & LIBNDR_FLAG_REMAINING) {
    1408             :                 /* nothing to do */
    1409    98255305 :         } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
    1410      327764 :                 if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
    1411          64 :                         blob.length = NDR_ALIGN(ndr, 2);
    1412      327700 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
    1413      274352 :                         blob.length = NDR_ALIGN(ndr, 4);
    1414       53348 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
    1415       53348 :                         blob.length = NDR_ALIGN(ndr, 8);
    1416             :                 }
    1417      327764 :                 NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length);
    1418      327764 :                 data_blob_clear(&blob);
    1419             :         } else {
    1420    97927541 :                 NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, blob.length));
    1421             :         }
    1422   160779580 :         NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
    1423   159142939 :         return NDR_ERR_SUCCESS;
    1424             : }
    1425             : 
    1426             : /*
    1427             :  * Pull a DATA_BLOB from the wire.
    1428             :  * 1) when called with LIBNDR_FLAG_ALIGN* alignment flags set, pull padding
    1429             :  *    bytes _only_. The length is determined by the alignment required and the
    1430             :  *    current ndr offset.
    1431             :  * 2) When called with the LIBNDR_FLAG_REMAINING flag, pull all remaining bytes
    1432             :  *    from the ndr buffer.
    1433             :  * 3) Otherwise, pull a uint3264 length _and_ a corresponding byte array from the
    1434             :  *    ndr buffer.
    1435             :  */
    1436   320564391 : _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, ndr_flags_type ndr_flags, DATA_BLOB *blob)
    1437             : {
    1438   320564391 :         uint32_t length = 0;
    1439             : 
    1440   320564391 :         if (ndr->flags & LIBNDR_FLAG_REMAINING) {
    1441   210339904 :                 length = ndr->data_size - ndr->offset;
    1442   110224487 :         } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
    1443      273565 :                 if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
    1444          66 :                         length = NDR_ALIGN(ndr, 2);
    1445      273499 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
    1446      225184 :                         length = NDR_ALIGN(ndr, 4);
    1447       48315 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
    1448       48315 :                         length = NDR_ALIGN(ndr, 8);
    1449             :                 }
    1450      273565 :                 if (ndr->data_size - ndr->offset < length) {
    1451           0 :                         length = ndr->data_size - ndr->offset;
    1452             :                 }
    1453             :         } else {
    1454   109950922 :                 NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length));
    1455             :         }
    1456   320564391 :         NDR_PULL_NEED_BYTES(ndr, length);
    1457   320564389 :         *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
    1458   320564389 :         ndr->offset += length;
    1459   320564389 :         return NDR_ERR_SUCCESS;
    1460             : }
    1461             : 
    1462    93041487 : _PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, ndr_flags_type flags)
    1463             : {
    1464    93041487 :         if (!data) return ret;
    1465    93041486 :         return ret + data->length;
    1466             : }
    1467             : 
    1468           0 : _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
    1469             : {
    1470           0 :         ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
    1471           0 : }
    1472             : 
    1473   345854362 : _PUBLIC_ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
    1474             : {
    1475   345854362 :         switch (ndr_err) {
    1476   345854254 :         case NDR_ERR_SUCCESS:
    1477   345854268 :                 return NT_STATUS_OK;
    1478          14 :         case NDR_ERR_BUFSIZE:
    1479          14 :                 return NT_STATUS_BUFFER_TOO_SMALL;
    1480           0 :         case NDR_ERR_TOKEN:
    1481           0 :                 return NT_STATUS_INTERNAL_ERROR;
    1482           0 :         case NDR_ERR_ALLOC:
    1483           0 :                 return NT_STATUS_NO_MEMORY;
    1484           0 :         case NDR_ERR_ARRAY_SIZE:
    1485           0 :                 return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
    1486           2 :         case NDR_ERR_INVALID_POINTER:
    1487           2 :                 return NT_STATUS_INVALID_PARAMETER_MIX;
    1488           0 :         case NDR_ERR_UNREAD_BYTES:
    1489           0 :                 return NT_STATUS_PORT_MESSAGE_TOO_LONG;
    1490          92 :         default:
    1491          92 :                 break;
    1492             :         }
    1493             : 
    1494             :         /* we should map all error codes to different status codes */
    1495          92 :         return NT_STATUS_INVALID_PARAMETER;
    1496             : }
    1497             : 
    1498           0 : _PUBLIC_ int ndr_map_error2errno(enum ndr_err_code ndr_err)
    1499             : {
    1500           0 :         switch (ndr_err) {
    1501           0 :         case NDR_ERR_SUCCESS:
    1502           0 :                 return 0;
    1503           0 :         case NDR_ERR_BUFSIZE:
    1504           0 :                 return ENOSPC;
    1505           0 :         case NDR_ERR_TOKEN:
    1506           0 :                 return EINVAL;
    1507           0 :         case NDR_ERR_ALLOC:
    1508           0 :                 return ENOMEM;
    1509           0 :         case NDR_ERR_ARRAY_SIZE:
    1510           0 :                 return EMSGSIZE;
    1511           0 :         case NDR_ERR_INVALID_POINTER:
    1512           0 :                 return EINVAL;
    1513           0 :         case NDR_ERR_UNREAD_BYTES:
    1514           0 :                 return EOVERFLOW;
    1515           0 :         default:
    1516           0 :                 break;
    1517             :         }
    1518             : 
    1519             :         /* we should map all error codes to different status codes */
    1520           0 :         return EINVAL;
    1521             : }
    1522             : 
    1523        6720 : _PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
    1524             :                                              ndr_flags_type ndr_flags,
    1525             :                                              const struct timespec *t)
    1526             : {
    1527        6720 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
    1528        6720 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
    1529        6720 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
    1530        6720 :         return NDR_ERR_SUCCESS;
    1531             : }
    1532             : 
    1533        2608 : _PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
    1534             :                                              ndr_flags_type ndr_flags,
    1535             :                                              struct timespec *t)
    1536             : {
    1537        2608 :         uint64_t secs = 0;
    1538        2608 :         uint32_t nsecs = 0;
    1539        2608 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
    1540        2608 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
    1541        2608 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
    1542        2608 :         t->tv_sec = secs;
    1543        2608 :         t->tv_nsec = nsecs;
    1544        2608 :         return NDR_ERR_SUCCESS;
    1545             : }
    1546             : 
    1547           0 : _PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
    1548             :                                  const struct timespec *t)
    1549             : {
    1550           0 :         char *str = timestring(ndr, t->tv_sec);
    1551           0 :         ndr->print(ndr, "%-25s: %s.%ld", name, str, t->tv_nsec);
    1552           0 :         TALLOC_FREE(str);
    1553           0 : }
    1554             : 
    1555      887248 : _PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
    1556             :                                             ndr_flags_type ndr_flags,
    1557             :                                             const struct timeval *t)
    1558             : {
    1559      887248 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
    1560      887248 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
    1561      887248 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
    1562      885080 :         return NDR_ERR_SUCCESS;
    1563             : }
    1564             : 
    1565     1907714 : _PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
    1566             :                                             ndr_flags_type ndr_flags,
    1567             :                                             struct timeval *t)
    1568             : {
    1569     1907714 :         uint64_t secs = 0;
    1570     1907714 :         uint32_t usecs = 0;
    1571     1907714 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
    1572     1907714 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
    1573     1907714 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
    1574     1907714 :         t->tv_sec = secs;
    1575     1907714 :         t->tv_usec = usecs;
    1576     1907714 :         return NDR_ERR_SUCCESS;
    1577             : }
    1578             : 
    1579           0 : _PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
    1580             :                                 const struct timeval *t)
    1581             : {
    1582           0 :         ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
    1583           0 :                    (long)t->tv_usec);
    1584           0 : }
    1585             : 
    1586          26 : _PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name,
    1587             :                                        libndr_flags flags)
    1588             : {
    1589          26 :         ndr->print(ndr, "%-25s: 0x%016"PRI_LIBNDR_FLAGS" (%"PRI_LIBNDR_FLAGS_DECIMAL")", name, flags, flags);
    1590          26 : }

Generated by: LCOV version 1.14