Coverage Report

Created: 2026-02-14 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/librpc/ndr/ndr_krb5pac.c
Line
Count
Source
1
/* 
2
   Unix SMB/CIFS implementation.
3
4
   routines for marshalling/unmarshalling spoolss subcontext buffer structures
5
6
   Copyright (C) Stefan Metzmacher 2005
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
23
#include "includes.h"
24
#include "librpc/gen_ndr/ndr_krb5pac.h"
25
26
size_t _ndr_size_PAC_INFO(const union PAC_INFO *r, uint32_t level, libndr_flags flags)
27
73.5k
{
28
73.5k
  size_t s = ndr_size_PAC_INFO(r, level, flags);
29
73.5k
  switch (level) {
30
214
    case PAC_TYPE_LOGON_INFO:
31
214
      return NDR_ROUND(s,8);
32
16.3k
    case PAC_TYPE_UPN_DNS_INFO:
33
16.3k
      return NDR_ROUND(s,8);
34
56.9k
    default:
35
56.9k
      return s;
36
73.5k
  }
37
73.5k
}
38
39
enum ndr_err_code ndr_push_PAC_BUFFER(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct PAC_BUFFER *r)
40
88.7k
{
41
88.7k
  if (ndr_flags & NDR_SCALARS) {
42
44.7k
    NDR_CHECK(ndr_push_align(ndr, 4));
43
44.7k
    NDR_CHECK(ndr_push_PAC_TYPE(ndr, NDR_SCALARS, r->type));
44
44.7k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, _ndr_size_PAC_INFO(r->info,r->type,LIBNDR_FLAG_ALIGN8)));
45
44.7k
    {
46
44.7k
      libndr_flags _flags_save_PAC_INFO = ndr->flags;
47
44.7k
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8);
48
44.7k
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->info));
49
44.7k
      ndr->flags = _flags_save_PAC_INFO;
50
44.7k
    }
51
44.7k
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
52
44.7k
  }
53
88.7k
  if (ndr_flags & NDR_BUFFERS) {
54
44.5k
    {
55
44.5k
      libndr_flags _flags_save_PAC_INFO = ndr->flags;
56
44.5k
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8);
57
44.5k
      if (r->info) {
58
28.8k
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->info));
59
28.8k
        {
60
28.8k
          struct ndr_push *_ndr_info_pad;
61
28.8k
          struct ndr_push *_ndr_info;
62
28.8k
          size_t _ndr_size = _ndr_size_PAC_INFO(r->info, r->type, LIBNDR_FLAG_ALIGN8);
63
28.8k
          NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info_pad, 0, NDR_ROUND(_ndr_size, 8)));
64
28.8k
          NDR_CHECK(ndr_push_subcontext_start(_ndr_info_pad, &_ndr_info, 0, _ndr_size));
65
28.8k
          NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->info, r->type));
66
28.8k
          NDR_CHECK(ndr_push_PAC_INFO(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->info));
67
28.8k
          NDR_CHECK(ndr_push_subcontext_end(_ndr_info_pad, _ndr_info, 0, _ndr_size));
68
28.8k
          NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info_pad, 0, NDR_ROUND(_ndr_size, 8)));
69
28.8k
        }
70
28.8k
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->info));
71
28.8k
      }
72
44.5k
      ndr->flags = _flags_save_PAC_INFO;
73
44.5k
    }
74
44.5k
  }
75
88.7k
  return NDR_ERR_SUCCESS;
76
88.7k
}
77
78
enum ndr_err_code ndr_pull_PAC_BUFFER(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct PAC_BUFFER *r)
79
1.00M
{
80
1.00M
  uint32_t _ptr_info;
81
1.00M
  TALLOC_CTX *_mem_save_info_0;
82
1.00M
  if (ndr_flags & NDR_SCALARS) {
83
961k
    NDR_CHECK(ndr_pull_align(ndr, 4));
84
961k
    NDR_CHECK(ndr_pull_PAC_TYPE(ndr, NDR_SCALARS, &r->type));
85
961k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size));
86
960k
    {
87
960k
      libndr_flags _flags_save_PAC_INFO = ndr->flags;
88
960k
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8);
89
960k
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
90
960k
      if (_ptr_info) {
91
944k
        NDR_PULL_ALLOC(ndr, r->info);
92
944k
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->info, _ptr_info));
93
944k
      } else {
94
16.9k
        r->info = NULL;
95
16.9k
      }
96
960k
      ndr->flags = _flags_save_PAC_INFO;
97
960k
    }
98
960k
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_pad));
99
960k
  }
100
1.00M
  if (ndr_flags & NDR_BUFFERS) {
101
47.7k
    {
102
47.7k
      libndr_flags _flags_save_PAC_INFO = ndr->flags;
103
47.7k
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8);
104
47.7k
      if (r->info) {
105
31.5k
        uint32_t _relative_save_offset;
106
31.5k
        _relative_save_offset = ndr->offset;
107
31.5k
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->info));
108
31.5k
        _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
109
31.5k
        NDR_PULL_SET_MEM_CTX(ndr, r->info, 0);
110
31.5k
        {
111
31.5k
          struct ndr_pull *_ndr_info_pad;
112
31.5k
          struct ndr_pull *_ndr_info;
113
31.5k
          NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info_pad, 0, NDR_ROUND(r->_ndr_size, 8)));
114
31.5k
          NDR_CHECK(ndr_pull_subcontext_start(_ndr_info_pad, &_ndr_info, 0, r->_ndr_size));
115
31.5k
          NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, r->info, r->type));
116
31.5k
          NDR_CHECK(ndr_pull_PAC_INFO(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->info));
117
30.9k
          NDR_CHECK(ndr_pull_subcontext_end(_ndr_info_pad, _ndr_info, 0, r->_ndr_size));
118
30.9k
          NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info_pad, 0, NDR_ROUND(r->_ndr_size, 8)));
119
30.9k
        }
120
30.9k
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
121
30.9k
        if (ndr->offset > ndr->relative_highest_offset) {
122
1.74k
          ndr->relative_highest_offset = ndr->offset;
123
1.74k
        }
124
30.9k
        ndr->offset = _relative_save_offset;
125
30.9k
      }
126
47.0k
      ndr->flags = _flags_save_PAC_INFO;
127
47.0k
    }
128
47.0k
  }
129
1.00M
  return NDR_ERR_SUCCESS;
130
1.00M
}