/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 | } |