1998-11-09 19:40:38 +03:00
/*
* Unix SMB / Netbios implementation .
* Version 1.9 .
* RPC Pipe client / server routines
1999-02-24 01:39:54 +03:00
* 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.
1998-11-09 19:40:38 +03:00
*
* 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
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
extern int DEBUGLEVEL ;
1998-11-13 02:35:05 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Sets up a SEC_ACCESS structure .
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
void init_sec_access ( SEC_ACCESS * t , uint32 mask )
1998-11-13 02:35:05 +03:00
{
t - > mask = mask ;
}
1998-11-09 19:40:38 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Reads or writes a SEC_ACCESS structure .
1998-11-09 19:40:38 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
BOOL sec_io_access ( char * desc , SEC_ACCESS * t , prs_struct * ps , int depth )
1998-11-09 19:40:38 +03:00
{
1999-02-24 01:39:54 +03:00
if ( t = = NULL )
{
return False ;
}
1998-11-09 19:40:38 +03:00
1998-11-13 02:35:05 +03:00
prs_debug ( ps , depth , desc , " sec_io_access " ) ;
1998-11-09 19:40:38 +03:00
depth + + ;
prs_align ( ps ) ;
1998-11-13 02:35:05 +03:00
prs_uint32 ( " mask " , ps , depth , & ( t - > mask ) ) ;
1999-02-24 01:39:54 +03:00
return True ;
1998-11-13 02:35:05 +03:00
}
/*******************************************************************
1999-02-24 01:39:54 +03:00
Sets up a SEC_ACE structure .
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
void init_sec_ace ( SEC_ACE * t , DOM_SID * sid , uint8 type , SEC_ACCESS mask ,
uint8 flag )
1998-11-13 02:35:05 +03:00
{
t - > type = type ;
t - > flags = flag ;
t - > size = sid_size ( sid ) + 8 ;
t - > info = mask ;
1999-02-24 01:39:54 +03:00
ZERO_STRUCTP ( & t - > sid ) ;
1998-11-13 02:35:05 +03:00
sid_copy ( & t - > sid , sid ) ;
1998-11-09 19:40:38 +03:00
}
/*******************************************************************
1999-02-24 01:39:54 +03:00
Reads or writes a SEC_ACE structure .
1998-11-09 19:40:38 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
BOOL sec_io_ace ( char * desc , SEC_ACE * psa , prs_struct * ps , int depth )
1998-11-09 19:40:38 +03:00
{
uint32 old_offset ;
uint32 offset_ace_size ;
1999-02-24 01:39:54 +03:00
if ( psa = = NULL )
{
return False ;
}
1998-11-09 19:40:38 +03:00
prs_debug ( ps , depth , desc , " sec_io_ace " ) ;
depth + + ;
prs_align ( ps ) ;
old_offset = ps - > offset ;
1999-02-24 01:39:54 +03:00
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 ;
}
1998-11-09 19:40:38 +03:00
prs_align ( ps ) ;
1999-02-24 01:39:54 +03:00
if ( ! smb_io_dom_sid ( " sid " , & psa - > sid , ps , depth ) )
{
return False ;
}
1998-11-09 19:40:38 +03:00
1999-02-24 01:39:54 +03:00
prs_uint16_post ( " size " , ps , depth , & psa - > size , offset_ace_size , old_offset ) ;
return True ;
1998-11-09 19:40:38 +03:00
}
/*******************************************************************
1999-02-24 01:39:54 +03:00
Create a SEC_ACL structure .
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
SEC_ACL * make_sec_acl ( uint16 revision , int num_aces , SEC_ACE * ace_list )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
SEC_ACL * dst ;
1998-11-13 02:35:05 +03:00
int i ;
1999-02-24 01:39:54 +03:00
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 ;
}
1998-11-13 02:35:05 +03:00
for ( i = 0 ; i < num_aces ; i + + )
{
1999-02-24 01:39:54 +03:00
dst - > ace_list [ i ] = ace_list [ i ] ; /* Structure copy. */
dst - > size + = ace_list [ i ] . size ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
return dst ;
1998-11-13 02:35:05 +03:00
}
/*******************************************************************
1999-02-24 01:39:54 +03:00
Duplicate a SEC_ACL structure .
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
SEC_ACL * dup_sec_acl ( SEC_ACL * src )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
if ( src = = NULL )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return NULL ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
return make_sec_acl ( src - > revision , src - > num_aces , src - > ace_list ) ;
1998-11-13 02:35:05 +03:00
}
/*******************************************************************
1999-02-24 01:39:54 +03:00
Delete a SEC_ACL structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
void free_sec_acl ( SEC_ACL * * ppsa )
{
SEC_ACL * psa ;
if ( ppsa = = NULL | | * ppsa = = NULL )
{
return ;
}
psa = * ppsa ;
if ( psa - > ace_list ! = NULL )
{
free ( psa - > ace_list ) ;
}
free ( psa ) ;
* ppsa = NULL ;
}
/*******************************************************************
Reads or writes a SEC_ACL structure .
First of the xx_io_xx functions that allocates its data structures
for you as it reads them .
1998-11-09 19:40:38 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
BOOL sec_io_acl ( char * desc , SEC_ACL * * ppsa , prs_struct * ps , int depth )
1998-11-09 19:40:38 +03:00
{
int i ;
uint32 old_offset ;
uint32 offset_acl_size ;
1999-02-24 01:39:54 +03:00
SEC_ACL * psa ;
1998-11-09 19:40:38 +03:00
1999-02-24 01:39:54 +03:00
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 ;
}
1998-11-09 19:40:38 +03:00
prs_debug ( ps , depth , desc , " sec_io_acl " ) ;
depth + + ;
prs_align ( ps ) ;
old_offset = ps - > offset ;
1999-02-24 01:39:54 +03:00
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 ) ;
1998-11-09 19:40:38 +03:00
1999-02-24 01:39:54 +03:00
if ( ps - > io & & psa - > num_aces ! = 0 )
1998-11-13 02:35:05 +03:00
{
/* reading */
1999-02-24 01:39:54 +03:00
psa - > ace_list = malloc ( sizeof ( psa - > ace_list [ 0 ] ) * psa - > num_aces ) ;
if ( psa - > ace_list = = NULL )
{
return False ;
}
ZERO_STRUCTP ( psa - > ace_list ) ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
for ( i = 0 ; i < MIN ( psa - > num_aces , MAX_SEC_ACES ) ; i + + )
1998-11-09 19:40:38 +03:00
{
fstring tmp ;
1999-02-24 01:39:54 +03:00
slprintf ( tmp , sizeof ( tmp ) - 1 , " ace_list[%02d]: " , i ) ;
if ( ! sec_io_ace ( tmp , & psa - > ace_list [ i ] , ps , depth ) )
{
return False ;
}
1998-11-09 19:40:38 +03:00
}
prs_align ( ps ) ;
1999-02-24 01:39:54 +03:00
prs_uint16_post ( " size " , ps , depth , & psa - > size , offset_acl_size , old_offset ) ;
return True ;
1998-11-09 19:40:38 +03:00
}
1998-11-13 02:35:05 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Creates a SEC_DESC structure
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
SEC_DESC * make_sec_desc ( uint16 revision , uint16 type ,
DOM_SID * owner_sid , DOM_SID * grp_sid ,
SEC_ACL * sacl , SEC_ACL * dacl , size_t * sec_desc_size )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
SEC_DESC * dst ;
1998-11-13 02:35:05 +03:00
uint32 offset ;
1999-02-24 01:39:54 +03:00
* sec_desc_size = 0 ;
dst = ( SEC_DESC * ) malloc ( sizeof ( SEC_DESC ) ) ;
if ( dst = = NULL )
{
return NULL ;
}
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
ZERO_STRUCTP ( dst ) ;
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
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 */
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 ) ;
/* 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 ;
}
1998-11-13 02:35:05 +03:00
1998-11-13 04:38:41 +03:00
offset = 0x0 ;
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
/*
* Work out the linearization sizes .
*/
if ( dst - > dacl ! = NULL )
1998-11-13 02:35:05 +03:00
{
1998-11-13 04:38:41 +03:00
if ( offset = = 0 )
{
offset = 0x14 ;
}
1999-02-24 01:39:54 +03:00
dst - > off_dacl = offset ;
1998-11-13 02:35:05 +03:00
offset + = dacl - > size ;
}
1999-02-24 01:39:54 +03:00
if ( dst - > sacl ! = NULL )
1998-11-13 02:35:05 +03:00
{
1998-11-13 04:38:41 +03:00
if ( offset = = 0 )
{
offset = 0x14 ;
}
1999-02-24 01:39:54 +03:00
dst - > off_sacl = offset ;
offset + = sacl - > size ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
if ( dst - > owner_sid ! = NULL )
1998-11-13 02:35:05 +03:00
{
1998-11-13 04:38:41 +03:00
if ( offset = = 0 )
{
offset = 0x14 ;
}
1999-02-24 01:39:54 +03:00
dst - > off_owner_sid = offset ;
offset + = sid_size ( dst - > owner_sid ) ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
if ( dst - > grp_sid ! = NULL )
1998-11-13 02:35:05 +03:00
{
1998-11-13 04:38:41 +03:00
if ( offset = = 0 )
{
offset = 0x14 ;
}
1999-02-24 01:39:54 +03:00
dst - > off_grp_sid = offset ;
offset + = sid_size ( dst - > grp_sid ) ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
* sec_desc_size = ( size_t ) ( ( offset = = 0 ) ? 0x14 : offset ) ;
return dst ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
/*******************************************************************
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 ) ;
}
1998-11-13 02:35:05 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Deletes a SEC_DESC structure
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
void free_sec_desc ( SEC_DESC * * ppsd )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
SEC_DESC * psd ;
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
if ( ppsd = = NULL | | * ppsd = = NULL )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
psd = * ppsd ;
1998-11-13 02:35:05 +03:00
1999-02-24 01:39:54 +03:00
free_sec_acl ( & psd - > dacl ) ;
free_sec_acl ( & psd - > dacl ) ;
free ( psd - > owner_sid ) ;
free ( psd - > grp_sid ) ;
free ( psd ) ;
* ppsd = NULL ;
}
/*******************************************************************
Creates a SEC_DESC structure with typical defaults .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SEC_DESC * make_standard_sec_desc ( DOM_SID * owner_sid , DOM_SID * grp_sid ,
SEC_ACL * dacl , size_t * sec_desc_size )
{
return make_sec_desc ( 1 , SEC_DESC_SELF_RELATIVE | SEC_DESC_DACL_PRESENT ,
owner_sid , grp_sid , NULL , dacl , sec_desc_size ) ;
1998-11-13 02:35:05 +03:00
}
1998-11-09 19:40:38 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Reads or writes a SEC_DESC structure .
If reading and the * ppsd = NULL , allocates the structure .
1998-11-09 19:40:38 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
BOOL sec_io_desc ( char * desc , SEC_DESC * * ppsd , prs_struct * ps , int depth )
1998-11-09 19:40:38 +03:00
{
1998-11-11 22:22:08 +03:00
uint32 old_offset ;
1998-11-13 02:35:05 +03:00
uint32 max_offset = 0 ; /* after we're done, move offset to end */
1999-02-24 01:39:54 +03:00
SEC_DESC * psd ;
if ( ppsd = = NULL )
return False ;
psd = * ppsd ;
1998-11-11 22:22:08 +03:00
1999-02-24 01:39:54 +03:00
if ( ps - > io & & psd = = NULL )
{
psd = ( SEC_DESC * ) malloc ( sizeof ( SEC_DESC ) ) ;
if ( psd = = NULL )
{
return False ;
}
ZERO_STRUCTP ( psd ) ;
* ppsd = psd ;
}
1998-11-09 19:40:38 +03:00
prs_debug ( ps , depth , desc , " sec_io_desc " ) ;
depth + + ;
prs_align ( ps ) ;
1998-11-11 22:22:08 +03:00
/* start of security descriptor stored for back-calc offset purposes */
old_offset = ps - > offset ;
1999-02-24 01:39:54 +03:00
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 ) ;
1998-11-13 02:35:05 +03:00
max_offset = MAX ( max_offset , ps - > offset ) ;
1999-02-24 01:39:54 +03:00
if ( IS_BITS_SET_ALL ( psd - > type , SEC_DESC_DACL_PRESENT ) & & psd - > dacl )
1998-11-12 00:44:02 +03:00
{
1999-02-24 01:39:54 +03:00
ps - > offset = old_offset + psd - > off_dacl ;
if ( ! sec_io_acl ( " dacl " , & psd - > dacl , ps , depth ) )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return False ;
1998-11-13 02:35:05 +03:00
}
1998-11-12 00:44:02 +03:00
prs_align ( ps ) ;
}
1998-11-11 22:22:08 +03:00
1998-11-13 02:35:05 +03:00
max_offset = MAX ( max_offset , ps - > offset ) ;
1999-02-24 01:39:54 +03:00
if ( IS_BITS_SET_ALL ( psd - > type , SEC_DESC_SACL_PRESENT ) & & psd - > sacl )
1998-11-12 00:44:02 +03:00
{
1999-02-24 01:39:54 +03:00
ps - > offset = old_offset + psd - > off_sacl ;
if ( ! sec_io_acl ( " sacl " , & psd - > sacl , ps , depth ) )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return False ;
1998-11-13 02:35:05 +03:00
}
1998-11-12 00:44:02 +03:00
prs_align ( ps ) ;
}
1998-11-11 22:22:08 +03:00
1998-11-13 02:35:05 +03:00
max_offset = MAX ( max_offset , ps - > offset ) ;
1999-02-24 01:39:54 +03:00
if ( psd - > off_owner_sid ! = 0 )
1998-11-12 00:44:02 +03:00
{
1998-11-12 22:21:20 +03:00
if ( ps - > io )
{
1999-02-24 01:39:54 +03:00
ps - > offset = old_offset + psd - > off_owner_sid ;
1998-11-13 02:35:05 +03:00
/* reading */
1999-02-24 01:39:54 +03:00
psd - > owner_sid = malloc ( sizeof ( * psd - > owner_sid ) ) ;
if ( psd - > owner_sid = = NULL )
{
return False ;
}
ZERO_STRUCTP ( psd - > owner_sid ) ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
if ( ! smb_io_dom_sid ( " owner_sid " , psd - > owner_sid , ps , depth ) )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return False ;
1998-11-13 02:35:05 +03:00
}
1998-11-12 00:44:02 +03:00
prs_align ( ps ) ;
}
1998-11-11 22:22:08 +03:00
1998-11-13 02:35:05 +03:00
max_offset = MAX ( max_offset , ps - > offset ) ;
1999-02-24 01:39:54 +03:00
if ( psd - > off_grp_sid ! = 0 )
1998-11-12 00:44:02 +03:00
{
1998-11-13 02:35:05 +03:00
if ( ps - > io )
{
/* reading */
1999-02-24 01:39:54 +03:00
ps - > offset = old_offset + psd - > off_grp_sid ;
psd - > grp_sid = malloc ( sizeof ( * psd - > grp_sid ) ) ;
if ( psd - > grp_sid = = NULL )
{
return False ;
}
ZERO_STRUCTP ( psd - > grp_sid ) ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
if ( ! smb_io_dom_sid ( " grp_sid " , psd - > grp_sid , ps , depth ) )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return False ;
1998-11-13 02:35:05 +03:00
}
1998-11-12 00:44:02 +03:00
prs_align ( ps ) ;
}
1998-11-13 02:35:05 +03:00
max_offset = MAX ( max_offset , ps - > offset ) ;
ps - > offset = max_offset ;
1999-02-24 01:39:54 +03:00
return True ;
1998-11-09 19:40:38 +03:00
}
1998-11-12 00:44:02 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Creates a SEC_DESC_BUF structure .
1998-11-12 00:44:02 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
SEC_DESC_BUF * make_sec_desc_buf ( int len , SEC_DESC * sec_desc )
1998-11-12 00:44:02 +03:00
{
1999-02-24 01:39:54 +03:00
SEC_DESC_BUF * dst ;
dst = ( SEC_DESC_BUF * ) malloc ( sizeof ( SEC_DESC_BUF ) ) ;
if ( dst = = NULL )
{
return NULL ;
}
ZERO_STRUCTP ( dst ) ;
1998-11-12 00:44:02 +03:00
/* max buffer size (allocated size) */
1999-02-24 01:39:54 +03:00
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 ;
}
return dst ;
1998-11-12 00:44:02 +03:00
}
1998-11-13 02:35:05 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Duplicates a SEC_DESC_BUF structure .
1998-11-13 02:35:05 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
SEC_DESC_BUF * dup_sec_desc_buf ( SEC_DESC_BUF * src )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
if ( src = = NULL )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return NULL ;
1998-11-13 02:35:05 +03:00
}
1999-02-24 01:39:54 +03:00
return make_sec_desc_buf ( src - > len , src - > sec ) ;
}
/*******************************************************************
Deletes a SEC_DESC_BUF structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void free_sec_desc_buf ( SEC_DESC_BUF * * ppsdb )
{
SEC_DESC_BUF * psdb ;
if ( ppsdb = = NULL | | * ppsdb = = NULL )
{
return ;
}
psdb = * ppsdb ;
free_sec_desc ( & psdb - > sec ) ;
free ( psdb ) ;
* ppsdb = NULL ;
1998-11-13 02:35:05 +03:00
}
1998-11-12 00:44:02 +03:00
1998-11-09 19:40:38 +03:00
/*******************************************************************
1999-02-24 01:39:54 +03:00
Reads or writes a SEC_DESC_BUF structure .
1998-11-09 19:40:38 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-24 01:39:54 +03:00
BOOL sec_io_desc_buf ( char * desc , SEC_DESC_BUF * * ppsdb , prs_struct * ps , int depth )
1998-11-09 19:40:38 +03:00
{
1998-11-11 22:22:08 +03:00
uint32 off_len ;
1998-11-12 22:21:20 +03:00
uint32 off_max_len ;
1998-11-11 22:22:08 +03:00
uint32 old_offset ;
1998-11-12 22:21:20 +03:00
uint32 size ;
1999-02-24 01:39:54 +03:00
SEC_DESC_BUF * psdb ;
if ( ppsdb = = NULL )
{
return False ;
}
psdb = * ppsdb ;
1998-11-11 22:22:08 +03:00
1999-02-24 01:39:54 +03:00
if ( ps - > io & & psdb = = NULL )
{
psdb = ( SEC_DESC_BUF * ) malloc ( sizeof ( SEC_DESC_BUF ) ) ;
if ( psdb = = NULL )
{
return False ;
}
ZERO_STRUCTP ( psdb ) ;
* ppsdb = psdb ;
}
1998-11-09 19:40:38 +03:00
prs_debug ( ps , depth , desc , " sec_io_desc_buf " ) ;
depth + + ;
prs_align ( ps ) ;
1999-02-24 01:39:54 +03:00
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 ) ;
1998-11-11 22:22:08 +03:00
old_offset = ps - > offset ;
1998-11-09 19:40:38 +03:00
1999-02-24 01:39:54 +03:00
/* reading, length is non-zero; writing, descriptor is non-NULL */
if ( ( psdb - > len ! = 0 | | ( ! ps - > io ) ) & & psdb - > sec ! = NULL )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
if ( ! sec_io_desc ( " sec " , & psdb - > sec , ps , depth ) )
1998-11-13 02:35:05 +03:00
{
1999-02-24 01:39:54 +03:00
return False ;
1998-11-13 02:35:05 +03:00
}
}
1998-11-12 22:21:20 +03:00
size = ps - > offset - old_offset ;
1999-02-24 01:39:54 +03:00
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 ) ;
return True ;
1998-11-09 19:40:38 +03:00
}
1998-11-11 22:22:08 +03:00