From 8598bf2a7f0f71ae7a023aac054c4df42b969ce6 Mon Sep 17 00:00:00 2001 From: Luke Leighton Date: Tue, 3 Aug 1999 20:30:25 +0000 Subject: reverted jeremy's c++-like security descriptor modifications as the simplest method to get rpcclient's reggetsec command working. the buffers passed as arguments in do_reg_get_key_sec() do need to be locally allocated not dynamically allocated, as two calls to reg_get_key_sec() are needed. on the first, the server fills in the size of the security descriptor buffer needed. on the second, the server fills in the security descriptor buffer. (This used to be commit b2d9cbef6f65bb696df8d8f49aa0c240e0bb1f50) --- source3/rpc_parse/parse_misc.c | 8 +- source3/rpc_parse/parse_reg.c | 30 ++- source3/rpc_parse/parse_sec.c | 598 ++++++++++++++++------------------------- 3 files changed, 247 insertions(+), 389 deletions(-) (limited to 'source3/rpc_parse') diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c index 4927886fc8..4bc44f2038 100644 --- a/source3/rpc_parse/parse_misc.c +++ b/source3/rpc_parse/parse_misc.c @@ -133,11 +133,11 @@ void smb_io_enum_hnd(char *desc, ENUM_HND *hnd, prs_struct *ps, int depth) /******************************************************************* reads or writes a DOM_SID structure. ********************************************************************/ -BOOL smb_io_dom_sid(char *desc, DOM_SID *sid, prs_struct *ps, int depth) +void smb_io_dom_sid(char *desc, DOM_SID *sid, prs_struct *ps, int depth) { int i; - if (sid == NULL) return False; + if (sid == NULL) return; prs_debug(ps, depth, desc, "smb_io_dom_sid"); depth++; @@ -158,8 +158,6 @@ BOOL smb_io_dom_sid(char *desc, DOM_SID *sid, prs_struct *ps, int depth) if (sid->num_auths > MAXSUBAUTHS) sid->num_auths = MAXSUBAUTHS; prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths); - - return True; } /******************************************************************* @@ -167,7 +165,7 @@ creates a DOM_SID2 structure. ********************************************************************/ void make_dom_sid2(DOM_SID2 *sid2, DOM_SID *sid) { - sid2->sid = *sid; + sid_copy(&sid2->sid, sid); sid2->num_auths = sid2->sid.num_auths; } diff --git a/source3/rpc_parse/parse_reg.c b/source3/rpc_parse/parse_reg.c index b97fe3958b..47e1ae3af2 100644 --- a/source3/rpc_parse/parse_reg.c +++ b/source3/rpc_parse/parse_reg.c @@ -135,8 +135,7 @@ static void reg_io_hdrbuf_sec(uint32 ptr, uint32 *ptr3, BUFHDR *hdr_sec, SEC_DES } if (ptr3 == NULL || *ptr3 != 0) { - /* JRA - this line is probably wrong... */ - sec_io_desc_buf("data ", &data , ps, depth); + sec_io_desc_buf("data ", data , ps, depth); } smb_io_hdrbuf_post("hdr_sec", hdr_sec, ps, depth, hdr_offset, data->max_len, data->len); @@ -152,7 +151,8 @@ creates a structure. void make_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd, char *name, char *class, SEC_ACCESS *sam_access, - SEC_DESC_BUF *sec_buf) + SEC_DESC_BUF *sec_buf, + int sec_len, SEC_DESC *sec) { int len_name = name != NULL ? strlen(name ) + 1: 0; int len_class = class != NULL ? strlen(class) + 1: 0; @@ -175,8 +175,9 @@ void make_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd, q_c->data = sec_buf; q_c->ptr2 = 1; - make_buf_hdr(&(q_c->hdr_sec), sec_buf->len, sec_buf->len); + make_buf_hdr(&(q_c->hdr_sec), sec_len, sec_len); q_c->ptr3 = 1; + make_sec_desc_buf(q_c->data, sec_len, sec); q_c->unknown_2 = 0x00000000; } @@ -548,7 +549,7 @@ void reg_io_r_close(char *desc, REG_R_CLOSE *r_u, prs_struct *ps, int depth) makes a structure. ********************************************************************/ void make_reg_q_set_key_sec(REG_Q_SET_KEY_SEC *q_i, POLICY_HND *pol, - SEC_DESC_BUF *sec_desc_buf) + uint32 buf_len, SEC_DESC *sec_desc) { if (q_i == NULL) return; @@ -557,8 +558,8 @@ void make_reg_q_set_key_sec(REG_Q_SET_KEY_SEC *q_i, POLICY_HND *pol, q_i->sec_info = DACL_SECURITY_INFORMATION; q_i->ptr = 1; - make_buf_hdr(&(q_i->hdr_sec), sec_desc_buf->len, sec_desc_buf->len); - q_i->data = sec_desc_buf; + make_buf_hdr(&(q_i->hdr_sec), buf_len, buf_len); + make_sec_desc_buf(q_i->data, buf_len, sec_desc); } /******************************************************************* @@ -601,7 +602,7 @@ void reg_io_r_set_key_sec(char *desc, REG_R_SET_KEY_SEC *r_q, prs_struct *ps, in makes a structure. ********************************************************************/ void make_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol, - uint32 sec_buf_size, SEC_DESC_BUF *psdb) + uint32 buf_len, SEC_DESC_BUF *sec_buf) { if (q_i == NULL) return; @@ -611,10 +612,14 @@ void make_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol, GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION; - q_i->ptr = psdb != NULL ? 1 : 0; - q_i->data = psdb; + q_i->ptr = sec_buf != NULL ? 1 : 0; + q_i->data = sec_buf; - make_buf_hdr(&(q_i->hdr_sec), sec_buf_size, 0); + if (sec_buf != NULL) + { + make_buf_hdr(&(q_i->hdr_sec), buf_len, 0); + make_sec_desc_buf(q_i->data, buf_len, NULL); + } } /******************************************************************* @@ -671,7 +676,8 @@ void reg_io_r_get_key_sec(char *desc, REG_R_GET_KEY_SEC *r_q, prs_struct *ps, i if (r_q->ptr != 0) { - sec_io_desc_buf("", &r_q->data, ps, depth); + smb_io_hdrbuf("", &(r_q->hdr_sec), ps, depth); + sec_io_desc_buf("", r_q->data, ps, depth); prs_align(ps); } diff --git a/source3/rpc_parse/parse_sec.c b/source3/rpc_parse/parse_sec.c index 886b3f334a..2840070edc 100644 --- a/source3/rpc_parse/parse_sec.c +++ b/source3/rpc_parse/parse_sec.c @@ -2,10 +2,10 @@ * Unix SMB/Netbios implementation. * Version 1.9. * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Jeremy R. Allison 1995-1999 - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Paul Ashton 1997-1999. + * Copyright (C) Andrew Tridgell 1992-1998, + * Copyright (C) Jeremy R. Allison 1995-1998 + * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, + * Copyright (C) Paul Ashton 1997-1998. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,24 +29,19 @@ extern int DEBUGLEVEL; /******************************************************************* - Sets up a SEC_ACCESS structure. +makes a structure. ********************************************************************/ - -void init_sec_access(SEC_ACCESS *t, uint32 mask) +void make_sec_access(SEC_ACCESS *t, uint32 mask) { t->mask = mask; } /******************************************************************* - Reads or writes a SEC_ACCESS structure. +reads or writes a structure. ********************************************************************/ - -BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth) -{ - if (t == NULL) +void sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth) { - return False; - } + if (t == NULL) return; prs_debug(ps, depth, desc, "sec_io_access"); depth++; @@ -54,39 +49,30 @@ BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth) prs_align(ps); prs_uint32("mask", ps, depth, &(t->mask)); - return True; } /******************************************************************* - Sets up a SEC_ACE structure. +makes a structure. ********************************************************************/ - -void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, - uint8 flag) +void make_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag) { t->type = type; t->flags = flag; t->size = sid_size(sid) + 8; t->info = mask; - ZERO_STRUCTP(&t->sid); sid_copy(&t->sid, sid); } /******************************************************************* - Reads or writes a SEC_ACE structure. +reads or writes a structure. ********************************************************************/ - -BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth) +void sec_io_ace(char *desc, SEC_ACE *t, prs_struct *ps, int depth) { uint32 old_offset; uint32 offset_ace_size; - - if (psa == NULL) - { - return False; - } + if (t == NULL) return; prs_debug(ps, depth, desc, "sec_io_ace"); depth++; @@ -95,132 +81,58 @@ BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth) old_offset = ps->offset; - prs_uint8 ("type ", ps, depth, &psa->type); - prs_uint8 ("flags", ps, depth, &psa->flags); - prs_uint16_pre("size ", ps, depth, &psa->size, &offset_ace_size); - - if (!sec_io_access("info ", &psa->info, ps, depth)) - { - return False; - } + prs_uint8 ("type ", ps, depth, &(t->type)); + prs_uint8 ("flags", ps, depth, &(t->flags)); + prs_uint16_pre("size ", ps, depth, &(t->size ), &offset_ace_size); + sec_io_access ("info ", &t->info, ps, depth); prs_align(ps); - if (!smb_io_dom_sid("sid ", &psa->sid , ps, depth)) - { - return False; - } - + smb_io_dom_sid("sid ", &t->sid , ps, depth); - prs_uint16_post("size ", ps, depth, &psa->size, offset_ace_size, old_offset); - return True; + prs_uint16_post("size ", ps, depth, &t->size, offset_ace_size, old_offset); } /******************************************************************* - Create a SEC_ACL structure. +makes a structure. ********************************************************************/ - -SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list) +void make_sec_acl(SEC_ACL *t, uint16 revision, int num_aces, SEC_ACE *ace) { - SEC_ACL *dst; int i; - - dst = (SEC_ACL *)malloc(sizeof(SEC_ACL)); - if (dst == NULL) - { - return NULL; - } - - ZERO_STRUCTP(dst); - - dst->revision = revision; - dst->num_aces = num_aces; - dst->size = 4; - - if ((dst->ace_list = (SEC_ACE *)malloc( sizeof(SEC_ACE) * num_aces )) == NULL) { - free_sec_acl(&dst); - return NULL; - } + t->revision = revision; + t->num_aces = num_aces; + t->size = 4; + t->ace = ace; for (i = 0; i < num_aces; i++) { - dst->ace_list[i] = ace_list[i]; /* Structure copy. */ - dst->size += ace_list[i].size; - } - - return dst; -} - -/******************************************************************* - Duplicate a SEC_ACL structure. -********************************************************************/ - -SEC_ACL *dup_sec_acl( SEC_ACL *src) -{ - if (src == NULL) - { - return NULL; + t->size += ace[i].size; } - - return make_sec_acl( src->revision, src->num_aces, src->ace_list); } /******************************************************************* - Delete a SEC_ACL structure. +frees a structure. ********************************************************************/ - -void free_sec_acl(SEC_ACL **ppsa) +void free_sec_acl(SEC_ACL *t) { - SEC_ACL *psa; - - if (ppsa == NULL || *ppsa == NULL) + if (t->ace != NULL) { - return; + free(t->ace); } - - psa = *ppsa; - if (psa->ace_list != NULL) - { - free(psa->ace_list); - } - - free(psa); - *ppsa = NULL; } /******************************************************************* - Reads or writes a SEC_ACL structure. +reads or writes a structure. - First of the xx_io_xx functions that allocates its data structures +first of the xx_io_xx functions that allocates its data structures for you as it reads them. ********************************************************************/ - -BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth) +void sec_io_acl(char *desc, SEC_ACL *t, prs_struct *ps, int depth) { int i; uint32 old_offset; uint32 offset_acl_size; - SEC_ACL *psa; - - if (ppsa == NULL) - { - return False; - } - - psa = *ppsa; - if (ps->io && psa == NULL) - { - /* - * This is a read and we must allocate the stuct to read into. - */ - psa = (SEC_ACL *)malloc(sizeof(SEC_ACL)); - if (psa == NULL) - { - return False; - } - ZERO_STRUCTP(psa); - *ppsa = psa; - } + if (t == NULL) return; prs_debug(ps, depth, desc, "sec_io_acl"); depth++; @@ -229,216 +141,147 @@ BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth) old_offset = ps->offset; - prs_uint16("revision", ps, depth, &psa->revision); - prs_uint16_pre("size ", ps, depth, &psa->size, &offset_acl_size); - prs_uint32("num_aces ", ps, depth, &psa->num_aces); + prs_uint16("revision", ps, depth, &(t->revision)); + prs_uint16_pre("size ", ps, depth, &(t->size ), &offset_acl_size); + prs_uint32("num_aces ", ps, depth, &(t->num_aces )); - if (ps->io && psa->num_aces != 0) + if (ps->io && t->num_aces != 0) { /* reading */ - psa->ace_list = malloc(sizeof(psa->ace_list[0]) * psa->num_aces); - if (psa->ace_list == NULL) - { - return False; + t->ace = malloc(sizeof(t->ace[0]) * t->num_aces); + ZERO_STRUCTP(t->ace); } - ZERO_STRUCTP(psa->ace_list); + + if (t->ace == NULL && t->num_aces != 0) + { + DEBUG(0,("INVALID ACL\n")); + ps->offset = 0xfffffffe; + return; } - for (i = 0; i < MIN(psa->num_aces, MAX_SEC_ACES); i++) + for (i = 0; i < MIN(t->num_aces, MAX_SEC_ACES); i++) { fstring tmp; - slprintf(tmp, sizeof(tmp)-1, "ace_list[%02d]: ", i); - if (!sec_io_ace(tmp, &psa->ace_list[i], ps, depth)) - { - return False; - } + slprintf(tmp, sizeof(tmp)-1, "ace[%02d]: ", i); + sec_io_ace(tmp, &t->ace[i], ps, depth); } prs_align(ps); - prs_uint16_post("size ", ps, depth, &psa->size, offset_acl_size, old_offset); - - return True; + prs_uint16_post("size ", ps, depth, &t->size , offset_acl_size, old_offset); } /******************************************************************* - Creates a SEC_DESC structure +makes a structure ********************************************************************/ - -SEC_DESC *make_sec_desc(uint16 revision, uint16 type, +int make_sec_desc(SEC_DESC *t, uint16 revision, uint16 type, DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *sacl, SEC_ACL *dacl, size_t *sec_desc_size) + SEC_ACL *sacl, SEC_ACL *dacl) { - SEC_DESC *dst; uint32 offset; - *sec_desc_size = 0; - - dst = (SEC_DESC *)malloc(sizeof(SEC_DESC)); - - if (dst == NULL) - { - return NULL; - } - - ZERO_STRUCTP(dst); - - dst->revision = revision; - dst->type = type; - - dst->off_owner_sid = 0; - dst->off_grp_sid = 0; - dst->off_sacl = 0; - dst->off_dacl = 0; - - /* duplicate sids and acls as necessary */ + t->revision = revision; + t->type = type; - if (dacl != NULL) dst->dacl = dup_sec_acl(dacl); - if (sacl != NULL) dst->sacl = dup_sec_acl(sacl); - if (owner_sid != NULL) dst->owner_sid = sid_dup(owner_sid); - if (grp_sid != NULL) dst->grp_sid = sid_dup(grp_sid); + t->off_owner_sid = 0; + t->off_grp_sid = 0; + t->off_sacl = 0; + t->off_dacl = 0; - /* having duplicated sids and acls as necessary, check success */ - - if ((dacl != NULL && dst->dacl == NULL) || - (sacl != NULL && dst->sacl == NULL) || - (owner_sid != NULL && dst->owner_sid == NULL) || - (grp_sid != NULL && dst->grp_sid == NULL)) - { - *sec_desc_size = 0; - free_sec_desc(&dst); - - return NULL; - } + t->dacl = dacl; + t->sacl = sacl; + t->owner_sid = owner_sid; + t->grp_sid = grp_sid; offset = 0x0; - /* - * Work out the linearization sizes. - */ - - if (dst->dacl != NULL) + if (dacl != NULL) { if (offset == 0) { offset = 0x14; } - dst->off_dacl = offset; + t->off_dacl = offset; offset += dacl->size; } - if (dst->sacl != NULL) + if (sacl != NULL) { if (offset == 0) { offset = 0x14; } - dst->off_sacl = offset; - offset += sacl->size; + t->off_dacl = offset; + offset += dacl->size; } - if (dst->owner_sid != NULL) + if (owner_sid != NULL) { if (offset == 0) { offset = 0x14; } - dst->off_owner_sid = offset; - offset += sid_size(dst->owner_sid); + t->off_owner_sid = offset; + offset += sid_size(owner_sid); } - if (dst->grp_sid != NULL) + if (grp_sid != NULL) { if (offset == 0) { offset = 0x14; } - dst->off_grp_sid = offset; - offset += sid_size(dst->grp_sid); + t->off_grp_sid = offset; + offset += sid_size(grp_sid); } - *sec_desc_size = (size_t)((offset == 0) ? 0x14 : offset); - return dst; + return (offset == 0) ? 0x14 : offset; } -/******************************************************************* - Duplicate a SEC_DESC structure. -********************************************************************/ - -SEC_DESC *dup_sec_desc( SEC_DESC *src) -{ - size_t dummy; - - if (src == NULL) - return NULL; - - return make_sec_desc( src->revision, src->type, - src->owner_sid, src->grp_sid, src->sacl, - src->dacl, &dummy); -} /******************************************************************* - Deletes a SEC_DESC structure +frees a structure ********************************************************************/ - -void free_sec_desc(SEC_DESC **ppsd) +void free_sec_desc(SEC_DESC *t) { - SEC_DESC *psd; - - if (ppsd == NULL || *ppsd == NULL) + if (t->dacl != NULL) { - return; + free_sec_acl(t->dacl); } - psd = *ppsd; - - free_sec_acl(&psd->dacl); - free_sec_acl(&psd->dacl); - free(psd->owner_sid); - free(psd->grp_sid); - free(psd); - *ppsd = NULL; + if (t->sacl != NULL) + { + free_sec_acl(t->dacl); } -/******************************************************************* - Creates a SEC_DESC structure with typical defaults. -********************************************************************/ + if (t->owner_sid != NULL) + { + free(t->owner_sid); + } -SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *dacl, size_t *sec_desc_size) + if (t->grp_sid != NULL) { - return make_sec_desc(1, SEC_DESC_SELF_RELATIVE|SEC_DESC_DACL_PRESENT, - owner_sid, grp_sid, NULL, dacl, sec_desc_size); + free(t->grp_sid); + } } /******************************************************************* - Reads or writes a SEC_DESC structure. - If reading and the *ppsd = NULL, allocates the structure. +reads or writes a structure. ********************************************************************/ - -BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth) +static void sec_io_desc(char *desc, SEC_DESC *t, prs_struct *ps, int depth) { +#if 0 + uint32 off_owner_sid; + uint32 off_grp_sid ; + uint32 off_sacl ; + uint32 off_dacl ; +#endif uint32 old_offset; uint32 max_offset = 0; /* after we're done, move offset to end */ - SEC_DESC *psd; - - if (ppsd == NULL) - return False; - psd = *ppsd; - - if (ps->io && psd == NULL) - { - psd = (SEC_DESC *)malloc(sizeof(SEC_DESC)); - if (psd == NULL) - { - return False; - } - ZERO_STRUCTP(psd); - *ppsd = psd; - } + if (t == NULL) return; prs_debug(ps, depth, desc, "sec_io_desc"); depth++; @@ -448,207 +291,218 @@ BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth) /* start of security descriptor stored for back-calc offset purposes */ old_offset = ps->offset; - prs_uint16("revision ", ps, depth, &psd->revision); - prs_uint16("type ", ps, depth, &psd->type); - - prs_uint32("off_owner_sid", ps, depth, &psd->off_owner_sid); - prs_uint32("off_grp_sid ", ps, depth, &psd->off_grp_sid); - prs_uint32("off_sacl ", ps, depth, &psd->off_sacl); - prs_uint32("off_dacl ", ps, depth, &psd->off_dacl); - + prs_uint16("revision ", ps, depth, &(t->revision )); + prs_uint16("type ", ps, depth, &(t->type )); + + prs_uint32("off_owner_sid", ps, depth, &(t->off_owner_sid)); + prs_uint32("off_grp_sid ", ps, depth, &(t->off_grp_sid )); + prs_uint32("off_sacl ", ps, depth, &(t->off_sacl )); + prs_uint32("off_dacl ", ps, depth, &(t->off_dacl )); +#if 0 + prs_uint32_pre("off_owner_sid", ps, depth, &(t->off_owner_sid), &off_owner_sid); + prs_uint32_pre("off_grp_sid ", ps, depth, &(t->off_grp_sid ), &off_grp_sid ); + prs_uint32_pre("off_sacl ", ps, depth, &(t->off_sacl ), &off_sacl ); + prs_uint32_pre("off_dacl ", ps, depth, &(t->off_dacl ), &off_dacl ); +#endif max_offset = MAX(max_offset, ps->offset); - if (IS_BITS_SET_ALL(psd->type, SEC_DESC_DACL_PRESENT) && psd->dacl) + if (IS_BITS_SET_ALL(t->type, SEC_DESC_DACL_PRESENT)) { - ps->offset = old_offset + psd->off_dacl; - if (!sec_io_acl("dacl", &psd->dacl, ps, depth)) +#if 0 + prs_uint32_post("off_dacl ", ps, depth, &(t->off_dacl ), off_dacl , ps->offset - old_offset); +#endif + ps->offset = old_offset + t->off_dacl; + if (ps->io) { - return False; - } - prs_align(ps); + /* reading */ + t->dacl = malloc(sizeof(*t->dacl)); + ZERO_STRUCTP(t->dacl); } - max_offset = MAX(max_offset, ps->offset); - - if (IS_BITS_SET_ALL(psd->type, SEC_DESC_SACL_PRESENT) && psd->sacl) - { - ps->offset = old_offset + psd->off_sacl; - if (!sec_io_acl("sacl", &psd->sacl, ps, depth)) + if (t->dacl == NULL) { - return False; + DEBUG(0,("INVALID DACL\n")); + ps->offset = 0xfffffffe; + return; } + + sec_io_acl ("dacl" , t->dacl , ps, depth); prs_align(ps); } +#if 0 + else + { + prs_uint32_post("off_dacl ", ps, depth, &(t->off_dacl ), off_dacl , 0); + } +#endif max_offset = MAX(max_offset, ps->offset); - if (psd->off_owner_sid != 0) + if (IS_BITS_SET_ALL(t->type, SEC_DESC_SACL_PRESENT)) { +#if 0 + prs_uint32_post("off_sacl ", ps, depth, &(t->off_sacl ), off_sacl , ps->offset - old_offset); +#endif + ps->offset = old_offset + t->off_sacl; if (ps->io) { - ps->offset = old_offset + psd->off_owner_sid; /* reading */ - psd->owner_sid = malloc(sizeof(*psd->owner_sid)); - if (psd->owner_sid == NULL) - { - return False; - } - ZERO_STRUCTP(psd->owner_sid); + t->sacl = malloc(sizeof(*t->sacl)); + ZERO_STRUCTP(t->sacl); } - if (!smb_io_dom_sid("owner_sid ", psd->owner_sid , ps, depth)) + if (t->sacl == NULL) { - return False; + DEBUG(0,("INVALID SACL\n")); + ps->offset = 0xfffffffe; + return; } + + sec_io_acl ("sacl" , t->sacl , ps, depth); prs_align(ps); } +#if 0 + else + { + prs_uint32_post("off_sacl ", ps, depth, &(t->off_sacl ), off_sacl , 0); + } +#endif max_offset = MAX(max_offset, ps->offset); - if (psd->off_grp_sid != 0) +#if 0 + prs_uint32_post("off_owner_sid", ps, depth, &(t->off_owner_sid), off_owner_sid, ps->offset - old_offset); +#endif + if (t->off_owner_sid != 0) { if (ps->io) { - /* reading */ - ps->offset = old_offset + psd->off_grp_sid; - psd->grp_sid = malloc(sizeof(*psd->grp_sid)); - if (psd->grp_sid == NULL) - { - return False; + ps->offset = old_offset + t->off_owner_sid; } - ZERO_STRUCTP(psd->grp_sid); + if (ps->io) + { + /* reading */ + t->owner_sid = malloc(sizeof(*t->owner_sid)); + ZERO_STRUCTP(t->owner_sid); } - if (!smb_io_dom_sid("grp_sid", psd->grp_sid, ps, depth)) + if (t->owner_sid == NULL) { - return False; + DEBUG(0,("INVALID OWNER SID\n")); + ps->offset = 0xfffffffe; + return; } + + smb_io_dom_sid("owner_sid ", t->owner_sid , ps, depth); prs_align(ps); } max_offset = MAX(max_offset, ps->offset); - ps->offset = max_offset; - return True; +#if 0 + prs_uint32_post("off_grp_sid ", ps, depth, &(t->off_grp_sid ), off_grp_sid , ps->offset - old_offset); +#endif + if (t->off_grp_sid != 0) + { + if (ps->io) + { + ps->offset = old_offset + t->off_grp_sid; } - -/******************************************************************* - Creates a SEC_DESC_BUF structure. -********************************************************************/ - -SEC_DESC_BUF *make_sec_desc_buf(int len, SEC_DESC *sec_desc) + if (ps->io) { - SEC_DESC_BUF *dst; + /* reading */ + t->grp_sid = malloc(sizeof(*t->grp_sid)); + ZERO_STRUCTP(t->grp_sid); + } - dst = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF)); - if (dst == NULL) + if (t->grp_sid == NULL) { - return NULL; + DEBUG(0,("INVALID GROUP SID\n")); + ps->offset = 0xfffffffe; + return; } - ZERO_STRUCTP(dst); - - /* max buffer size (allocated size) */ - dst->max_len = len; - dst->len = len; - - if (sec_desc && ((dst->sec = dup_sec_desc(sec_desc)) == NULL)) - { - free_sec_desc_buf(&dst); - return NULL; + smb_io_dom_sid("grp_sid", t->grp_sid, ps, depth); + prs_align(ps); } - return dst; + max_offset = MAX(max_offset, ps->offset); + + ps->offset = max_offset; } /******************************************************************* - Duplicates a SEC_DESC_BUF structure. +creates a SEC_DESC_BUF structure. ********************************************************************/ - -SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src) -{ - if (src == NULL) +void make_sec_desc_buf(SEC_DESC_BUF *buf, int len, SEC_DESC *data) { - return NULL; - } + ZERO_STRUCTP(buf); - return make_sec_desc_buf( src->len, src->sec); + /* max buffer size (allocated size) */ + buf->max_len = len; + buf->undoc = 0; + buf->len = data != NULL ? len : 0; + buf->sec = data; } /******************************************************************* - Deletes a SEC_DESC_BUF structure. +frees a SEC_DESC_BUF structure. ********************************************************************/ - -void free_sec_desc_buf(SEC_DESC_BUF **ppsdb) +void free_sec_desc_buf(SEC_DESC_BUF *buf) { - SEC_DESC_BUF *psdb; - - if (ppsdb == NULL || *ppsdb == NULL) + if (buf->sec != NULL) { - return; + free_sec_desc(buf->sec); + free(buf->sec); } - - psdb = *ppsdb; - free_sec_desc(&psdb->sec); - free(psdb); - *ppsdb = NULL; } /******************************************************************* - Reads or writes a SEC_DESC_BUF structure. +reads or writes a SEC_DESC_BUF structure. ********************************************************************/ - -BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth) +void sec_io_desc_buf(char *desc, SEC_DESC_BUF *sec, prs_struct *ps, int depth) { uint32 off_len; uint32 off_max_len; uint32 old_offset; uint32 size; - SEC_DESC_BUF *psdb; - - if (ppsdb == NULL) - { - return False; - } - - psdb = *ppsdb; - if (ps->io && psdb == NULL) - { - psdb = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF)); - if (psdb == NULL) - { - return False; - } - ZERO_STRUCTP(psdb); - *ppsdb = psdb; - } + if (sec == NULL) return; prs_debug(ps, depth, desc, "sec_io_desc_buf"); depth++; prs_align(ps); - prs_uint32_pre("max_len", ps, depth, &psdb->max_len, &off_max_len); - prs_uint32 ("undoc ", ps, depth, &psdb->undoc); - prs_uint32_pre("len ", ps, depth, &psdb->len, &off_len); + prs_uint32_pre("max_len", ps, depth, &(sec->max_len), &off_max_len); + prs_uint32 ("undoc ", ps, depth, &(sec->undoc )); + prs_uint32_pre("len ", ps, depth, &(sec->len ), &off_len); old_offset = ps->offset; - /* reading, length is non-zero; writing, descriptor is non-NULL */ - if ((psdb->len != 0 || (!ps->io)) && psdb->sec != NULL) + if (sec->len != 0 && ps->io) { - if (!sec_io_desc("sec ", &psdb->sec, ps, depth)) + /* reading */ + sec->sec = malloc(sizeof(*sec->sec)); + ZERO_STRUCTP(sec->sec); + + if (sec->sec == NULL) { - return False; + DEBUG(0,("INVALID SEC_DESC\n")); + ps->offset = 0xfffffffe; + return; } } - size = ps->offset - old_offset; - prs_uint32_post("max_len", ps, depth, &psdb->max_len, off_max_len, size == 0 ? psdb->max_len : size); - prs_uint32_post("len ", ps, depth, &psdb->len, off_len, size); + /* reading, length is non-zero; writing, descriptor is non-NULL */ + if ((sec->len != 0 || (!ps->io)) && sec->sec != NULL) + { + sec_io_desc("sec ", sec->sec, ps, depth); + } - return True; + size = ps->offset - old_offset; + prs_uint32_post("max_len", ps, depth, &(sec->max_len), off_max_len, size == 0 ? sec->max_len : size); + prs_uint32_post("len ", ps, depth, &(sec->len ), off_len , size); } -- cgit