Coverage Report

Created: 2026-05-24 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/librpc/ndr/ndr_ntprinting.c
Line
Count
Source
1
/*
2
   Unix SMB/CIFS implementation.
3
4
   routines for marshalling/unmarshalling special ntprinting structures
5
6
   Copyright (C) Guenther Deschner 2010
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 "includes.h"
23
#include "../librpc/gen_ndr/ndr_ntprinting.h"
24
25
_PUBLIC_ libndr_flags ndr_ntprinting_string_flags(libndr_flags string_flags)
26
537k
{
27
537k
  libndr_flags flags = LIBNDR_FLAG_STR_NULLTERM;
28
29
537k
  if (string_flags & LIBNDR_FLAG_STR_ASCII) {
30
0
    flags |= LIBNDR_FLAG_STR_ASCII;
31
537k
  } else if (string_flags & LIBNDR_FLAG_STR_RAW8) {
32
0
    flags |= LIBNDR_FLAG_STR_RAW8;
33
537k
  } else {
34
537k
    flags |= LIBNDR_FLAG_STR_UTF8;
35
537k
  }
36
37
537k
  return flags;
38
537k
}
39
40
_PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct ntprinting_printer *r)
41
473
{
42
473
  uint32_t _ptr_devmode;
43
473
  TALLOC_CTX *_mem_save_devmode_0;
44
473
  {
45
473
    libndr_flags _flags_save_STRUCT = ndr->flags;
46
473
    ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
47
473
    if (ndr_flags & NDR_SCALARS) {
48
473
      NDR_CHECK(ndr_pull_align(ndr, 5));
49
473
      NDR_CHECK(ndr_pull_ntprinting_printer_info(ndr, NDR_SCALARS, &r->info));
50
440
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
51
437
      if (_ptr_devmode) {
52
105
        NDR_PULL_ALLOC(ndr, r->devmode);
53
332
      } else {
54
332
        r->devmode = NULL;
55
332
      }
56
437
    }
57
437
    if (ndr_flags & NDR_BUFFERS) {
58
437
      if (r->devmode) {
59
105
        _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
60
105
        NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
61
105
        r->devmode->string_flags = r->info.string_flags;
62
105
        NDR_CHECK(ndr_pull_ntprinting_devicemode(ndr, NDR_SCALARS|NDR_BUFFERS, r->devmode));
63
30
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
64
30
      }
65
437
    }
66
362
    if (ndr_flags & NDR_SCALARS) {
67
362
      r->count = 0;
68
362
      NDR_PULL_ALLOC_N(ndr, r->printer_data, r->count);
69
183k
      while (ndr->offset + 4 <= ndr->data_size) {
70
183k
        uint32_t ptr = 0;
71
183k
        ptr = IVAL(ndr->data, ndr->offset);
72
183k
        if (ptr == 0) {
73
26
          ndr->offset = ndr->offset + 4;
74
26
          break;
75
26
        }
76
183k
        r->printer_data = talloc_realloc(ndr, r->printer_data, struct ntprinting_printer_data, r->count + 1);
77
183k
        NDR_ERR_HAVE_NO_MEMORY(r->printer_data);
78
183k
        r->printer_data[r->count].string_flags = r->info.string_flags;
79
183k
        NDR_CHECK(ndr_pull_ntprinting_printer_data(ndr, NDR_SCALARS, &r->printer_data[r->count]));
80
183k
        r->count++;
81
183k
      }
82
240
      NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
83
240
    }
84
240
    ndr->flags = _flags_save_STRUCT;
85
240
  }
86
0
  return NDR_ERR_SUCCESS;
87
362
}