Coverage Report

Created: 2026-09-03 07:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/librpc/ndr/ndr_negoex.c
Line
Count
Source
1
/*
2
   Unix SMB/CIFS implementation.
3
4
   routines for marshalling/unmarshalling special NEGOEX structures
5
6
   Copyright (C) Stefan Metzmacher 2015
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
#include "includes.h"
22
#include "librpc/gen_ndr/ndr_negoex.h"
23
#include "librpc/gen_ndr/ndr_misc.h"
24
#include "librpc/ndr/ndr_negoex.h"
25
26
void ndr_print_negoex_BYTE_VECTOR(struct ndr_print *ndr, const char *name, const struct negoex_BYTE_VECTOR *r)
27
153k
{
28
153k
  ndr_print_struct(ndr, name, "negoex_BYTE_VECTOR");
29
153k
  if (r == NULL) { ndr_print_null(ndr); return; }
30
153k
  ndr->depth++;
31
153k
  ndr_print_DATA_BLOB(ndr, "blob", r->blob);
32
153k
  ndr->depth--;
33
153k
}
34
35
enum ndr_err_code ndr_push_negoex_BYTE_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_BYTE_VECTOR *r)
36
611k
{
37
611k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
38
611k
  if (ndr_flags & NDR_SCALARS) {
39
305k
    NDR_CHECK(ndr_push_align(ndr, 5));
40
305k
    NDR_CHECK(ndr_push_relative_ptr1(ndr, r->blob.data));
41
305k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->blob.length));
42
305k
    NDR_CHECK(ndr_push_trailer_align(ndr, 5));
43
305k
  }
44
611k
  if (ndr_flags & NDR_BUFFERS) {
45
305k
    if (r->blob.data) {
46
83.9k
      NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->blob.data));
47
#if 0
48
      NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->blob.length));
49
#endif
50
83.9k
      NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->blob.data, r->blob.length));
51
83.9k
      NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->blob.data));
52
83.9k
    }
53
305k
  }
54
611k
  return NDR_ERR_SUCCESS;
55
611k
}
56
57
enum ndr_err_code ndr_pull_negoex_BYTE_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_BYTE_VECTOR *r)
58
318k
{
59
318k
  uint32_t _ptr_data;
60
318k
  uint32_t size_data_1 = 0;
61
318k
  TALLOC_CTX *_mem_save_data_0 = NULL;
62
318k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
63
318k
  r->_dummy = NULL;
64
318k
  if (ndr_flags & NDR_SCALARS) {
65
163k
    NDR_CHECK(ndr_pull_align(ndr, 5));
66
163k
    NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
67
163k
    if (_ptr_data) {
68
47.5k
      NDR_PULL_ALLOC(ndr, r->blob.data);
69
47.5k
      NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->blob.data, _ptr_data));
70
116k
    } else {
71
116k
      r->blob.data = NULL;
72
116k
    }
73
163k
    r->blob.length = 0;
74
163k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &size_data_1));
75
163k
    r->_length = size_data_1;
76
163k
    NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
77
163k
  }
78
317k
  if (ndr_flags & NDR_BUFFERS) {
79
154k
    if (r->blob.data) {
80
42.8k
      uint32_t _relative_save_offset;
81
42.8k
      _relative_save_offset = ndr->offset;
82
42.8k
      NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->blob.data));
83
42.8k
      _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
84
42.8k
      NDR_PULL_SET_MEM_CTX(ndr, r->blob.data, 0);
85
#if 0
86
      NDR_CHECK(ndr_pull_array_size(ndr, &r->blob.data));
87
      size_data_1 = ndr_get_array_size(ndr, &r->blob.data);
88
#else
89
42.8k
      size_data_1 = r->_length;
90
42.8k
#endif
91
42.8k
      NDR_PULL_ALLOC_N(ndr, r->blob.data, size_data_1);
92
42.8k
      NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->blob.data, size_data_1));
93
42.7k
      r->blob.length = size_data_1;
94
42.7k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0);
95
42.7k
      if (ndr->offset > ndr->relative_highest_offset) {
96
16.0k
        ndr->relative_highest_offset = ndr->offset;
97
16.0k
      }
98
42.7k
      ndr->offset = _relative_save_offset;
99
42.7k
    }
100
#if 0
101
    if (r->blob.data) {
102
      NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->blob.data, r->blob.length));
103
    }
104
#endif
105
154k
  }
106
317k
  return NDR_ERR_SUCCESS;
107
317k
}
108
109
enum ndr_err_code ndr_push_negoex_AUTH_SCHEME_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_AUTH_SCHEME_VECTOR *r)
110
9.36k
{
111
9.36k
  uint32_t cntr_array_1;
112
9.36k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
113
9.36k
  if (ndr_flags & NDR_SCALARS) {
114
4.68k
    NDR_CHECK(ndr_push_align(ndr, 5));
115
4.68k
    NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array));
116
4.68k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
117
4.68k
    NDR_CHECK(ndr_push_trailer_align(ndr, 5));
118
4.68k
  }
119
9.36k
  if (ndr_flags & NDR_BUFFERS) {
120
4.68k
    if (r->array) {
121
4.26k
      NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array));
122
#if 0
123
      NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
124
#endif
125
82.2k
      for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) {
126
78.0k
        NDR_CHECK(ndr_push_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
127
78.0k
      }
128
4.26k
      NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array));
129
4.26k
    }
130
4.68k
  }
131
9.36k
  return NDR_ERR_SUCCESS;
132
9.36k
}
133
134
enum ndr_err_code ndr_pull_negoex_AUTH_SCHEME_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_AUTH_SCHEME_VECTOR *r)
135
5.30k
{
136
5.30k
  uint32_t _ptr_array;
137
5.30k
  uint32_t size_array_1 = 0;
138
5.30k
  uint32_t cntr_array_1;
139
5.30k
  TALLOC_CTX *_mem_save_array_0 = NULL;
140
5.30k
  TALLOC_CTX *_mem_save_array_1 = NULL;
141
5.30k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
142
5.30k
  if (ndr_flags & NDR_SCALARS) {
143
2.70k
    NDR_CHECK(ndr_pull_align(ndr, 5));
144
2.70k
    NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array));
145
2.70k
    if (_ptr_array) {
146
2.40k
      NDR_PULL_ALLOC(ndr, r->array);
147
2.40k
      NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array));
148
2.40k
    } else {
149
300
      r->array = NULL;
150
300
    }
151
2.64k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
152
2.64k
    NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
153
2.64k
  }
154
5.24k
  if (ndr_flags & NDR_BUFFERS) {
155
2.60k
    if (r->array) {
156
2.32k
      uint32_t _relative_save_offset;
157
2.32k
      _relative_save_offset = ndr->offset;
158
2.32k
      NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array));
159
2.32k
      _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
160
2.32k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
161
#if 0
162
      NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
163
      size_array_1 = ndr_get_array_size(ndr, &r->array);
164
#else
165
2.32k
      size_array_1 = r->count;
166
2.32k
#endif
167
2.32k
      NDR_PULL_ALLOC_N(ndr, r->array, size_array_1);
168
2.32k
      _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr);
169
2.32k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
170
208k
      for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) {
171
206k
        NDR_CHECK(ndr_pull_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
172
206k
      }
173
2.25k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0);
174
2.25k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0);
175
2.25k
      if (ndr->offset > ndr->relative_highest_offset) {
176
2.25k
        ndr->relative_highest_offset = ndr->offset;
177
2.25k
      }
178
2.25k
      ndr->offset = _relative_save_offset;
179
2.25k
    }
180
#if 0
181
    if (r->array) {
182
      NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count));
183
    }
184
#endif
185
2.60k
  }
186
5.17k
  return NDR_ERR_SUCCESS;
187
5.24k
}
188
189
enum ndr_err_code ndr_push_negoex_EXTENSION_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_EXTENSION_VECTOR *r)
190
9.36k
{
191
9.36k
  uint32_t cntr_array_1;
192
9.36k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
193
9.36k
  if (ndr_flags & NDR_SCALARS) {
194
4.68k
    NDR_CHECK(ndr_push_align(ndr, 5));
195
4.68k
    NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array));
196
4.68k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
197
4.68k
    NDR_CHECK(ndr_push_trailer_align(ndr, 5));
198
4.68k
  }
199
9.36k
  if (ndr_flags & NDR_BUFFERS) {
200
4.68k
    if (r->array) {
201
4.35k
      NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array));
202
#if 0
203
      NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
204
#endif
205
195k
      for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) {
206
191k
        NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
207
191k
      }
208
195k
      for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) {
209
191k
        NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1]));
210
191k
      }
211
4.35k
      NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array));
212
4.35k
    }
213
4.68k
  }
214
9.36k
  return NDR_ERR_SUCCESS;
215
9.36k
}
216
217
enum ndr_err_code ndr_pull_negoex_EXTENSION_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_EXTENSION_VECTOR *r)
218
5.17k
{
219
5.17k
  uint32_t _ptr_array;
220
5.17k
  uint32_t size_array_1 = 0;
221
5.17k
  uint32_t cntr_array_1;
222
5.17k
  TALLOC_CTX *_mem_save_array_0 = NULL;
223
5.17k
  TALLOC_CTX *_mem_save_array_1 = NULL;
224
5.17k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
225
5.17k
  if (ndr_flags & NDR_SCALARS) {
226
2.64k
    NDR_CHECK(ndr_pull_align(ndr, 5));
227
2.64k
    NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array));
228
2.63k
    if (_ptr_array) {
229
2.41k
      NDR_PULL_ALLOC(ndr, r->array);
230
2.41k
      NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array));
231
2.41k
    } else {
232
224
      r->array = NULL;
233
224
    }
234
2.60k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
235
2.60k
    NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
236
2.60k
  }
237
5.12k
  if (ndr_flags & NDR_BUFFERS) {
238
2.52k
    if (r->array) {
239
2.34k
      uint32_t _relative_save_offset;
240
2.34k
      _relative_save_offset = ndr->offset;
241
2.34k
      NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array));
242
2.34k
      _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
243
2.34k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
244
#if 0
245
      NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
246
      size_array_1 = ndr_get_array_size(ndr, &r->array);
247
#else
248
2.34k
      size_array_1 = r->count;
249
2.34k
#endif
250
2.34k
      NDR_PULL_ALLOC_N(ndr, r->array, size_array_1);
251
2.33k
      _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr);
252
2.33k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
253
107k
      for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) {
254
105k
        NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
255
105k
      }
256
98.2k
      for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) {
257
95.9k
        NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1]));
258
95.9k
      }
259
2.29k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0);
260
2.29k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0);
261
2.29k
      if (ndr->offset > ndr->relative_highest_offset) {
262
105
        ndr->relative_highest_offset = ndr->offset;
263
105
      }
264
2.29k
      ndr->offset = _relative_save_offset;
265
2.29k
    }
266
#if 0
267
    if (r->array) {
268
      NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count));
269
    }
270
#endif
271
2.52k
  }
272
5.07k
  return NDR_ERR_SUCCESS;
273
5.12k
}
274
275
enum ndr_err_code ndr_push_negoex_ALERT_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_ALERT_VECTOR *r)
276
524k
{
277
524k
  uint32_t cntr_array_1;
278
524k
  NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
279
524k
  if (ndr_flags & NDR_SCALARS) {
280
262k
    NDR_CHECK(ndr_push_align(ndr, 5));
281
262k
    NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array));
282
262k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
283
262k
    NDR_CHECK(ndr_push_trailer_align(ndr, 5));
284
262k
  }
285
524k
  if (ndr_flags & NDR_BUFFERS) {
286
262k
    if (r->array) {
287
142k
      NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array));
288
#if 0
289
      NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
290
#endif
291
252k
      for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) {
292
110k
        NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
293
110k
      }
294
252k
      for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) {
295
110k
        NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1]));
296
110k
      }
297
142k
      NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array));
298
142k
    }
299
262k
  }
300
524k
  return NDR_ERR_SUCCESS;
301
524k
}
302
303
enum ndr_err_code ndr_pull_negoex_ALERT_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_ALERT_VECTOR *r)
304
263k
{
305
263k
  uint32_t _ptr_array;
306
263k
  uint32_t size_array_1 = 0;
307
263k
  uint32_t cntr_array_1;
308
263k
  TALLOC_CTX *_mem_save_array_0 = NULL;
309
263k
  TALLOC_CTX *_mem_save_array_1 = NULL;
310
263k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
311
263k
  if (ndr_flags & NDR_SCALARS) {
312
132k
    NDR_CHECK(ndr_pull_align(ndr, 5));
313
132k
    NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array));
314
131k
    if (_ptr_array) {
315
71.3k
      NDR_PULL_ALLOC(ndr, r->array);
316
71.3k
      NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array));
317
71.3k
    } else {
318
60.6k
      r->array = NULL;
319
60.6k
    }
320
131k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
321
131k
    NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
322
131k
  }
323
263k
  if (ndr_flags & NDR_BUFFERS) {
324
131k
    if (r->array) {
325
71.3k
      uint32_t _relative_save_offset;
326
71.3k
      _relative_save_offset = ndr->offset;
327
71.3k
      NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array));
328
71.3k
      _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
329
71.3k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
330
#if 0
331
      NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
332
      size_array_1 = ndr_get_array_size(ndr, &r->array);
333
#else
334
71.3k
      size_array_1 = r->count;
335
71.3k
#endif
336
71.3k
      NDR_PULL_ALLOC_N(ndr, r->array, size_array_1);
337
71.3k
      _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr);
338
71.3k
      NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
339
127k
      for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) {
340
55.9k
        NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1]));
341
55.9k
      }
342
126k
      for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) {
343
55.5k
        NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1]));
344
55.5k
      }
345
71.3k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0);
346
71.3k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0);
347
71.3k
      if (ndr->offset > ndr->relative_highest_offset) {
348
61.7k
        ndr->relative_highest_offset = ndr->offset;
349
61.7k
      }
350
71.3k
      ndr->offset = _relative_save_offset;
351
71.3k
    }
352
#if 0
353
    if (r->array) {
354
      NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count));
355
    }
356
#endif
357
131k
  }
358
263k
  return NDR_ERR_SUCCESS;
359
263k
}
360
361
size_t ndr_negoex_MESSAGE_header_length(const struct negoex_MESSAGE *r)
362
270k
{
363
270k
  size_t size = 0;
364
365
270k
  size += 8;  /* signature */
366
270k
  size += 4;  /* type */
367
270k
  size += 4;  /* sequence_number */
368
270k
  size += 4;  /* header_length */
369
270k
  size += 4;  /* message_length */
370
270k
  size += 16; /* conversation_id */
371
372
270k
  switch (r->type) {
373
1.64k
  case NEGOEX_MESSAGE_TYPE_INITIATOR_NEGO:
374
4.68k
  case NEGOEX_MESSAGE_TYPE_ACCEPTOR_NEGO:
375
4.68k
    size += 32; /* random */
376
4.68k
    size += 8;  /* protocol_version */
377
4.68k
    size += 8;  /* auth_schemes */
378
4.68k
    size += 8;  /* extensions */
379
4.68k
    break;
380
381
968
  case NEGOEX_MESSAGE_TYPE_INITIATOR_META_DATA:
382
2.10k
  case NEGOEX_MESSAGE_TYPE_ACCEPTOR_META_DATA:
383
2.69k
  case NEGOEX_MESSAGE_TYPE_CHALLENGE:
384
2.85k
  case NEGOEX_MESSAGE_TYPE_AP_REQUEST:
385
2.85k
    size += 16; /* auth_scheme */
386
2.85k
    size += 8;  /* exchange */
387
2.85k
    break;
388
389
684
  case NEGOEX_MESSAGE_TYPE_VERIFY:
390
684
    size += 16; /* auth_scheme */
391
684
    size += 4;  /* checksum.header_length */
392
684
    size += 4;  /* checksum.scheme */
393
684
    size += 4;  /* checksum.type */
394
684
    size += 8;  /* checksum.value */
395
684
    break;
396
397
262k
  case NEGOEX_MESSAGE_TYPE_ALERT:
398
262k
    size += 16; /* auth_scheme */
399
262k
    size += 4;  /* status */
400
262k
    size += 8;  /* alerts */
401
262k
    break;
402
270k
  }
403
404
270k
  return size;
405
270k
}
406
407
enum ndr_err_code ndr_pull_negoex_MESSAGE(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_MESSAGE *r)
408
137k
{
409
137k
  uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);
410
137k
  uint32_t size_signature_0 = 0;
411
137k
  uint32_t start_data_size = ndr->data_size;
412
137k
  uint32_t saved_offset = 0;
413
137k
  NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
414
137k
  if (ndr_flags & NDR_SCALARS) {
415
137k
    NDR_CHECK(ndr_pull_align(ndr, 5));
416
137k
    NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
417
137k
    size_signature_0 = 8;
418
137k
    NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->signature, size_signature_0, sizeof(uint8_t), CH_DOS));
419
137k
    NDR_CHECK(ndr_pull_negoex_MESSAGE_TYPE(ndr, NDR_SCALARS, &r->type));
420
137k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sequence_number));
421
137k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->header_length));
422
137k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->message_length));
423
137k
    saved_offset = ndr->offset;
424
137k
    ndr->offset = ndr->relative_base_offset;
425
137k
    NDR_PULL_NEED_BYTES(ndr, r->message_length);
426
137k
    ndr->data_size = ndr->offset + r->message_length;
427
137k
    ndr->offset = saved_offset;
428
137k
    NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->conversation_id));
429
137k
    NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type));
430
137k
    NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_SCALARS, &r->p));
431
136k
    NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
432
136k
    ndr->offset = ndr->data_size;
433
136k
    ndr->data_size = start_data_size;
434
136k
  }
435
136k
  if (ndr_flags & NDR_BUFFERS) {
436
136k
    NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
437
136k
    saved_offset = ndr->offset;
438
136k
    ndr->offset = ndr->relative_base_offset;
439
136k
    NDR_PULL_NEED_BYTES(ndr, r->message_length);
440
136k
    ndr->data_size = ndr->offset + r->message_length;
441
136k
    ndr->offset = saved_offset;
442
136k
    NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type));
443
136k
    NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_BUFFERS, &r->p));
444
136k
    ndr->offset = ndr->data_size;
445
136k
    ndr->data_size = start_data_size;
446
136k
  }
447
136k
  ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
448
136k
  return NDR_ERR_SUCCESS;
449
136k
}
450
451
enum ndr_err_code ndr_push_negoex_MESSAGE_ARRAY(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_MESSAGE_ARRAY *r)
452
16.1k
{
453
16.1k
  uint32_t cntr_messages_0;
454
16.1k
  {
455
16.1k
    libndr_flags _flags_save_STRUCT = ndr->flags;
456
16.1k
    ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
457
16.1k
    NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
458
16.1k
    if (ndr_flags & NDR_SCALARS) {
459
16.1k
      NDR_CHECK(ndr_push_align(ndr, 5));
460
150k
      for (cntr_messages_0 = 0; cntr_messages_0 < (r->count); cntr_messages_0++) {
461
134k
        NDR_CHECK(ndr_push_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0]));
462
134k
      }
463
16.1k
      NDR_CHECK(ndr_push_trailer_align(ndr, 5));
464
16.1k
    }
465
16.1k
    ndr->flags = _flags_save_STRUCT;
466
16.1k
  }
467
0
  return NDR_ERR_SUCCESS;
468
16.1k
}
469
470
enum ndr_err_code ndr_pull_negoex_MESSAGE_ARRAY(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_MESSAGE_ARRAY *r)
471
16.5k
{
472
16.5k
  uint32_t size_messages_0 = 0;
473
16.5k
  uint32_t cntr_messages_0;
474
16.5k
  TALLOC_CTX *_mem_save_messages_0 = NULL;
475
16.5k
  {
476
16.5k
    libndr_flags _flags_save_STRUCT = ndr->flags;
477
16.5k
    ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
478
16.5k
    NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
479
16.5k
    if (ndr_flags & NDR_SCALARS) {
480
16.5k
      uint32_t saved_offset = ndr->offset;
481
16.5k
      uint32_t available = 0;
482
16.5k
      NDR_CHECK(ndr_pull_align(ndr, 5));
483
16.5k
      r->count = 0;
484
16.5k
      available = ndr->data_size - ndr->offset;
485
247k
      while (available > 0) {
486
231k
        uint32_t length;
487
488
        /*
489
         * The common header is 40 bytes
490
         * and message_length is at offset 20
491
         */
492
231k
        NDR_PULL_NEED_BYTES(ndr, 40);
493
231k
        ndr->offset += 20;
494
231k
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length));
495
231k
        ndr->offset -= 24;
496
231k
        if (length < 40) {
497
          /*
498
           * let the pull function catch the error
499
           */
500
93.6k
          length = 40;
501
93.6k
        }
502
231k
        NDR_PULL_NEED_BYTES(ndr, length);
503
231k
        ndr->offset += length;
504
231k
        available -= length;
505
231k
        r->count++;
506
231k
      }
507
16.3k
      ndr->offset = saved_offset;
508
16.3k
      size_messages_0 = r->count;
509
16.3k
      NDR_PULL_ALLOC_N(ndr, r->messages, size_messages_0);
510
16.3k
      _mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr);
511
16.3k
      NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0);
512
152k
      for (cntr_messages_0 = 0; cntr_messages_0 < (size_messages_0); cntr_messages_0++) {
513
136k
        NDR_CHECK(ndr_pull_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0]));
514
136k
      }
515
16.1k
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0);
516
16.1k
      NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
517
16.1k
    }
518
16.1k
    ndr->flags = _flags_save_STRUCT;
519
16.1k
  }
520
0
  return NDR_ERR_SUCCESS;
521
16.5k
}