LCOV - code coverage report
Current view: top level - librpc/ndr - ndr_basic.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 589 758 77.7 %
Date: 2024-04-21 15:09:00 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   340972854 : _PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int8_t *v)
     108             : {
     109   340972854 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     110   340972854 :         NDR_PULL_NEED_BYTES(ndr, 1);
     111   340972804 :         *v = (int8_t)PULL_BE_U8(ndr->data, ndr->offset);
     112   340972804 :         ndr->offset += 1;
     113   340972804 :         return NDR_ERR_SUCCESS;
     114             : }
     115             : 
     116             : /*
     117             :   parse a uint8_t
     118             : */
     119   794728422 : _PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
     120             : {
     121   794728422 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     122   794728422 :         NDR_PULL_NEED_BYTES(ndr, 1);
     123   794728037 :         *v = PULL_BE_U8(ndr->data, ndr->offset);
     124   794728037 :         ndr->offset += 1;
     125   794728037 :         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  1466062082 : _PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     145             : {
     146  1466062082 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     147  1466062082 :         NDR_PULL_ALIGN(ndr, 2);
     148  1466062082 :         NDR_PULL_NEED_BYTES(ndr, 2);
     149  1466062077 :         *v = NDR_PULL_U16(ndr, ndr->offset);
     150  1466062077 :         ndr->offset += 2;
     151  1466062077 :         return NDR_ERR_SUCCESS;
     152             : }
     153             : 
     154             : /*
     155             :   parse a uint1632_t
     156             : */
     157       53271 : _PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     158             : {
     159       53271 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     160       53271 :         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       53263 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     171             : }
     172             : 
     173             : /*
     174             :   parse a int32_t
     175             : */
     176     3037161 : _PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int32_t *v)
     177             : {
     178     3037161 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     179     3037161 :         NDR_PULL_ALIGN(ndr, 4);
     180     3037161 :         NDR_PULL_NEED_BYTES(ndr, 4);
     181     3037161 :         *v = NDR_PULL_I32(ndr, ndr->offset);
     182     3037161 :         ndr->offset += 4;
     183     3037161 :         return NDR_ERR_SUCCESS;
     184             : }
     185             : 
     186             : /*
     187             :   parse a uint32_t
     188             : */
     189  2889616133 : _PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     190             : {
     191  2889616133 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     192  2889616133 :         NDR_PULL_ALIGN(ndr, 4);
     193  2889616133 :         NDR_PULL_NEED_BYTES(ndr, 4);
     194  2889616061 :         *v = NDR_PULL_U32(ndr, ndr->offset);
     195  2889616061 :         ndr->offset += 4;
     196  2889616061 :         return NDR_ERR_SUCCESS;
     197             : }
     198             : 
     199             : /*
     200             :   parse a arch dependent uint32/uint64
     201             : */
     202   493547503 : _PUBLIC_ enum ndr_err_code ndr_pull_uint3264(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     203             : {
     204   493547503 :         uint64_t v64 = 0;
     205     3822282 :         enum ndr_err_code err;
     206   493547503 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     207   493547503 :         if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
     208   493546903 :                 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      547260 : _PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v)
     241             : {
     242      547260 :         NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, v));
     243      547260 :         if (*v != 0) {
     244      547191 :                 ndr->ptr_count++;
     245             :         }
     246      547260 :         *(v) -= ndr->relative_rap_convert;
     247      547260 :         return NDR_ERR_SUCCESS;
     248             : }
     249             : 
     250             : /*
     251             :   parse a pointer referent identifier
     252             : */
     253    97467570 : _PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
     254             : {
     255    97467570 :         NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
     256    97467570 :         if (*v != 0) {
     257    88856751 :                 ndr->ptr_count++;
     258             :         }
     259    94844384 :         return NDR_ERR_SUCCESS;
     260             : }
     261             : 
     262             : /*
     263             :   parse a ref pointer referent identifier
     264             : */
     265       33339 : _PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
     266             : {
     267       33339 :         NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
     268             :         /* ref pointers always point to data */
     269       33339 :         *v = 1;
     270       33339 :         return NDR_ERR_SUCCESS;
     271             : }
     272             : 
     273             : /*
     274             :   parse a udlong
     275             : */
     276   376493233 : _PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     277             : {
     278   376493233 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     279   376493233 :         NDR_PULL_ALIGN(ndr, 4);
     280   376493233 :         NDR_PULL_NEED_BYTES(ndr, 8);
     281   376493225 :         *v = NDR_PULL_U32(ndr, ndr->offset);
     282   376493225 :         *v |= (uint64_t)(NDR_PULL_U32(ndr, ndr->offset+4)) << 32;
     283   376493225 :         ndr->offset += 8;
     284   376493225 :         return NDR_ERR_SUCCESS;
     285             : }
     286             : 
     287             : /*
     288             :   parse a udlongr
     289             : */
     290       14561 : _PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     291             : {
     292       14561 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     293       14561 :         NDR_PULL_ALIGN(ndr, 4);
     294       14561 :         NDR_PULL_NEED_BYTES(ndr, 8);
     295       14561 :         *v = ((uint64_t)NDR_PULL_U32(ndr, ndr->offset)) << 32;
     296       14561 :         *v |= NDR_PULL_U32(ndr, ndr->offset+4);
     297       14561 :         ndr->offset += 8;
     298       14561 :         return NDR_ERR_SUCCESS;
     299             : }
     300             : 
     301             : /*
     302             :   parse a dlong
     303             : */
     304         730 : _PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
     305             : {
     306         730 :         return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
     307             : }
     308             : 
     309             : /*
     310             :   parse a hyper
     311             : */
     312   364451339 : _PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
     313             : {
     314   364451339 :         NDR_PULL_ALIGN(ndr, 8);
     315   364451339 :         if (NDR_BE(ndr)) {
     316        9087 :                 return ndr_pull_udlongr(ndr, ndr_flags, v);
     317             :         }
     318   364442252 :         return ndr_pull_udlong(ndr, ndr_flags, v);
     319             : }
     320             : 
     321             : /*
     322             :   parse an int64
     323             : */
     324         417 : _PUBLIC_ enum ndr_err_code ndr_pull_int64(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
     325             : {
     326         417 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     327         417 :         NDR_PULL_ALIGN(ndr, 8);
     328         417 :         NDR_PULL_NEED_BYTES(ndr, 8);
     329         417 :         *v = NDR_PULL_I64(ndr, ndr->offset);
     330         417 :         ndr->offset += 8;
     331         417 :         return NDR_ERR_SUCCESS;
     332             : }
     333             : 
     334             : /*
     335             :   parse a pointer
     336             : */
     337      642079 : _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      642079 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     341      642079 :         NDR_PULL_ALIGN(ndr, sizeof(h));
     342      642079 :         NDR_PULL_NEED_BYTES(ndr, sizeof(h));
     343      642079 :         memcpy(&h, ndr->data+ndr->offset, sizeof(h));
     344      642079 :         ndr->offset += sizeof(h);
     345      642079 :         *v = (void *)h;
     346      642079 :         return NDR_ERR_SUCCESS;
     347             : }
     348             : 
     349             : /*
     350             :   pull a NTSTATUS
     351             : */
     352      514827 : _PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTSTATUS *status)
     353             : {
     354       39869 :         uint32_t v;
     355      514827 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     356      514827 :         NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     357      514827 :         *status = NT_STATUS(v);
     358      514827 :         return NDR_ERR_SUCCESS;
     359             : }
     360             : 
     361             : /*
     362             :   push a NTSTATUS
     363             : */
     364     1042889 : _PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTSTATUS status)
     365             : {
     366     1042889 :         return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
     367             : }
     368             : 
     369       32018 : _PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
     370             : {
     371       32018 :         ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
     372       32018 : }
     373             : 
     374             : /*
     375             :   pull a WERROR
     376             : */
     377      788983 : _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      788983 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     381      788983 :         NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     382      788983 :         *status = W_ERROR(v);
     383      788983 :         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   223445885 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
     402             : {
     403   223445885 :         return ndr_pull_uint8(ndr, ndr_flags, v);
     404             : }
     405             : 
     406             : /*
     407             :   parse a uint16_t enum
     408             : */
     409     1580449 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     410             : {
     411     1580449 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     412             : }
     413             : 
     414             : /*
     415             :   parse a uint1632_t enum (uint32_t on NDR64)
     416             : */
     417    76397857 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
     418             : {
     419    76397857 :         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    76397845 :         return ndr_pull_uint16(ndr, ndr_flags, v);
     430             : }
     431             : 
     432             : /*
     433             :   parse a uint32_t enum
     434             : */
     435   109541440 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
     436             : {
     437   109541440 :         return ndr_pull_uint32(ndr, ndr_flags, v);
     438             : }
     439             : 
     440             : /*
     441             :   push a uint8_t enum
     442             : */
     443    68915563 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
     444             : {
     445    68915563 :         return ndr_push_uint8(ndr, ndr_flags, v);
     446             : }
     447             : 
     448             : /*
     449             :   push a uint16_t enum
     450             : */
     451     1495937 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     452             : {
     453     1495937 :         return ndr_push_uint16(ndr, ndr_flags, v);
     454             : }
     455             : 
     456             : /*
     457             :   push a uint32_t enum
     458             : */
     459    99275275 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     460             : {
     461    99275275 :         return ndr_push_uint32(ndr, ndr_flags, v);
     462             : }
     463             : 
     464             : /*
     465             :   push a uint1632_t enum
     466             : */
     467    64578431 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     468             : {
     469    64578431 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     470           0 :                 return ndr_push_uint32(ndr, ndr_flags, v);
     471             :         }
     472    64578431 :         return ndr_push_uint16(ndr, ndr_flags, v);
     473             : }
     474             : 
     475             : /*
     476             :   push a WERROR
     477             : */
     478     2485120 : _PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, ndr_flags_type ndr_flags, WERROR status)
     479             : {
     480     2485120 :         return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
     481             : }
     482             : 
     483       20544 : _PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
     484             : {
     485       20544 :         ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
     486       20544 : }
     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  1446487475 : _PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
     506             : {
     507  1446487475 :         NDR_PULL_NEED_BYTES(ndr, n);
     508  1446487475 :         memcpy(data, ndr->data + ndr->offset, n);
     509  1446487475 :         ndr->offset += n;
     510  1446487475 :         return NDR_ERR_SUCCESS;
     511             : }
     512             : 
     513             : /*
     514             :   pull an array of uint8
     515             : */
     516  1445610904 : _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  1445610904 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     519  1445610904 :         if (!(ndr_flags & NDR_SCALARS)) {
     520           0 :                 return NDR_ERR_SUCCESS;
     521             :         }
     522  1445610904 :         return ndr_pull_bytes(ndr, data, n);
     523             : }
     524             : 
     525             : /*
     526             :   push a int8_t
     527             : */
     528   188117543 : _PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, ndr_flags_type ndr_flags, int8_t v)
     529             : {
     530   188117543 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     531   188117543 :         NDR_PUSH_NEED_BYTES(ndr, 1);
     532   188117543 :         PUSH_BE_U8(ndr->data, ndr->offset, (uint8_t)v);
     533   188117543 :         ndr->offset += 1;
     534   188117543 :         return NDR_ERR_SUCCESS;
     535             : }
     536             : 
     537             : /*
     538             :   push a uint8_t
     539             : */
     540   798185428 : _PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
     541             : {
     542   798185428 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     543   798185428 :         NDR_PUSH_NEED_BYTES(ndr, 1);
     544   798185428 :         PUSH_BE_U8(ndr->data, ndr->offset, v);
     545   798185428 :         ndr->offset += 1;
     546   798185428 :         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   790079140 : _PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
     566             : {
     567   790079140 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     568   795774343 :         NDR_PUSH_ALIGN(ndr, 2);
     569   790079140 :         NDR_PUSH_NEED_BYTES(ndr, 2);
     570   790079140 :         NDR_PUSH_U16(ndr, ndr->offset, v);
     571   790079140 :         ndr->offset += 2;
     572   790079140 :         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     3074198 : _PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, ndr_flags_type ndr_flags, int32_t v)
     590             : {
     591     3074198 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     592     3074477 :         NDR_PUSH_ALIGN(ndr, 4);
     593     3074198 :         NDR_PUSH_NEED_BYTES(ndr, 4);
     594     3074198 :         NDR_PUSH_I32(ndr, ndr->offset, v);
     595     3074198 :         ndr->offset += 4;
     596     3074198 :         return NDR_ERR_SUCCESS;
     597             : }
     598             : 
     599             : /*
     600             :   push a uint32_t
     601             : */
     602  2318099132 : _PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     603             : {
     604  2318099132 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     605  2379482778 :         NDR_PUSH_ALIGN(ndr, 4);
     606  2318099132 :         NDR_PUSH_NEED_BYTES(ndr, 4);
     607  2318099132 :         NDR_PUSH_U32(ndr, ndr->offset, v);
     608  2318099132 :         ndr->offset += 4;
     609  2318099132 :         return NDR_ERR_SUCCESS;
     610             : }
     611             : 
     612             : /*
     613             :   push a uint3264
     614             : */
     615   671572195 : _PUBLIC_ enum ndr_err_code ndr_push_uint3264(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
     616             : {
     617   671572195 :         if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
     618           0 :                 return ndr_push_hyper(ndr, ndr_flags, v);
     619             :         }
     620   671572195 :         return ndr_push_uint32(ndr, ndr_flags, v);
     621             : }
     622             : 
     623             : /*
     624             :   push a udlong
     625             : */
     626   285926807 : _PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     627             : {
     628   285926807 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     629   286603322 :         NDR_PUSH_ALIGN(ndr, 4);
     630   285926807 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     631   285926807 :         NDR_PUSH_U32(ndr, ndr->offset, (v & 0xFFFFFFFF));
     632   285926807 :         NDR_PUSH_U32(ndr, ndr->offset+4, (v>>32));
     633   285926807 :         ndr->offset += 8;
     634   285926807 :         return NDR_ERR_SUCCESS;
     635             : }
     636             : 
     637             : /*
     638             :   push a udlongr
     639             : */
     640      415572 : _PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     641             : {
     642      415572 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     643      415572 :         NDR_PUSH_ALIGN(ndr, 4);
     644      415572 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     645      415572 :         NDR_PUSH_U32(ndr, ndr->offset, (v>>32));
     646      415572 :         NDR_PUSH_U32(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
     647      415572 :         ndr->offset += 8;
     648      415572 :         return NDR_ERR_SUCCESS;
     649             : }
     650             : 
     651             : /*
     652             :   push a dlong
     653             : */
     654        1020 : _PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
     655             : {
     656        1020 :         return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
     657             : }
     658             : 
     659             : /*
     660             :   push a hyper
     661             : */
     662   274685751 : _PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
     663             : {
     664   585844322 :         NDR_PUSH_ALIGN(ndr, 8);
     665   274685751 :         if (NDR_BE(ndr)) {
     666      404624 :                 return ndr_push_udlongr(ndr, NDR_SCALARS, v);
     667             :         }
     668   274281127 :         return ndr_push_udlong(ndr, NDR_SCALARS, v);
     669             : }
     670             : 
     671             : /*
     672             :   push an int64
     673             : */
     674        2950 : _PUBLIC_ enum ndr_err_code ndr_push_int64(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
     675             : {
     676        2950 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     677        3930 :         NDR_PUSH_ALIGN(ndr, 8);
     678        2950 :         NDR_PUSH_NEED_BYTES(ndr, 8);
     679        2950 :         NDR_PUSH_I64(ndr, ndr->offset, v);
     680        2950 :         ndr->offset += 8;
     681        2950 :         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      485510 : _PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, ndr_flags_type ndr_flags, void* v)
     701             : {
     702      485510 :         uintptr_t h = (intptr_t)v;
     703      485510 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     704     1450046 :         NDR_PUSH_ALIGN(ndr, sizeof(h));
     705      485510 :         NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
     706      485510 :         memcpy(ndr->data+ndr->offset, &h, sizeof(h));
     707      485510 :         ndr->offset += sizeof(h);
     708      485510 :         return NDR_ERR_SUCCESS;
     709             : }
     710             : 
     711  1072135918 : _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  1072135918 :         if (size == 5) {
     715   327639611 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     716           0 :                         size = 8;
     717             :                 } else {
     718   327639611 :                         size = 4;
     719             :                 }
     720   744496307 :         } else if (size == 3) {
     721      130146 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     722           0 :                         size = 4;
     723             :                 } else {
     724      130146 :                         size = 2;
     725             :                 }
     726             :         }
     727  1144170629 :         NDR_PUSH_ALIGN(ndr, size);
     728  1059275118 :         return NDR_ERR_SUCCESS;
     729             : }
     730             : 
     731  1638628986 : _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  1638628986 :         if (size == 5) {
     735   280981438 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     736           0 :                         size = 8;
     737             :                 } else {
     738   280981126 :                         size = 4;
     739             :                 }
     740  1357647548 :         } else if (size == 3) {
     741      323639 :                 if (ndr->flags & LIBNDR_FLAG_NDR64) {
     742           0 :                         size = 4;
     743             :                 } else {
     744      323639 :                         size = 2;
     745             :                 }
     746             :         }
     747  1638628986 :         NDR_PULL_ALIGN(ndr, size);
     748  1601040206 :         return NDR_ERR_SUCCESS;
     749             : }
     750             : 
     751   116412492 : _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   116412492 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     755           0 :                 return ndr_push_align(ndr, size);
     756             :         }
     757   114538977 :         return NDR_ERR_SUCCESS;
     758             : }
     759             : 
     760   441416276 : _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   441416276 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     764          76 :                 return ndr_pull_align(ndr, size);
     765             :         }
     766   430797277 :         return NDR_ERR_SUCCESS;
     767             : }
     768             : 
     769   864058356 : _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   864058356 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     773           0 :                 return ndr_push_align(ndr, size);
     774             :         }
     775   854489685 :         return NDR_ERR_SUCCESS;
     776             : }
     777             : 
     778  1295851608 : _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  1295851608 :         if (ndr->flags & LIBNDR_FLAG_NDR64) {
     782         202 :                 return ndr_pull_align(ndr, size);
     783             :         }
     784  1266383403 :         return NDR_ERR_SUCCESS;
     785             : }
     786             : 
     787             : /*
     788             :   push some bytes
     789             : */
     790   915746631 : _PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
     791             : {
     792   915746631 :         if (unlikely(n == 0)) {
     793     5416324 :                 return NDR_ERR_SUCCESS;
     794             :         }
     795   910304357 :         if (unlikely(data == NULL)) {
     796           0 :                 return NDR_ERR_INVALID_POINTER;
     797             :         }
     798   910304357 :         NDR_PUSH_NEED_BYTES(ndr, n);
     799   910304355 :         memcpy(ndr->data + ndr->offset, data, n);
     800   910304355 :         ndr->offset += n;
     801   910304355 :         return NDR_ERR_SUCCESS;
     802             : }
     803             : 
     804             : /*
     805             :   push some zero bytes
     806             : */
     807    18356257 : _PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
     808             : {
     809    18356257 :         NDR_PUSH_NEED_BYTES(ndr, n);
     810    18356257 :         memset(ndr->data + ndr->offset, 0, n);
     811    18356257 :         ndr->offset += n;
     812    18356257 :         return NDR_ERR_SUCCESS;
     813             : }
     814             : 
     815             : /*
     816             :   push an array of uint8
     817             : */
     818   799867132 : _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   799867132 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     821   799867132 :         if (!(ndr_flags & NDR_SCALARS)) {
     822           0 :                 return NDR_ERR_SUCCESS;
     823             :         }
     824   799867132 :         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   213394093 : _PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
     831             : {
     832   213394093 :         uint32_t ptr = 0;
     833   213394093 :         if (p) {
     834   207387399 :                 ptr = ndr->ptr_count * 4;
     835   207387399 :                 ptr |= 0x00020000;
     836   207387399 :                 ndr->ptr_count++;
     837             :         }
     838   213394093 :         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       67727 : _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
     845             : {
     846       67727 :         enum ndr_err_code ret = NDR_ERR_SUCCESS;
     847       67727 :         uint32_t ptr = 0;
     848       67727 :         if (p) {
     849             :                 /* Check if the pointer already exists and has an id */
     850       67529 :                 ret = ndr_token_peek(&ndr->full_ptr_list, p, &ptr);
     851       67529 :                 if (ret == NDR_ERR_TOKEN) {
     852       67529 :                         ndr->ptr_count++;
     853       67529 :                         ptr = ndr->ptr_count;
     854       67529 :                         ret = ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
     855       67529 :                         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       67727 :         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       20880 : _PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
     869             : {
     870       20880 :         return ndr_push_uint3264(ndr, NDR_SCALARS, 0xAEF1AEF1);
     871             : }
     872             : 
     873             : 
     874             : /*
     875             :   push a NTTIME
     876             : */
     877     9048596 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     878             : {
     879     9048596 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     880     9048596 :         NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
     881     8942971 :         return NDR_ERR_SUCCESS;
     882             : }
     883             : 
     884             : /*
     885             :   pull a NTTIME
     886             : */
     887     9484339 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     888             : {
     889     9484339 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     890     9484339 :         NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
     891     9413126 :         return NDR_ERR_SUCCESS;
     892             : }
     893             : 
     894             : /*
     895             :   push a NTTIME_1sec
     896             : */
     897    94166034 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     898             : {
     899    94166034 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     900    94166034 :         t /= 10000000;
     901    94166034 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
     902    92301248 :         return NDR_ERR_SUCCESS;
     903             : }
     904             : 
     905             : /*
     906             :   pull a NTTIME_1sec
     907             : */
     908   104388305 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     909             : {
     910   104388305 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     911   104388305 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
     912   104388305 :         (*t) *= 10000000;
     913   104388305 :         return NDR_ERR_SUCCESS;
     914             : }
     915             : 
     916             : /*
     917             :   pull a NTTIME_hyper
     918             : */
     919       24252 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
     920             : {
     921       24252 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     922       24252 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
     923       24212 :         return NDR_ERR_SUCCESS;
     924             : }
     925             : 
     926             : /*
     927             :   push a NTTIME_hyper
     928             : */
     929       34669 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
     930             : {
     931       34669 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     932       34669 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
     933       34637 :         return NDR_ERR_SUCCESS;
     934             : }
     935             : 
     936             : /*
     937             :   push a time_t
     938             : */
     939       77556 : _PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, time_t t)
     940             : {
     941       77556 :         return ndr_push_uint32(ndr, ndr_flags, t);
     942             : }
     943             : 
     944             : /*
     945             :   pull a time_t
     946             : */
     947      190517 : _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      190517 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
     951      190517 :         *t = tt;
     952      190517 :         return NDR_ERR_SUCCESS;
     953             : }
     954             : 
     955             : 
     956             : /*
     957             :   push a uid_t
     958             : */
     959     2560503 : _PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, uid_t u)
     960             : {
     961     2560503 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     962     2560503 :         return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
     963             : }
     964             : 
     965             : /*
     966             :   pull a uid_t
     967             : */
     968     1516718 : _PUBLIC_ enum ndr_err_code ndr_pull_uid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uid_t *u)
     969             : {
     970     1516718 :         uint64_t uu = 0;
     971     1516718 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &uu));
     972     1516718 :         *u = (uid_t)uu;
     973     1516718 :         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     1510603 :         return NDR_ERR_SUCCESS;
     979             : }
     980             : 
     981             : 
     982             : /*
     983             :   push a gid_t
     984             : */
     985     5697681 : _PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, gid_t g)
     986             : {
     987     5697681 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     988     5697681 :         return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
     989             : }
     990             : 
     991             : /*
     992             :   pull a gid_t
     993             : */
     994     4007296 : _PUBLIC_ enum ndr_err_code ndr_pull_gid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, gid_t *g)
     995             : {
     996     4007296 :         uint64_t gg = 0;
     997     4007296 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &gg));
     998     4007296 :         *g = (gid_t)gg;
     999     4007296 :         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     3954901 :         return NDR_ERR_SUCCESS;
    1005             : }
    1006             : 
    1007             : 
    1008             : /*
    1009             :   pull a ipv4address
    1010             : */
    1011       84607 : _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       84607 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &addr));
    1016       84607 :         in.s_addr = htonl(addr);
    1017       84607 :         *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
    1018       84607 :         NDR_ERR_HAVE_NO_MEMORY(*address);
    1019       84254 :         return NDR_ERR_SUCCESS;
    1020             : }
    1021             : 
    1022             : /*
    1023             :   push a ipv4address
    1024             : */
    1025      159252 : _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      159252 :         if (!is_ipaddress_v4(address)) {
    1029          88 :                 return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
    1030             :                                       "Invalid IPv4 address: '%s'",
    1031             :                                       address);
    1032             :         }
    1033      159164 :         addr = inet_addr(address);
    1034      159164 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
    1035      157296 :         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       32275 : _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       32275 :         char *addr_str = talloc_strdup(ndr->current_mem_ctx, "");
    1056          12 :         int i;
    1057       32275 :         NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1058       32275 :         NDR_CHECK(ndr_pull_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
    1059      548675 :         for (i = 0; i < IPV6_BYTES; ++i) {
    1060      516400 :                 addr_str = talloc_asprintf_append(addr_str, "%02x", addr[i]);
    1061      516400 :                 NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1062             :                 /* We need a ':' every second byte but the last one */
    1063      516400 :                 if (i%2 == 1 && i != (IPV6_BYTES - 1)) {
    1064      225925 :                         addr_str = talloc_strdup_append(addr_str, ":");
    1065      226033 :                         NDR_ERR_HAVE_NO_MEMORY(addr_str);
    1066             :                 }
    1067             :         }
    1068       32275 :         *address = addr_str;
    1069       32275 :         NDR_ERR_HAVE_NO_MEMORY(*address);
    1070       32263 :         return NDR_ERR_SUCCESS;
    1071             : }
    1072             : 
    1073             : /*
    1074             :   push a ipv6address
    1075             : */
    1076       51036 : _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       51036 :         if (!is_ipaddress(address)) {
    1083         264 :                 return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS,
    1084             :                                       "Invalid IPv6 address: '%s'",
    1085             :                                       address);
    1086             :         }
    1087       50772 :         ret = inet_pton(AF_INET6, address, addr);
    1088       50772 :         if (ret <= 0) {
    1089           0 :                 return NDR_ERR_IPV6ADDRESS;
    1090             :         }
    1091             : 
    1092       50772 :         NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
    1093             : 
    1094       50540 :         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     1270238 : _PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
    1111             : {
    1112     1270238 :         ndr->print(ndr, "%s: struct %s", name, type);
    1113     1270238 : }
    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      264410 : _PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
    1121             :                     const char *val, uint32_t value)
    1122             : {
    1123      264410 :         if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
    1124      213822 :                 ndr->print(ndr, "%-25s: %s (0x%"PRIX32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
    1125             :         } else {
    1126       50637 :                 ndr->print(ndr, "%-25s: %s (%"PRIu32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
    1127             :         }
    1128      264410 : }
    1129             : 
    1130      559361 : _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      559361 :         if (flag == 0) {
    1133          88 :                 return;
    1134             :         }
    1135             : 
    1136             :         /* this is an attempt to support multi-bit bitmap masks */
    1137      559273 :         value &= flag;
    1138             : 
    1139     5175338 :         while (!(flag & 1)) {
    1140     4616065 :                 flag >>= 1;
    1141     4616065 :                 value >>= 1;
    1142             :         }
    1143      559273 :         if (flag == 1) {
    1144      533294 :                 ndr->print(ndr, "   %"PRIu32": %-25s", value, flag_name);
    1145             :         } else {
    1146       25979 :                 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      477843 : _PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
    1160             : {
    1161      477843 :         if (NDR_HIDE_SECRET(ndr)) {
    1162           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1163           0 :                 return;
    1164             :         }
    1165      477843 :         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      142948 : _PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
    1178             : {
    1179      142948 :         if (NDR_HIDE_SECRET(ndr)) {
    1180           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1181           0 :                 return;
    1182             :         }
    1183      142948 :         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      945708 : _PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
    1196             : {
    1197      945708 :         if (NDR_HIDE_SECRET(ndr)) {
    1198           0 :                 ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
    1199           0 :                 return;
    1200             :         }
    1201      945708 :         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      656710 : _PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
    1262             : {
    1263      656710 :         if (p) {
    1264      628665 :                 ndr->print(ndr, "%-25s: *", name);
    1265             :         } else {
    1266       28045 :                 ndr->print(ndr, "%-25s: NULL", name);
    1267             :         }
    1268      656710 : }
    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        3474 : _PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
    1289             : {
    1290        3474 :         if (t == (time_t)-1 || t == 0) {
    1291        3456 :                 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        3474 : }
    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       28264 : _PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
    1308             : {
    1309       28264 :         if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
    1310          89 :                 ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
    1311             :         } else {
    1312       28175 :                 ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
    1313             :         }
    1314       28264 : }
    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       21453 : _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
    1322             :                            const uint8_t *data, uint32_t count)
    1323             : {
    1324        2296 :         uint32_t i;
    1325             : #define _ONELINE_LIMIT 32
    1326             : 
    1327       21453 :         if (data == NULL) {
    1328           0 :                 ndr->print(ndr, "%s: ARRAY(%"PRIu32") : NULL", name, count);
    1329           0 :                 return;
    1330             :         }
    1331             : 
    1332       21453 :         if (NDR_HIDE_SECRET(ndr)) {
    1333        7771 :                 ndr->print(ndr, "%s: ARRAY(%"PRIu32"): <REDACTED SECRET VALUES>", name, count);
    1334        7771 :                 return;
    1335             :         }
    1336             : 
    1337       13682 :         if (count <= _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
    1338             :                 char s[(_ONELINE_LIMIT + 1) * 2];
    1339      120122 :                 for (i=0;i<count;i++) {
    1340      107212 :                         snprintf(&s[i*2], 3, "%02"PRIx8, data[i]);
    1341             :                 }
    1342       12910 :                 s[i*2] = 0;
    1343       12910 :                 ndr->print(ndr, "%-25s: %s", name, s);
    1344       12910 :                 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      465208 :         for (i=0;i<count;i++) {
    1355      464444 :                 char *idx=NULL;
    1356      464444 :                 if (asprintf(&idx, "[%"PRIu32"]", i) != -1) {
    1357      464444 :                         ndr_print_uint8(ndr, idx, data[i]);
    1358      464444 :                         free(idx);
    1359             :                 }
    1360             :         }
    1361         764 :         ndr->depth--;
    1362             : #undef _ONELINE_LIMIT
    1363             : }
    1364             : 
    1365    32994141 : static void ndr_print_dump_data_cb(const char *buf, void *private_data)
    1366             : {
    1367    32994141 :         struct ndr_print *ndr = (struct ndr_print *)private_data;
    1368             : 
    1369    32994141 :         ndr->print(ndr, "%s", buf);
    1370    32994141 : }
    1371             : 
    1372             : /*
    1373             :   ndr_print version of dump_data()
    1374             :  */
    1375      191245 : static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len)
    1376             : {
    1377      191245 :         if (NDR_HIDE_SECRET(ndr)) {
    1378           6 :                 return;
    1379             :         }
    1380      191239 :         ndr->no_newline = true;
    1381      191239 :         dump_data_cb(buf, len, true, ndr_print_dump_data_cb, ndr);
    1382      191239 :         ndr->no_newline = false;
    1383             : }
    1384             : 
    1385             : 
    1386      197479 : _PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
    1387             : {
    1388      197479 :         ndr->print(ndr, "%-25s: DATA_BLOB length=%zu", name, r.length);
    1389      197479 :         if (r.length) {
    1390      191237 :                 ndr_dump_data(ndr, r.data, r.length);
    1391             :         }
    1392      197479 : }
    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   106134297 : _PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, ndr_flags_type ndr_flags, DATA_BLOB blob)
    1406             : {
    1407   106134297 :         if (ndr->flags & LIBNDR_FLAG_REMAINING) {
    1408             :                 /* nothing to do */
    1409    96622973 :         } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
    1410      340255 :                 if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
    1411          68 :                         blob.length = NDR_ALIGN(ndr, 2);
    1412      340187 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
    1413      275247 :                         blob.length = NDR_ALIGN(ndr, 4);
    1414       64940 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
    1415       64940 :                         blob.length = NDR_ALIGN(ndr, 8);
    1416             :                 }
    1417      340255 :                 NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length);
    1418      340255 :                 data_blob_clear(&blob);
    1419             :         } else {
    1420    96282718 :                 NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, blob.length));
    1421             :         }
    1422   106134297 :         NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
    1423   106027457 :         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   123157829 : _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, ndr_flags_type ndr_flags, DATA_BLOB *blob)
    1437             : {
    1438   123157829 :         uint32_t length = 0;
    1439             : 
    1440   123157829 :         if (ndr->flags & LIBNDR_FLAG_REMAINING) {
    1441    10399922 :                 length = ndr->data_size - ndr->offset;
    1442   112757907 :         } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
    1443      289349 :                 if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
    1444          70 :                         length = NDR_ALIGN(ndr, 2);
    1445      289279 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
    1446      229441 :                         length = NDR_ALIGN(ndr, 4);
    1447       59838 :                 } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
    1448       59838 :                         length = NDR_ALIGN(ndr, 8);
    1449             :                 }
    1450      289349 :                 if (ndr->data_size - ndr->offset < length) {
    1451           0 :                         length = ndr->data_size - ndr->offset;
    1452             :                 }
    1453             :         } else {
    1454   112468558 :                 NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length));
    1455             :         }
    1456   123157829 :         if (length == 0) {
    1457             :                 /* skip the talloc for an empty blob */
    1458      831046 :                 blob->data = NULL;
    1459      831046 :                 blob->length = 0;
    1460      831046 :                 return NDR_ERR_SUCCESS;
    1461             :         }
    1462   122326783 :         NDR_PULL_NEED_BYTES(ndr, length);
    1463   122326781 :         *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
    1464   122326781 :         ndr->offset += length;
    1465   122326781 :         return NDR_ERR_SUCCESS;
    1466             : }
    1467             : 
    1468    91387897 : _PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, ndr_flags_type flags)
    1469             : {
    1470    91387897 :         if (!data) return ret;
    1471    91387896 :         return ret + data->length;
    1472             : }
    1473             : 
    1474           0 : _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
    1475             : {
    1476           0 :         ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
    1477           0 : }
    1478             : 
    1479   239256206 : _PUBLIC_ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
    1480             : {
    1481   239256206 :         switch (ndr_err) {
    1482   239256098 :         case NDR_ERR_SUCCESS:
    1483   239256112 :                 return NT_STATUS_OK;
    1484          14 :         case NDR_ERR_BUFSIZE:
    1485          14 :                 return NT_STATUS_BUFFER_TOO_SMALL;
    1486           0 :         case NDR_ERR_TOKEN:
    1487           0 :                 return NT_STATUS_INTERNAL_ERROR;
    1488           0 :         case NDR_ERR_ALLOC:
    1489           0 :                 return NT_STATUS_NO_MEMORY;
    1490           0 :         case NDR_ERR_ARRAY_SIZE:
    1491           0 :                 return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
    1492           2 :         case NDR_ERR_INVALID_POINTER:
    1493           2 :                 return NT_STATUS_INVALID_PARAMETER_MIX;
    1494           0 :         case NDR_ERR_UNREAD_BYTES:
    1495           0 :                 return NT_STATUS_PORT_MESSAGE_TOO_LONG;
    1496          92 :         default:
    1497          92 :                 break;
    1498             :         }
    1499             : 
    1500             :         /* we should map all error codes to different status codes */
    1501          92 :         return NT_STATUS_INVALID_PARAMETER;
    1502             : }
    1503             : 
    1504           0 : _PUBLIC_ int ndr_map_error2errno(enum ndr_err_code ndr_err)
    1505             : {
    1506           0 :         switch (ndr_err) {
    1507           0 :         case NDR_ERR_SUCCESS:
    1508           0 :                 return 0;
    1509           0 :         case NDR_ERR_BUFSIZE:
    1510           0 :                 return ENOSPC;
    1511           0 :         case NDR_ERR_TOKEN:
    1512           0 :                 return EINVAL;
    1513           0 :         case NDR_ERR_ALLOC:
    1514           0 :                 return ENOMEM;
    1515           0 :         case NDR_ERR_ARRAY_SIZE:
    1516           0 :                 return EMSGSIZE;
    1517           0 :         case NDR_ERR_INVALID_POINTER:
    1518           0 :                 return EINVAL;
    1519           0 :         case NDR_ERR_UNREAD_BYTES:
    1520           0 :                 return EOVERFLOW;
    1521           0 :         default:
    1522           0 :                 break;
    1523             :         }
    1524             : 
    1525             :         /* we should map all error codes to different status codes */
    1526           0 :         return EINVAL;
    1527             : }
    1528             : 
    1529        6720 : _PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
    1530             :                                              ndr_flags_type ndr_flags,
    1531             :                                              const struct timespec *t)
    1532             : {
    1533        6720 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
    1534        6720 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
    1535        6720 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
    1536        6720 :         return NDR_ERR_SUCCESS;
    1537             : }
    1538             : 
    1539        2608 : _PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
    1540             :                                              ndr_flags_type ndr_flags,
    1541             :                                              struct timespec *t)
    1542             : {
    1543        2608 :         uint64_t secs = 0;
    1544        2608 :         uint32_t nsecs = 0;
    1545        2608 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
    1546        2608 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
    1547        2608 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
    1548        2608 :         t->tv_sec = secs;
    1549        2608 :         t->tv_nsec = nsecs;
    1550        2608 :         return NDR_ERR_SUCCESS;
    1551             : }
    1552             : 
    1553           0 : _PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
    1554             :                                  const struct timespec *t)
    1555             : {
    1556           0 :         char *str = timestring(ndr, t->tv_sec);
    1557           0 :         ndr->print(ndr, "%-25s: %s.%ld", name, str, t->tv_nsec);
    1558           0 :         TALLOC_FREE(str);
    1559           0 : }
    1560             : 
    1561      892872 : _PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
    1562             :                                             ndr_flags_type ndr_flags,
    1563             :                                             const struct timeval *t)
    1564             : {
    1565      892872 :         NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
    1566      892872 :         NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
    1567      892872 :         NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
    1568      890704 :         return NDR_ERR_SUCCESS;
    1569             : }
    1570             : 
    1571     1918130 : _PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
    1572             :                                             ndr_flags_type ndr_flags,
    1573             :                                             struct timeval *t)
    1574             : {
    1575     1918130 :         uint64_t secs = 0;
    1576     1918130 :         uint32_t usecs = 0;
    1577     1918130 :         NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
    1578     1918130 :         NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
    1579     1918130 :         NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
    1580     1918130 :         t->tv_sec = secs;
    1581     1918130 :         t->tv_usec = usecs;
    1582     1918130 :         return NDR_ERR_SUCCESS;
    1583             : }
    1584             : 
    1585           0 : _PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
    1586             :                                 const struct timeval *t)
    1587             : {
    1588           0 :         ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
    1589           0 :                    (long)t->tv_usec);
    1590           0 : }
    1591             : 
    1592          26 : _PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name,
    1593             :                                        libndr_flags flags)
    1594             : {
    1595          26 :         ndr->print(ndr, "%-25s: 0x%016"PRI_LIBNDR_FLAGS" (%"PRI_LIBNDR_FLAGS_DECIMAL")", name, flags, flags);
    1596          26 : }

Generated by: LCOV version 1.14