Coverage Report

Created: 2026-06-07 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/librpc/ndr/ndr_basic.c
Line
Count
Source
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
71.9M
  (NDR_BE(ndr) ? PULL_BE_U16(ndr->data,ofs) : PULL_LE_U16(ndr->data,ofs))
32
33
#define NDR_PULL_U32(ndr, ofs) \
34
257M
  (NDR_BE(ndr) ? PULL_BE_U32(ndr->data,ofs) : PULL_LE_U32(ndr->data,ofs))
35
36
#define NDR_PULL_I32(ndr, ofs) \
37
190k
  (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
856k
  (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
18.5M
  do { \
44
18.5M
    if (NDR_BE(ndr)) { \
45
4.80M
      PUSH_BE_U16(ndr->data, ofs, v); \
46
13.7M
    } else { \
47
13.7M
      PUSH_LE_U16(ndr->data, ofs, v); \
48
13.7M
    } \
49
18.5M
  } while (0)
50
51
#define NDR_PUSH_U32(ndr, ofs, v) \
52
121M
  do { \
53
121M
    if (NDR_BE(ndr)) { \
54
5.98M
      PUSH_BE_U32(ndr->data, ofs, v); \
55
115M
    } else { \
56
115M
      PUSH_LE_U32(ndr->data, ofs, v); \
57
115M
    } \
58
121M
  } while (0)
59
60
#define NDR_PUSH_I32(ndr, ofs, v) \
61
3.07k
  do { \
62
3.07k
    if (NDR_BE(ndr)) { \
63
262
      PUSH_BE_U32(ndr->data, ofs, v); \
64
2.81k
    } else { \
65
2.81k
      PUSH_LE_U32(ndr->data, ofs, v); \
66
2.81k
    } \
67
3.07k
  } while (0)
68
69
#define NDR_PUSH_I64(ndr, ofs, v) \
70
604k
  do { \
71
604k
    if (NDR_BE(ndr)) { \
72
889
      PUSH_BE_I64((ndr)->data, ofs, v);  \
73
604k
    } else { \
74
604k
      PUSH_LE_I64((ndr)->data, ofs, v);  \
75
604k
    } \
76
604k
  } 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
_PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
86
0
{
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
0
    }
93
0
  }
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
0
    }
99
0
    DEBUG(0,("\n"));
100
0
  }
101
102
0
}
103
104
/*
105
  parse a int8_t
106
*/
107
_PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int8_t *v)
108
3.60M
{
109
3.60M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
110
3.60M
  NDR_PULL_NEED_BYTES(ndr, 1);
111
3.60M
  *v = (int8_t)PULL_BE_U8(ndr->data, ndr->offset);
112
3.60M
  ndr->offset += 1;
113
3.60M
  return NDR_ERR_SUCCESS;
114
3.60M
}
115
116
/*
117
  parse a uint8_t
118
*/
119
_PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
120
17.6M
{
121
17.6M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
122
17.6M
  NDR_PULL_NEED_BYTES(ndr, 1);
123
17.6M
  *v = PULL_BE_U8(ndr->data, ndr->offset);
124
17.6M
  ndr->offset += 1;
125
17.6M
  return NDR_ERR_SUCCESS;
126
17.6M
}
127
128
/*
129
  parse a int16_t
130
*/
131
_PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int16_t *v)
132
3.28k
{
133
3.28k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
134
3.28k
  NDR_PULL_ALIGN(ndr, 2);
135
3.28k
  NDR_PULL_NEED_BYTES(ndr, 2);
136
3.22k
  *v = (uint16_t)NDR_PULL_U16(ndr, ndr->offset);
137
3.22k
  ndr->offset += 2;
138
3.22k
  return NDR_ERR_SUCCESS;
139
3.28k
}
140
141
/*
142
  parse a uint16_t
143
*/
144
_PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
145
71.9M
{
146
71.9M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
147
71.9M
  NDR_PULL_ALIGN(ndr, 2);
148
71.9M
  NDR_PULL_NEED_BYTES(ndr, 2);
149
71.9M
  *v = NDR_PULL_U16(ndr, ndr->offset);
150
71.9M
  ndr->offset += 2;
151
71.9M
  return NDR_ERR_SUCCESS;
152
71.9M
}
153
154
/*
155
  parse a uint1632_t
156
*/
157
_PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
158
3.37M
{
159
3.37M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
160
3.37M
  if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
161
0
    uint32_t v32 = 0;
162
0
    enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32);
163
0
    *v = v32;
164
0
    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
0
    }
168
0
    return err;
169
0
  }
170
3.37M
  return ndr_pull_uint16(ndr, ndr_flags, v);
171
3.37M
}
172
173
/*
174
  parse a int32_t
175
*/
176
_PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int32_t *v)
177
190k
{
178
190k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
179
190k
  NDR_PULL_ALIGN(ndr, 4);
180
190k
  NDR_PULL_NEED_BYTES(ndr, 4);
181
190k
  *v = NDR_PULL_I32(ndr, ndr->offset);
182
190k
  ndr->offset += 4;
183
190k
  return NDR_ERR_SUCCESS;
184
190k
}
185
186
/*
187
  parse a uint32_t
188
*/
189
_PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
190
224M
{
191
224M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
192
224M
  NDR_PULL_ALIGN(ndr, 4);
193
224M
  NDR_PULL_NEED_BYTES(ndr, 4);
194
224M
  *v = NDR_PULL_U32(ndr, ndr->offset);
195
224M
  ndr->offset += 4;
196
224M
  return NDR_ERR_SUCCESS;
197
224M
}
198
199
/*
200
  parse a arch dependent uint32/uint64
201
*/
202
_PUBLIC_ enum ndr_err_code ndr_pull_uint3264(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
203
69.7M
{
204
69.7M
  uint64_t v64 = 0;
205
69.7M
  enum ndr_err_code err;
206
69.7M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
207
69.7M
  if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
208
69.7M
    return ndr_pull_uint32(ndr, ndr_flags, v);
209
69.7M
  }
210
0
  err = ndr_pull_hyper(ndr, ndr_flags, &v64);
211
0
  if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
212
0
    return err;
213
0
  }
214
0
  *v = (uint32_t)v64;
215
0
  if (unlikely(v64 != *v)) {
216
0
    DEBUG(0,(__location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
217
0
       v64));
218
0
    return ndr_pull_error(ndr, NDR_ERR_NDR64, __location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
219
0
       v64);
220
0
  }
221
0
  return err;
222
0
}
223
224
/*
225
  parse a double
226
*/
227
_PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, ndr_flags_type ndr_flags, double *v)
228
0
{
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
0
}
236
237
/*
238
  parse a pointer referent identifier stored in 2 bytes
239
*/
240
_PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v)
241
1.02M
{
242
1.02M
  NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, v));
243
1.02M
  if (*v != 0) {
244
673k
    ndr->ptr_count++;
245
673k
  }
246
1.02M
  *(v) -= ndr->relative_rap_convert;
247
1.02M
  return NDR_ERR_SUCCESS;
248
1.02M
}
249
250
/*
251
  parse a pointer referent identifier
252
*/
253
_PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
254
64.0M
{
255
64.0M
  NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
256
63.9M
  if (*v != 0) {
257
22.3M
    ndr->ptr_count++;
258
22.3M
  }
259
63.9M
  return NDR_ERR_SUCCESS;
260
64.0M
}
261
262
/*
263
  parse a ref pointer referent identifier
264
*/
265
_PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
266
589k
{
267
589k
  NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
268
  /* ref pointers always point to data */
269
589k
  *v = 1;
270
589k
  return NDR_ERR_SUCCESS;
271
589k
}
272
273
/*
274
  parse a udlong
275
*/
276
_PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
277
15.3M
{
278
15.3M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
279
15.3M
  NDR_PULL_ALIGN(ndr, 4);
280
15.3M
  NDR_PULL_NEED_BYTES(ndr, 8);
281
15.3M
  *v = NDR_PULL_U32(ndr, ndr->offset);
282
15.3M
  *v |= (uint64_t)(NDR_PULL_U32(ndr, ndr->offset+4)) << 32;
283
15.3M
  ndr->offset += 8;
284
15.3M
  return NDR_ERR_SUCCESS;
285
15.3M
}
286
287
/*
288
  parse a udlongr
289
*/
290
_PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
291
1.20M
{
292
1.20M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
293
1.20M
  NDR_PULL_ALIGN(ndr, 4);
294
1.20M
  NDR_PULL_NEED_BYTES(ndr, 8);
295
1.20M
  *v = ((uint64_t)NDR_PULL_U32(ndr, ndr->offset)) << 32;
296
1.20M
  *v |= NDR_PULL_U32(ndr, ndr->offset+4);
297
1.20M
  ndr->offset += 8;
298
1.20M
  return NDR_ERR_SUCCESS;
299
1.20M
}
300
301
/*
302
  parse a dlong
303
*/
304
_PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
305
12.7k
{
306
12.7k
  return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
307
12.7k
}
308
309
/*
310
  parse a hyper
311
*/
312
_PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
313
12.1M
{
314
12.1M
  NDR_PULL_ALIGN(ndr, 8);
315
12.1M
  if (NDR_BE(ndr)) {
316
121k
    return ndr_pull_udlongr(ndr, ndr_flags, v);
317
121k
  }
318
12.0M
  return ndr_pull_udlong(ndr, ndr_flags, v);
319
12.1M
}
320
321
/*
322
  parse an int64
323
*/
324
_PUBLIC_ enum ndr_err_code ndr_pull_int64(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
325
857k
{
326
857k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
327
857k
  NDR_PULL_ALIGN(ndr, 8);
328
857k
  NDR_PULL_NEED_BYTES(ndr, 8);
329
856k
  *v = NDR_PULL_I64(ndr, ndr->offset);
330
856k
  ndr->offset += 8;
331
856k
  return NDR_ERR_SUCCESS;
332
857k
}
333
334
/*
335
  parse a pointer
336
*/
337
_PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, ndr_flags_type ndr_flags, void* *v)
338
692k
{
339
692k
  uintptr_t h;
340
692k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
341
692k
  NDR_PULL_ALIGN(ndr, sizeof(h));
342
691k
  NDR_PULL_NEED_BYTES(ndr, sizeof(h));
343
691k
  memcpy(&h, ndr->data+ndr->offset, sizeof(h));
344
691k
  ndr->offset += sizeof(h);
345
691k
  *v = (void *)h;
346
691k
  return NDR_ERR_SUCCESS;
347
691k
}
348
349
/*
350
  pull a NTSTATUS
351
*/
352
_PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTSTATUS *status)
353
413k
{
354
413k
  uint32_t v;
355
413k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
356
413k
  NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
357
412k
  *status = NT_STATUS(v);
358
412k
  return NDR_ERR_SUCCESS;
359
413k
}
360
361
/*
362
  push a NTSTATUS
363
*/
364
_PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTSTATUS status)
365
398k
{
366
398k
  return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
367
398k
}
368
369
_PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
370
300k
{
371
300k
  ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
372
300k
}
373
374
/*
375
  pull a WERROR
376
*/
377
_PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, WERROR *status)
378
31.7M
{
379
31.7M
  uint32_t v;
380
31.7M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
381
31.7M
  NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
382
31.7M
  *status = W_ERROR(v);
383
31.7M
  return NDR_ERR_SUCCESS;
384
31.7M
}
385
386
/*
387
  pull a HRESULT
388
*/
389
_PUBLIC_ enum ndr_err_code ndr_pull_HRESULT(struct ndr_pull *ndr, ndr_flags_type ndr_flags, HRESULT *status)
390
25.2k
{
391
25.2k
  uint32_t v;
392
25.2k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
393
25.2k
  NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
394
25.1k
  *status = HRES_ERROR(v);
395
25.1k
  return NDR_ERR_SUCCESS;
396
25.2k
}
397
398
/*
399
  parse a uint8_t enum
400
*/
401
_PUBLIC_ enum ndr_err_code ndr_pull_enum_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
402
1.49M
{
403
1.49M
  return ndr_pull_uint8(ndr, ndr_flags, v);
404
1.49M
}
405
406
/*
407
  parse a uint16_t enum
408
*/
409
_PUBLIC_ enum ndr_err_code ndr_pull_enum_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
410
5.11M
{
411
5.11M
  return ndr_pull_uint16(ndr, ndr_flags, v);
412
5.11M
}
413
414
/*
415
  parse a uint1632_t enum (uint32_t on NDR64)
416
*/
417
_PUBLIC_ enum ndr_err_code ndr_pull_enum_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
418
9.88M
{
419
9.88M
  if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
420
0
    uint32_t v32;
421
0
    NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &v32));
422
0
    *v = v32;
423
0
    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
0
    }
427
0
    return NDR_ERR_SUCCESS;
428
0
  }
429
9.88M
  return ndr_pull_uint16(ndr, ndr_flags, v);
430
9.88M
}
431
432
/*
433
  parse a uint32_t enum
434
*/
435
_PUBLIC_ enum ndr_err_code ndr_pull_enum_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
436
12.2M
{
437
12.2M
  return ndr_pull_uint32(ndr, ndr_flags, v);
438
12.2M
}
439
440
/*
441
  push a uint8_t enum
442
*/
443
_PUBLIC_ enum ndr_err_code ndr_push_enum_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
444
688k
{
445
688k
  return ndr_push_uint8(ndr, ndr_flags, v);
446
688k
}
447
448
/*
449
  push a uint16_t enum
450
*/
451
_PUBLIC_ enum ndr_err_code ndr_push_enum_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
452
1.50M
{
453
1.50M
  return ndr_push_uint16(ndr, ndr_flags, v);
454
1.50M
}
455
456
/*
457
  push a uint32_t enum
458
*/
459
_PUBLIC_ enum ndr_err_code ndr_push_enum_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
460
6.84M
{
461
6.84M
  return ndr_push_uint32(ndr, ndr_flags, v);
462
6.84M
}
463
464
/*
465
  push a uint1632_t enum
466
*/
467
_PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
468
5.41M
{
469
5.41M
  if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
470
3.65M
    return ndr_push_uint32(ndr, ndr_flags, v);
471
3.65M
  }
472
1.76M
  return ndr_push_uint16(ndr, ndr_flags, v);
473
5.41M
}
474
475
/*
476
  push a WERROR
477
*/
478
_PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, ndr_flags_type ndr_flags, WERROR status)
479
31.7M
{
480
31.7M
  return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
481
31.7M
}
482
483
_PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
484
31.7M
{
485
31.7M
  ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
486
31.7M
}
487
488
/*
489
  push a HRESULT
490
*/
491
_PUBLIC_ enum ndr_err_code ndr_push_HRESULT(struct ndr_push *ndr, ndr_flags_type ndr_flags, HRESULT status)
492
6.09k
{
493
6.09k
  return ndr_push_uint32(ndr, NDR_SCALARS, HRES_ERROR_V(status));
494
6.09k
}
495
496
_PUBLIC_ void ndr_print_HRESULT(struct ndr_print *ndr, const char *name, HRESULT r)
497
6.09k
{
498
6.09k
  ndr->print(ndr, "%-25s: %s", name, hresult_errstr(r));
499
6.09k
}
500
501
502
/*
503
  parse a set of bytes
504
*/
505
_PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
506
21.9M
{
507
21.9M
  NDR_PULL_NEED_BYTES(ndr, n);
508
21.9M
  memcpy(data, ndr->data + ndr->offset, n);
509
21.9M
  ndr->offset += n;
510
21.9M
  return NDR_ERR_SUCCESS;
511
21.9M
}
512
513
/*
514
  pull an array of uint8
515
*/
516
_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
15.6M
{
518
15.6M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
519
15.6M
  if (!(ndr_flags & NDR_SCALARS)) {
520
0
    return NDR_ERR_SUCCESS;
521
0
  }
522
15.6M
  return ndr_pull_bytes(ndr, data, n);
523
15.6M
}
524
525
/*
526
  push a int8_t
527
*/
528
_PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, ndr_flags_type ndr_flags, int8_t v)
529
501k
{
530
501k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
531
501k
  NDR_PUSH_NEED_BYTES(ndr, 1);
532
501k
  PUSH_BE_U8(ndr->data, ndr->offset, (uint8_t)v);
533
501k
  ndr->offset += 1;
534
501k
  return NDR_ERR_SUCCESS;
535
501k
}
536
537
/*
538
  push a uint8_t
539
*/
540
_PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
541
25.8M
{
542
25.8M
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
543
25.8M
  NDR_PUSH_NEED_BYTES(ndr, 1);
544
25.8M
  PUSH_BE_U8(ndr->data, ndr->offset, v);
545
25.8M
  ndr->offset += 1;
546
25.8M
  return NDR_ERR_SUCCESS;
547
25.8M
}
548
549
/*
550
  push a int16_t
551
*/
552
_PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, ndr_flags_type ndr_flags, int16_t v)
553
585
{
554
585
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
555
585
  NDR_PUSH_ALIGN(ndr, 2);
556
585
  NDR_PUSH_NEED_BYTES(ndr, 2);
557
585
  NDR_PUSH_U16(ndr, ndr->offset, (uint16_t)v);
558
585
  ndr->offset += 2;
559
585
  return NDR_ERR_SUCCESS;
560
585
}
561
562
/*
563
  push a uint16_t
564
*/
565
_PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
566
18.5M
{
567
18.5M
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
568
18.5M
  NDR_PUSH_ALIGN(ndr, 2);
569
18.5M
  NDR_PUSH_NEED_BYTES(ndr, 2);
570
18.5M
  NDR_PUSH_U16(ndr, ndr->offset, v);
571
18.5M
  ndr->offset += 2;
572
18.5M
  return NDR_ERR_SUCCESS;
573
18.5M
}
574
575
/*
576
  push a uint1632
577
*/
578
_PUBLIC_ enum ndr_err_code ndr_push_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
579
0
{
580
0
  if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
581
0
    return ndr_push_uint32(ndr, ndr_flags, v);
582
0
  }
583
0
  return ndr_push_uint16(ndr, ndr_flags, v);
584
0
}
585
586
/*
587
  push a int32_t
588
*/
589
_PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, ndr_flags_type ndr_flags, int32_t v)
590
3.07k
{
591
3.07k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
592
3.07k
  NDR_PUSH_ALIGN(ndr, 4);
593
3.07k
  NDR_PUSH_NEED_BYTES(ndr, 4);
594
3.07k
  NDR_PUSH_I32(ndr, ndr->offset, v);
595
3.07k
  ndr->offset += 4;
596
3.07k
  return NDR_ERR_SUCCESS;
597
3.07k
}
598
599
/*
600
  push a uint32_t
601
*/
602
_PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
603
104M
{
604
104M
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
605
104M
  NDR_PUSH_ALIGN(ndr, 4);
606
104M
  NDR_PUSH_NEED_BYTES(ndr, 4);
607
104M
  NDR_PUSH_U32(ndr, ndr->offset, v);
608
104M
  ndr->offset += 4;
609
104M
  return NDR_ERR_SUCCESS;
610
104M
}
611
612
/*
613
  push a uint3264
614
*/
615
_PUBLIC_ enum ndr_err_code ndr_push_uint3264(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
616
7.74M
{
617
7.74M
  if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
618
4.35M
    return ndr_push_hyper(ndr, ndr_flags, v);
619
4.35M
  }
620
3.38M
  return ndr_push_uint32(ndr, ndr_flags, v);
621
7.74M
}
622
623
/*
624
  push a udlong
625
*/
626
_PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
627
7.90M
{
628
7.90M
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
629
7.90M
  NDR_PUSH_ALIGN(ndr, 4);
630
7.90M
  NDR_PUSH_NEED_BYTES(ndr, 8);
631
7.90M
  NDR_PUSH_U32(ndr, ndr->offset, (v & 0xFFFFFFFF));
632
7.90M
  NDR_PUSH_U32(ndr, ndr->offset+4, (v>>32));
633
7.90M
  ndr->offset += 8;
634
7.90M
  return NDR_ERR_SUCCESS;
635
7.90M
}
636
637
/*
638
  push a udlongr
639
*/
640
_PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
641
430k
{
642
430k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
643
430k
  NDR_PUSH_ALIGN(ndr, 4);
644
430k
  NDR_PUSH_NEED_BYTES(ndr, 8);
645
430k
  NDR_PUSH_U32(ndr, ndr->offset, (v>>32));
646
430k
  NDR_PUSH_U32(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
647
430k
  ndr->offset += 8;
648
430k
  return NDR_ERR_SUCCESS;
649
430k
}
650
651
/*
652
  push a dlong
653
*/
654
_PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
655
5.94k
{
656
5.94k
  return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
657
5.94k
}
658
659
/*
660
  push a hyper
661
*/
662
_PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
663
7.15M
{
664
7.15M
  NDR_PUSH_ALIGN(ndr, 8);
665
7.15M
  if (NDR_BE(ndr)) {
666
6.93k
    return ndr_push_udlongr(ndr, NDR_SCALARS, v);
667
6.93k
  }
668
7.15M
  return ndr_push_udlong(ndr, NDR_SCALARS, v);
669
7.15M
}
670
671
/*
672
  push an int64
673
*/
674
_PUBLIC_ enum ndr_err_code ndr_push_int64(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
675
604k
{
676
604k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
677
604k
  NDR_PUSH_ALIGN(ndr, 8);
678
604k
  NDR_PUSH_NEED_BYTES(ndr, 8);
679
604k
  NDR_PUSH_I64(ndr, ndr->offset, v);
680
604k
  ndr->offset += 8;
681
604k
  return NDR_ERR_SUCCESS;
682
604k
}
683
684
/*
685
  push a double
686
*/
687
_PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, ndr_flags_type ndr_flags, double v)
688
0
{
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
0
}
696
697
/*
698
  push a pointer
699
*/
700
_PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, ndr_flags_type ndr_flags, void* v)
701
173k
{
702
173k
  uintptr_t h = (intptr_t)v;
703
173k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
704
173k
  NDR_PUSH_ALIGN(ndr, sizeof(h));
705
173k
  NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
706
173k
  memcpy(ndr->data+ndr->offset, &h, sizeof(h));
707
173k
  ndr->offset += sizeof(h);
708
173k
  return NDR_ERR_SUCCESS;
709
173k
}
710
711
_PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
712
99.5M
{
713
  /* this is a nasty hack to make pidl work with NDR64 */
714
99.5M
  if (size == 5) {
715
15.3M
    if (ndr->flags & LIBNDR_FLAG_NDR64) {
716
12.1M
      size = 8;
717
12.1M
    } else {
718
3.15M
      size = 4;
719
3.15M
    }
720
84.2M
  } else if (size == 3) {
721
325
    if (ndr->flags & LIBNDR_FLAG_NDR64) {
722
146
      size = 4;
723
179
    } else {
724
179
      size = 2;
725
179
    }
726
325
  }
727
99.5M
  NDR_PUSH_ALIGN(ndr, size);
728
99.5M
  return NDR_ERR_SUCCESS;
729
99.5M
}
730
731
_PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
732
114M
{
733
  /* this is a nasty hack to make pidl work with NDR64 */
734
114M
  if (size == 5) {
735
42.2M
    if (ndr->flags & LIBNDR_FLAG_NDR64) {
736
0
      size = 8;
737
42.2M
    } else {
738
42.2M
      size = 4;
739
42.2M
    }
740
72.2M
  } else if (size == 3) {
741
240
    if (ndr->flags & LIBNDR_FLAG_NDR64) {
742
0
      size = 4;
743
240
    } else {
744
240
      size = 2;
745
240
    }
746
240
  }
747
114M
  NDR_PULL_ALIGN(ndr, size);
748
114M
  return NDR_ERR_SUCCESS;
749
114M
}
750
751
_PUBLIC_ enum ndr_err_code ndr_push_union_align(struct ndr_push *ndr, size_t size)
752
16.7M
{
753
  /* MS-RPCE section 2.2.5.3.4.4 */
754
16.7M
  if (ndr->flags & LIBNDR_FLAG_NDR64) {
755
3.20M
    return ndr_push_align(ndr, size);
756
3.20M
  }
757
13.5M
  return NDR_ERR_SUCCESS;
758
16.7M
}
759
760
_PUBLIC_ enum ndr_err_code ndr_pull_union_align(struct ndr_pull *ndr, size_t size)
761
74.0M
{
762
  /* MS-RPCE section 2.2.5.3.4.4 */
763
74.0M
  if (ndr->flags & LIBNDR_FLAG_NDR64) {
764
0
    return ndr_pull_align(ndr, size);
765
0
  }
766
74.0M
  return NDR_ERR_SUCCESS;
767
74.0M
}
768
769
_PUBLIC_ enum ndr_err_code ndr_push_trailer_align(struct ndr_push *ndr, size_t size)
770
54.1M
{
771
  /* MS-RPCE section 2.2.5.3.4.1 */
772
54.1M
  if (ndr->flags & LIBNDR_FLAG_NDR64) {
773
38.3M
    return ndr_push_align(ndr, size);
774
38.3M
  }
775
15.8M
  return NDR_ERR_SUCCESS;
776
54.1M
}
777
778
_PUBLIC_ enum ndr_err_code ndr_pull_trailer_align(struct ndr_pull *ndr, size_t size)
779
106M
{
780
  /* MS-RPCE section 2.2.5.3.4.1 */
781
106M
  if (ndr->flags & LIBNDR_FLAG_NDR64) {
782
0
    return ndr_pull_align(ndr, size);
783
0
  }
784
106M
  return NDR_ERR_SUCCESS;
785
106M
}
786
787
/*
788
  push some bytes
789
*/
790
_PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
791
30.1M
{
792
30.1M
  if (unlikely(n == 0)) {
793
15.8M
    return NDR_ERR_SUCCESS;
794
15.8M
  }
795
14.3M
  if (unlikely(data == NULL)) {
796
0
    return NDR_ERR_INVALID_POINTER;
797
0
  }
798
14.3M
  NDR_PUSH_NEED_BYTES(ndr, n);
799
14.3M
  memcpy(ndr->data + ndr->offset, data, n);
800
14.3M
  ndr->offset += n;
801
14.3M
  return NDR_ERR_SUCCESS;
802
14.3M
}
803
804
/*
805
  push some zero bytes
806
*/
807
_PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
808
243k
{
809
243k
  NDR_PUSH_NEED_BYTES(ndr, n);
810
243k
  memset(ndr->data + ndr->offset, 0, n);
811
243k
  ndr->offset += n;
812
243k
  return NDR_ERR_SUCCESS;
813
243k
}
814
815
/*
816
  push an array of uint8
817
*/
818
_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
3.86M
{
820
3.86M
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
821
3.86M
  if (!(ndr_flags & NDR_SCALARS)) {
822
0
    return NDR_ERR_SUCCESS;
823
0
  }
824
3.86M
  return ndr_push_bytes(ndr, data, n);
825
3.86M
}
826
827
/*
828
  push a unique non-zero value if a pointer is non-NULL, otherwise 0
829
*/
830
_PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
831
5.45M
{
832
5.45M
  uint32_t ptr = 0;
833
5.45M
  if (p) {
834
632k
    ptr = ndr->ptr_count * 4;
835
632k
    ptr |= 0x00020000;
836
632k
    ndr->ptr_count++;
837
632k
  }
838
5.45M
  return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
839
5.45M
}
840
841
/*
842
  push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
843
*/
844
_PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
845
8.36k
{
846
8.36k
  enum ndr_err_code ret = NDR_ERR_SUCCESS;
847
8.36k
  uint32_t ptr = 0;
848
8.36k
  if (p) {
849
    /* Check if the pointer already exists and has an id */
850
998
    ret = ndr_token_peek(&ndr->full_ptr_list, p, &ptr);
851
998
    if (ret == NDR_ERR_TOKEN) {
852
998
      ndr->ptr_count++;
853
998
      ptr = ndr->ptr_count;
854
998
      ret = ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
855
998
      if (ret != NDR_ERR_SUCCESS) {
856
0
        return ret;
857
0
      }
858
998
    } else if (ret != NDR_ERR_SUCCESS) {
859
0
      return ret;
860
0
    }
861
998
  }
862
8.36k
  return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
863
8.36k
}
864
865
/*
866
  push always a 0, if a pointer is NULL it's a fatal error
867
*/
868
_PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
869
18.7k
{
870
18.7k
  return ndr_push_uint3264(ndr, NDR_SCALARS, 0xAEF1AEF1);
871
18.7k
}
872
873
874
/*
875
  push a NTTIME
876
*/
877
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
878
507k
{
879
507k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
880
507k
  NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
881
507k
  return NDR_ERR_SUCCESS;
882
507k
}
883
884
/*
885
  pull a NTTIME
886
*/
887
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
888
1.47M
{
889
1.47M
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
890
1.47M
  NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
891
1.47M
  return NDR_ERR_SUCCESS;
892
1.47M
}
893
894
/*
895
  push a NTTIME_1sec
896
*/
897
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
898
6.48k
{
899
6.48k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
900
6.48k
  t /= 10000000;
901
6.48k
  NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
902
6.48k
  return NDR_ERR_SUCCESS;
903
6.48k
}
904
905
/*
906
  pull a NTTIME_1sec
907
*/
908
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
909
106k
{
910
106k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
911
106k
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
912
106k
  (*t) *= 10000000;
913
106k
  return NDR_ERR_SUCCESS;
914
106k
}
915
916
/*
917
  pull a NTTIME_hyper
918
*/
919
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
920
146k
{
921
146k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
922
146k
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
923
146k
  return NDR_ERR_SUCCESS;
924
146k
}
925
926
/*
927
  push a NTTIME_hyper
928
*/
929
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
930
6.00k
{
931
6.00k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
932
6.00k
  NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
933
6.00k
  return NDR_ERR_SUCCESS;
934
6.00k
}
935
936
/*
937
  push a time_t
938
*/
939
_PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, time_t t)
940
95.8k
{
941
95.8k
  return ndr_push_uint32(ndr, ndr_flags, t);
942
95.8k
}
943
944
/*
945
  pull a time_t
946
*/
947
_PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, time_t *t)
948
272k
{
949
272k
  uint32_t tt;
950
272k
  NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
951
271k
  *t = tt;
952
271k
  return NDR_ERR_SUCCESS;
953
272k
}
954
955
956
/*
957
  push a uid_t
958
*/
959
_PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, uid_t u)
960
3.18k
{
961
3.18k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
962
3.18k
  return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
963
3.18k
}
964
965
/*
966
  pull a uid_t
967
*/
968
_PUBLIC_ enum ndr_err_code ndr_pull_uid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uid_t *u)
969
27.8k
{
970
27.8k
  uint64_t uu = 0;
971
27.8k
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &uu));
972
27.7k
  *u = (uid_t)uu;
973
27.7k
  if (unlikely(uu != *u)) {
974
448
    DEBUG(0,(__location__ ": uid_t pull doesn't fit 0x%016"PRIx64"\n",
975
448
       uu));
976
448
    return NDR_ERR_NDR64;
977
448
  }
978
27.2k
  return NDR_ERR_SUCCESS;
979
27.7k
}
980
981
982
/*
983
  push a gid_t
984
*/
985
_PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, gid_t g)
986
9.95k
{
987
9.95k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
988
9.95k
  return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
989
9.95k
}
990
991
/*
992
  pull a gid_t
993
*/
994
_PUBLIC_ enum ndr_err_code ndr_pull_gid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, gid_t *g)
995
317k
{
996
317k
  uint64_t gg = 0;
997
317k
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &gg));
998
316k
  *g = (gid_t)gg;
999
316k
  if (unlikely(gg != *g)) {
1000
401
    DEBUG(0,(__location__ ": gid_t pull doesn't fit 0x%016"PRIx64"\n",
1001
401
       gg));
1002
401
    return NDR_ERR_NDR64;
1003
401
  }
1004
316k
  return NDR_ERR_SUCCESS;
1005
316k
}
1006
1007
1008
/*
1009
  pull a ipv4address
1010
*/
1011
_PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
1012
5.62M
{
1013
5.62M
  uint32_t addr;
1014
5.62M
  struct in_addr in;
1015
5.62M
  NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &addr));
1016
5.62M
  in.s_addr = htonl(addr);
1017
5.62M
  *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
1018
5.62M
  NDR_ERR_HAVE_NO_MEMORY(*address);
1019
5.62M
  return NDR_ERR_SUCCESS;
1020
5.62M
}
1021
1022
/*
1023
  push a ipv4address
1024
*/
1025
_PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
1026
3.44M
{
1027
3.44M
  uint32_t addr;
1028
3.44M
  if (!is_ipaddress_v4(address)) {
1029
0
    return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
1030
0
              "Invalid IPv4 address: '%s'",
1031
0
              address);
1032
0
  }
1033
3.44M
  addr = inet_addr(address);
1034
3.44M
  NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
1035
3.44M
  return NDR_ERR_SUCCESS;
1036
3.44M
}
1037
1038
/*
1039
  print a ipv4address
1040
*/
1041
_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name,
1042
         const char *address)
1043
3.02M
{
1044
3.02M
  ndr->print(ndr, "%-25s: %s", name, address);
1045
3.02M
}
1046
1047
/*
1048
  pull a ipv6address
1049
*/
1050
15.8M
#define IPV6_BYTES 16
1051
#define IPV6_ADDR_STR_LEN 39
1052
_PUBLIC_ enum ndr_err_code ndr_pull_ipv6address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
1053
633k
{
1054
633k
  uint8_t addr[IPV6_BYTES];
1055
633k
  char *addr_str = talloc_strdup(ndr->current_mem_ctx, "");
1056
633k
  int i;
1057
633k
  NDR_ERR_HAVE_NO_MEMORY(addr_str);
1058
633k
  NDR_CHECK(ndr_pull_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
1059
10.7M
  for (i = 0; i < IPV6_BYTES; ++i) {
1060
10.1M
    addr_str = talloc_asprintf_append(addr_str, "%02x", addr[i]);
1061
10.1M
    NDR_ERR_HAVE_NO_MEMORY(addr_str);
1062
    /* We need a ':' every second byte but the last one */
1063
10.1M
    if (i%2 == 1 && i != (IPV6_BYTES - 1)) {
1064
4.43M
      addr_str = talloc_strdup_append(addr_str, ":");
1065
4.43M
      NDR_ERR_HAVE_NO_MEMORY(addr_str);
1066
4.43M
    }
1067
10.1M
  }
1068
633k
  *address = addr_str;
1069
633k
  NDR_ERR_HAVE_NO_MEMORY(*address);
1070
633k
  return NDR_ERR_SUCCESS;
1071
633k
}
1072
1073
/*
1074
  push a ipv6address
1075
*/
1076
_PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
1077
305k
{
1078
305k
#ifdef AF_INET6
1079
305k
  uint8_t addr[IPV6_BYTES];
1080
305k
  int ret;
1081
1082
305k
  if (!is_ipaddress(address)) {
1083
0
    return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS,
1084
0
              "Invalid IPv6 address: '%s'",
1085
0
              address);
1086
0
  }
1087
305k
  ret = inet_pton(AF_INET6, address, addr);
1088
305k
  if (ret <= 0) {
1089
0
    return NDR_ERR_IPV6ADDRESS;
1090
0
  }
1091
1092
305k
  NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
1093
1094
305k
  return NDR_ERR_SUCCESS;
1095
#else
1096
  return NDR_ERR_IPV6ADDRESS;
1097
#endif
1098
305k
}
1099
1100
/*
1101
  print a ipv6address
1102
*/
1103
_PUBLIC_ void ndr_print_ipv6address(struct ndr_print *ndr, const char *name,
1104
         const char *address)
1105
115k
{
1106
115k
  ndr->print(ndr, "%-25s: %s", name, address);
1107
115k
}
1108
#undef IPV6_BYTES
1109
1110
_PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
1111
50.0M
{
1112
50.0M
  ndr->print(ndr, "%s: struct %s", name, type);
1113
50.0M
}
1114
1115
_PUBLIC_ void ndr_print_null(struct ndr_print *ndr)
1116
0
{
1117
0
  ndr->print(ndr, "UNEXPECTED NULL POINTER");
1118
0
}
1119
1120
_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
1121
        const char *val, uint32_t value)
1122
11.7M
{
1123
11.7M
  if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
1124
6.83M
    ndr->print(ndr, "%-25s: %s (0x%"PRIX32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
1125
6.83M
  } else {
1126
4.91M
    ndr->print(ndr, "%-25s: %s (%"PRIu32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
1127
4.91M
  }
1128
11.7M
}
1129
1130
_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint64_t flag, uint64_t value)
1131
16.5M
{
1132
16.5M
  if (flag == 0) {
1133
4.88k
    return;
1134
4.88k
  }
1135
1136
  /* this is an attempt to support multi-bit bitmap masks */
1137
16.5M
  value &= flag;
1138
1139
153M
  while (!(flag & 1)) {
1140
136M
    flag >>= 1;
1141
136M
    value >>= 1;
1142
136M
  }
1143
16.5M
  if (flag == 1) {
1144
14.8M
    ndr->print(ndr, "   %"PRIu64": %-25s", value, flag_name);
1145
14.8M
  } else {
1146
1.63M
    ndr->print(ndr, "0x%02"PRIx64": %-25s (%"PRIu64")", value, flag_name, value);
1147
1.63M
  }
1148
16.5M
}
1149
1150
_PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
1151
0
{
1152
0
  if (NDR_HIDE_SECRET(ndr)) {
1153
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1154
0
    return;
1155
0
  }
1156
0
  ndr->print(ndr, "%-25s: %"PRId8, name, v);
1157
0
}
1158
1159
_PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
1160
72.9M
{
1161
72.9M
  if (NDR_HIDE_SECRET(ndr)) {
1162
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1163
0
    return;
1164
0
  }
1165
72.9M
  ndr->print(ndr, "%-25s: 0x%02"PRIx8" (%"PRIu8")", name, v, v);
1166
72.9M
}
1167
1168
_PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
1169
585
{
1170
585
  if (NDR_HIDE_SECRET(ndr)) {
1171
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1172
0
    return;
1173
0
  }
1174
585
  ndr->print(ndr, "%-25s: %"PRId16, name, v);
1175
585
}
1176
1177
_PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
1178
9.64M
{
1179
9.64M
  if (NDR_HIDE_SECRET(ndr)) {
1180
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1181
0
    return;
1182
0
  }
1183
9.64M
  ndr->print(ndr, "%-25s: 0x%04"PRIx16" (%"PRIu16")", name, v, v);
1184
9.64M
}
1185
1186
_PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
1187
2.91k
{
1188
2.91k
  if (NDR_HIDE_SECRET(ndr)) {
1189
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1190
0
    return;
1191
0
  }
1192
2.91k
  ndr->print(ndr, "%-25s: %"PRId32, name, v);
1193
2.91k
}
1194
1195
_PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
1196
45.6M
{
1197
45.6M
  if (NDR_HIDE_SECRET(ndr)) {
1198
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1199
0
    return;
1200
0
  }
1201
45.6M
  ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
1202
45.6M
}
1203
1204
_PUBLIC_ void ndr_print_int3264(struct ndr_print *ndr, const char *name, int32_t v)
1205
0
{
1206
0
  if (NDR_HIDE_SECRET(ndr)) {
1207
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1208
0
    return;
1209
0
  }
1210
0
  ndr->print(ndr, "%-25s: %"PRId32, name, v);
1211
0
}
1212
1213
_PUBLIC_ void ndr_print_uint3264(struct ndr_print *ndr, const char *name, uint32_t v)
1214
2.89k
{
1215
2.89k
  if (NDR_HIDE_SECRET(ndr)) {
1216
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1217
0
    return;
1218
0
  }
1219
2.89k
  ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
1220
2.89k
}
1221
1222
_PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
1223
525k
{
1224
525k
  ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRIu64")", name, v, v);
1225
525k
}
1226
1227
_PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
1228
284k
{
1229
284k
  ndr_print_udlong(ndr, name, v);
1230
284k
}
1231
1232
_PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
1233
2.73M
{
1234
2.73M
  if (NDR_HIDE_SECRET(ndr)) {
1235
0
    ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1236
0
    return;
1237
0
  }
1238
2.73M
  ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRId64")", name, v, v);
1239
2.73M
}
1240
1241
_PUBLIC_ void ndr_print_double(struct ndr_print *ndr, const char *name, double v)
1242
0
{
1243
0
  ndr->print(ndr, "%-25s: %f", name, v);
1244
0
}
1245
1246
_PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
1247
2.59M
{
1248
2.59M
  ndr_print_dlong(ndr, name, v);
1249
2.59M
}
1250
1251
_PUBLIC_ void ndr_print_int64(struct ndr_print *ndr, const char *name, int64_t v)
1252
124k
{
1253
124k
  ndr_print_dlong(ndr, name, v);
1254
124k
}
1255
1256
_PUBLIC_ void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
1257
173k
{
1258
173k
  ndr->print(ndr, "%-25s: %p", name, v);
1259
173k
}
1260
1261
_PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
1262
7.28M
{
1263
7.28M
  if (p) {
1264
1.61M
    ndr->print(ndr, "%-25s: *", name);
1265
5.67M
  } else {
1266
5.67M
    ndr->print(ndr, "%-25s: NULL", name);
1267
5.67M
  }
1268
7.28M
}
1269
1270
_PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
1271
446k
{
1272
446k
  ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
1273
446k
}
1274
1275
_PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
1276
4.22k
{
1277
  /* this is a standard NTTIME here
1278
   * as it's already converted in the pull/push code
1279
   */
1280
4.22k
  ndr_print_NTTIME(ndr, name, t);
1281
4.22k
}
1282
1283
_PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
1284
7.93k
{
1285
7.93k
  ndr_print_NTTIME(ndr, name, t);
1286
7.93k
}
1287
1288
_PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
1289
95.8k
{
1290
95.8k
  if (t == (time_t)-1 || t == 0) {
1291
87.8k
    ndr->print(ndr, "%-25s: (time_t)%" PRIi64, name, (int64_t)t);
1292
87.8k
  } else {
1293
8.04k
    ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t));
1294
8.04k
  }
1295
95.8k
}
1296
1297
_PUBLIC_ void ndr_print_uid_t(struct ndr_print *ndr, const char *name, uid_t u)
1298
3.14k
{
1299
3.14k
  ndr_print_dlong(ndr, name, u);
1300
3.14k
}
1301
1302
_PUBLIC_ void ndr_print_gid_t(struct ndr_print *ndr, const char *name, gid_t g)
1303
9.06k
{
1304
9.06k
  ndr_print_dlong(ndr, name, g);
1305
9.06k
}
1306
1307
_PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
1308
124M
{
1309
124M
  if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
1310
2.03M
    ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
1311
122M
  } else {
1312
122M
    ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
1313
122M
  }
1314
124M
}
1315
1316
_PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
1317
0
{
1318
0
  ndr->print(ndr, "UNKNOWN LEVEL %"PRIu16, level);
1319
0
}
1320
1321
_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
1322
         const uint8_t *data, uint32_t count)
1323
738k
{
1324
738k
  uint32_t i;
1325
2.52M
#define _ONELINE_LIMIT 32
1326
1327
738k
  if (data == NULL) {
1328
1.93k
    ndr->print(ndr, "%s: ARRAY(%"PRIu32") : NULL", name, count);
1329
1.93k
    return;
1330
1.93k
  }
1331
1332
736k
  if (NDR_HIDE_SECRET(ndr)) {
1333
13.5k
    ndr->print(ndr, "%s: ARRAY(%"PRIu32"): <REDACTED SECRET VALUES>", name, count);
1334
13.5k
    return;
1335
13.5k
  }
1336
1337
723k
  if (count <= _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
1338
182k
    char s[(_ONELINE_LIMIT + 1) * 2];
1339
341k
    for (i=0;i<count;i++) {
1340
158k
      snprintf(&s[i*2], 3, "%02"PRIx8, data[i]);
1341
158k
    }
1342
182k
    s[i*2] = 0;
1343
182k
    ndr->print(ndr, "%-25s: %s", name, s);
1344
182k
    return;
1345
182k
  }
1346
1347
540k
  ndr->print(ndr, "%s: ARRAY(%"PRIu32")", name, count);
1348
540k
  if (count > _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
1349
2.77k
    ndr_dump_data(ndr, data, count);
1350
2.77k
    return;
1351
2.77k
  }
1352
1353
537k
  ndr->depth++;
1354
72.3M
  for (i=0;i<count;i++) {
1355
71.8M
    char *idx=NULL;
1356
71.8M
    if (asprintf(&idx, "[%"PRIu32"]", i) != -1) {
1357
71.8M
      ndr_print_uint8(ndr, idx, data[i]);
1358
71.8M
      free(idx);
1359
71.8M
    }
1360
71.8M
  }
1361
537k
  ndr->depth--;
1362
537k
#undef _ONELINE_LIMIT
1363
537k
}
1364
1365
static void ndr_print_dump_data_cb(const char *buf, void *private_data)
1366
1.17G
{
1367
1.17G
  struct ndr_print *ndr = (struct ndr_print *)private_data;
1368
1369
1.17G
  ndr->print(ndr, "%s", buf);
1370
1.17G
}
1371
1372
/*
1373
  ndr_print version of dump_data()
1374
 */
1375
static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len)
1376
897k
{
1377
897k
  if (NDR_HIDE_SECRET(ndr)) {
1378
488
    return;
1379
488
  }
1380
897k
  ndr->no_newline = true;
1381
897k
  dump_data_cb(buf, len, true, ndr_print_dump_data_cb, ndr);
1382
897k
  ndr->no_newline = false;
1383
897k
}
1384
1385
1386
_PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
1387
3.61M
{
1388
3.61M
  ndr->print(ndr, "%-25s: DATA_BLOB length=%zu", name, r.length);
1389
3.61M
  if (r.length) {
1390
895k
    ndr_dump_data(ndr, r.data, r.length);
1391
895k
  }
1392
3.61M
}
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
_PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, ndr_flags_type ndr_flags, DATA_BLOB blob)
1406
3.55M
{
1407
3.55M
  static const uint8_t padding[8] = { 0, };
1408
1409
3.55M
  if (ndr->flags & LIBNDR_FLAG_REMAINING) {
1410
    /* nothing to do */
1411
1.89M
  } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
1412
834k
    blob.data = discard_const_p(uint8_t, padding);
1413
834k
    if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
1414
74.1k
      blob.length = NDR_ALIGN(ndr, 2);
1415
760k
    } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
1416
754k
      blob.length = NDR_ALIGN(ndr, 4);
1417
754k
    } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
1418
5.79k
      blob.length = NDR_ALIGN(ndr, 8);
1419
5.79k
    } else {
1420
0
      return ndr_push_error(ndr,
1421
0
                NDR_ERR_LENGTH,
1422
0
                "Invalid align flags");
1423
0
    }
1424
834k
  } else {
1425
818k
    NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, blob.length));
1426
818k
  }
1427
3.55M
  NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
1428
3.55M
  return NDR_ERR_SUCCESS;
1429
3.55M
}
1430
1431
/*
1432
 * Pull a DATA_BLOB from the wire.
1433
 * 1) when called with LIBNDR_FLAG_ALIGN* alignment flags set, pull padding
1434
 *    bytes _only_. The length is determined by the alignment required and the
1435
 *    current ndr offset.
1436
 * 2) When called with the LIBNDR_FLAG_REMAINING flag, pull all remaining bytes
1437
 *    from the ndr buffer.
1438
 * 3) Otherwise, pull a uint3264 length _and_ a corresponding byte array from the
1439
 *    ndr buffer.
1440
 */
1441
_PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, ndr_flags_type ndr_flags, DATA_BLOB *blob)
1442
5.83M
{
1443
5.83M
  uint32_t length = 0;
1444
1445
5.83M
  if (ndr->flags & LIBNDR_FLAG_REMAINING) {
1446
1.62M
    length = ndr->data_size - ndr->offset;
1447
4.21M
  } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
1448
2.56M
    if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
1449
372k
      length = NDR_ALIGN(ndr, 2);
1450
2.18M
    } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
1451
2.18M
      length = NDR_ALIGN(ndr, 4);
1452
2.18M
    } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
1453
5.79k
      length = NDR_ALIGN(ndr, 8);
1454
5.79k
    }
1455
2.56M
    if (ndr->data_size - ndr->offset < length) {
1456
6.14k
      length = ndr->data_size - ndr->offset;
1457
6.14k
    }
1458
2.56M
  } else {
1459
1.64M
    NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length));
1460
1.64M
  }
1461
5.83M
  if (length == 0) {
1462
    /* skip the talloc for an empty blob */
1463
3.64M
    blob->data = NULL;
1464
3.64M
    blob->length = 0;
1465
3.64M
    return NDR_ERR_SUCCESS;
1466
3.64M
  }
1467
2.18M
  NDR_PULL_NEED_BYTES(ndr, length);
1468
2.18M
  *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
1469
2.18M
  ndr->offset += length;
1470
2.18M
  return NDR_ERR_SUCCESS;
1471
2.18M
}
1472
1473
_PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, ndr_flags_type flags)
1474
120k
{
1475
120k
  if (!data) return ret;
1476
10.3k
  return ret + data->length;
1477
120k
}
1478
1479
_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
1480
0
{
1481
0
  ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
1482
0
}
1483
1484
_PUBLIC_ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
1485
734
{
1486
734
  switch (ndr_err) {
1487
0
  case NDR_ERR_SUCCESS:
1488
0
    return NT_STATUS_OK;
1489
406
  case NDR_ERR_BUFSIZE:
1490
406
    return NT_STATUS_BUFFER_TOO_SMALL;
1491
0
  case NDR_ERR_TOKEN:
1492
0
    return NT_STATUS_INTERNAL_ERROR;
1493
0
  case NDR_ERR_ALLOC:
1494
0
    return NT_STATUS_NO_MEMORY;
1495
0
  case NDR_ERR_ARRAY_SIZE:
1496
0
    return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
1497
0
  case NDR_ERR_INVALID_POINTER:
1498
0
    return NT_STATUS_INVALID_PARAMETER_MIX;
1499
0
  case NDR_ERR_UNREAD_BYTES:
1500
0
    return NT_STATUS_PORT_MESSAGE_TOO_LONG;
1501
328
  default:
1502
328
    break;
1503
734
  }
1504
1505
  /* we should map all error codes to different status codes */
1506
328
  return NT_STATUS_INVALID_PARAMETER;
1507
734
}
1508
1509
_PUBLIC_ int ndr_map_error2errno(enum ndr_err_code ndr_err)
1510
0
{
1511
0
  switch (ndr_err) {
1512
0
  case NDR_ERR_SUCCESS:
1513
0
    return 0;
1514
0
  case NDR_ERR_BUFSIZE:
1515
0
    return ENOSPC;
1516
0
  case NDR_ERR_TOKEN:
1517
0
    return EINVAL;
1518
0
  case NDR_ERR_ALLOC:
1519
0
    return ENOMEM;
1520
0
  case NDR_ERR_ARRAY_SIZE:
1521
0
    return EMSGSIZE;
1522
0
  case NDR_ERR_INVALID_POINTER:
1523
0
    return EINVAL;
1524
0
  case NDR_ERR_UNREAD_BYTES:
1525
0
    return EOVERFLOW;
1526
0
  default:
1527
0
    break;
1528
0
  }
1529
1530
  /* we should map all error codes to different status codes */
1531
0
  return EINVAL;
1532
0
}
1533
1534
_PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
1535
               ndr_flags_type ndr_flags,
1536
               const struct timespec *t)
1537
64
{
1538
64
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
1539
64
  NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
1540
64
  NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
1541
64
  return NDR_ERR_SUCCESS;
1542
64
}
1543
1544
_PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
1545
               ndr_flags_type ndr_flags,
1546
               struct timespec *t)
1547
514
{
1548
514
  uint64_t secs = 0;
1549
514
  uint32_t nsecs = 0;
1550
514
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
1551
514
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
1552
505
  NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
1553
504
  t->tv_sec = secs;
1554
504
  t->tv_nsec = nsecs;
1555
504
  return NDR_ERR_SUCCESS;
1556
505
}
1557
1558
_PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
1559
         const struct timespec *t)
1560
32
{
1561
32
  char *str = timestring(ndr, t->tv_sec);
1562
32
  ndr->print(ndr, "%-25s: %s.%ld", name, str, t->tv_nsec);
1563
32
  TALLOC_FREE(str);
1564
32
}
1565
1566
_PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
1567
              ndr_flags_type ndr_flags,
1568
              const struct timeval *t)
1569
84
{
1570
84
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
1571
84
  NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
1572
84
  NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
1573
84
  return NDR_ERR_SUCCESS;
1574
84
}
1575
1576
_PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
1577
              ndr_flags_type ndr_flags,
1578
              struct timeval *t)
1579
94
{
1580
94
  uint64_t secs = 0;
1581
94
  uint32_t usecs = 0;
1582
94
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
1583
94
  NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
1584
90
  NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
1585
89
  t->tv_sec = secs;
1586
89
  t->tv_usec = usecs;
1587
89
  return NDR_ERR_SUCCESS;
1588
90
}
1589
1590
_PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
1591
        const struct timeval *t)
1592
42
{
1593
42
  ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
1594
42
       (long)t->tv_usec);
1595
42
}
1596
1597
_PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name,
1598
               libndr_flags flags)
1599
149k
{
1600
149k
  ndr->print(ndr, "%-25s: 0x%016"PRI_LIBNDR_FLAGS" (%"PRI_LIBNDR_FLAGS_DECIMAL")", name, flags, flags);
1601
149k
}