diff options
author | Stefan Metzmacher <metze@samba.org> | 2005-07-04 15:42:08 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:19:13 -0500 |
commit | 148235a00948d572e863db277704c34fee56ebf4 (patch) | |
tree | 9b802d3466b1db98b129ac194d144653b939b621 /source4/librpc/idl | |
parent | 8f9e87d858ae1cf2209cfd8332ad54a750252e24 (diff) | |
download | samba-148235a00948d572e863db277704c34fee56ebf4.tar.gz samba-148235a00948d572e863db277704c34fee56ebf4.tar.bz2 samba-148235a00948d572e863db277704c34fee56ebf4.zip |
r8148: - make the PAC generation code a bit more readable and add some outof memory checks
- move to handmodified pull/push code for PAC_BUFFER
to get the _ndr_size field and the subcontext size right
- after looking closely to the sample w2k3 PAC in our torture test (and some more in my archive)
I found out that the first uint32 before the netr_SamInfo3 was also a pointer,
(and we passed a NULL pointer there before, so I think that was the reason why the windows clients doesn't want our PAC)
w2k3 uses this for unique pointers:
ptr = ndr->ptr_count * 4;
ptr |= 0x00020000;
ndr->ptr_count;
- do one more pull/push round with the sample PAC
metze
(This used to be commit 0eee17941595e9842a264bf89ac73ca66cea7ed5)
Diffstat (limited to 'source4/librpc/idl')
-rw-r--r-- | source4/librpc/idl/krb5pac.idl | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/source4/librpc/idl/krb5pac.idl b/source4/librpc/idl/krb5pac.idl index 4de5453478..a0df6f3822 100644 --- a/source4/librpc/idl/krb5pac.idl +++ b/source4/librpc/idl/krb5pac.idl @@ -5,7 +5,7 @@ #include "idl_types.h" [ - uuid("46746756-7567-7567-5677-756756756756"), + uuid("1-2-3-4"), version(0.0), pointer_default(unique), pointer_default_top(unique), @@ -24,29 +24,35 @@ interface krb5pac } PAC_SIGNATURE_DATA; typedef struct { - uint32 unknown[5]; netr_SamInfo3 info3; dom_sid2 *res_group_dom_sid; samr_RidWithAttributeArray res_groups; } PAC_LOGON_INFO; - const uint8 PAC_TYPE_LOGON_INFO = 1; - const uint8 PAC_TYPE_SRV_CHECKSUM = 6; - const uint8 PAC_TYPE_KDC_CHECKSUM = 7; - const uint8 PAC_TYPE_LOGON_NAME = 10; + typedef struct { + uint32 unknown[4]; + PAC_LOGON_INFO *i; + } PAC_LOGON_INFO_CTR; + + typedef [public,v1_enum] enum { + PAC_TYPE_LOGON_INFO = 1, + PAC_TYPE_SRV_CHECKSUM = 6, + PAC_TYPE_KDC_CHECKSUM = 7, + PAC_TYPE_LOGON_NAME = 10 + } PAC_TYPE; - typedef [nodiscriminant,gensize] union { - [case(PAC_TYPE_LOGON_INFO)] PAC_LOGON_INFO logon_info; + typedef [public,nodiscriminant,gensize] union { + [case(PAC_TYPE_LOGON_INFO)] PAC_LOGON_INFO_CTR logon_info; [case(PAC_TYPE_SRV_CHECKSUM)] PAC_SIGNATURE_DATA srv_cksum; [case(PAC_TYPE_KDC_CHECKSUM)] PAC_SIGNATURE_DATA kdc_cksum; [case(PAC_TYPE_LOGON_NAME)] PAC_LOGON_NAME logon_name; } PAC_INFO; - typedef struct { - uint32 type; - uint32 size; - [relative,switch_is(type),subcontext(0),subcontext_size(size),pad8] PAC_INFO *info; - uint32 _pad; /* Top half of a 64 bit pointer? */ + typedef [public,nopush,nopull,noprint] struct { + PAC_TYPE type; + [value(_ndr_size_PAC_INFO(info, type, 0))] uint32 _ndr_size; + [relative,switch_is(type),subcontext(0),subcontext_size(_subcontext_size_PAC_INFO(r, ndr->flags)),flag(NDR_ALIGN8)] PAC_INFO *info; + [value(0)] uint32 _pad; /* Top half of a 64 bit pointer? */ } PAC_BUFFER; typedef [public] struct { |