2013-12-06 09:25:20 +00:00
/*
2003-10-06 01:24:48 +00:00
* Unix SMB / Netbios implementation .
* SEC_ACL handling routines
* Copyright ( C ) Andrew Tridgell 1992 - 1998 ,
* Copyright ( C ) Jeremy R . Allison 1995 - 2003.
* Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1998 ,
* Copyright ( C ) Paul Ashton 1997 - 1998.
2013-12-06 09:25:20 +00:00
*
2003-10-06 01:24:48 +00: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
2007-07-09 19:25:36 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2003-10-06 01:24:48 +00:00
* ( at your option ) any later version .
2013-12-06 09:25:20 +00:00
*
2003-10-06 01:24:48 +00:00
* 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 .
2013-12-06 09:25:20 +00:00
*
2003-10-06 01:24:48 +00:00
* You should have received a copy of the GNU General Public License
2007-07-10 05:23:25 +00:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2003-10-06 01:24:48 +00:00
*/
2023-03-03 18:41:33 +01:00
# include "replace.h"
2009-03-02 08:55:00 +01:00
# include "librpc/gen_ndr/ndr_security.h"
2009-03-02 12:05:43 +01:00
# include "libcli/security/secace.h"
2011-03-19 00:45:56 +01:00
# include "libcli/security/secacl.h"
2009-03-01 18:15:36 +01:00
# define SEC_ACL_HEADER_SIZE (2 * sizeof(uint16_t) + sizeof(uint32_t))
2003-10-06 01:24:48 +00:00
/*******************************************************************
2013-12-06 09:25:20 +00:00
Create a SEC_ACL structure .
2003-10-06 01:24:48 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-01-14 21:51:01 +01:00
struct security_acl * make_sec_acl (
TALLOC_CTX * ctx ,
enum security_acl_revision revision ,
int num_aces ,
const struct security_ace * ace_list )
2003-10-06 01:24:48 +00:00
{
2009-03-01 18:15:36 +01:00
struct security_acl * dst ;
2003-10-06 01:24:48 +00:00
int i ;
2013-12-06 09:26:25 +00:00
dst = talloc ( ctx , struct security_acl ) ;
if ( dst = = NULL ) {
2003-10-06 01:24:48 +00:00
return NULL ;
2013-12-06 09:26:25 +00:00
}
2003-10-06 01:24:48 +00:00
dst - > revision = revision ;
dst - > num_aces = num_aces ;
dst - > size = SEC_ACL_HEADER_SIZE ;
2013-12-06 09:26:25 +00:00
dst - > aces = NULL ;
2003-10-06 01:24:48 +00:00
/* Now we need to return a non-NULL address for the ace list even
if the number of aces required is zero . This is because there
is a distinct difference between a NULL ace and an ace with zero
entries in it . This is achieved by checking that num_aces is a
positive number . */
2013-12-06 09:29:19 +00:00
if ( num_aces = = 0 ) {
return dst ;
}
dst - > aces = talloc_array ( dst , struct security_ace , num_aces ) ;
if ( dst - > aces = = NULL ) {
2013-12-06 09:28:40 +00:00
TALLOC_FREE ( dst ) ;
2003-10-06 01:24:48 +00:00
return NULL ;
}
2013-12-06 09:25:20 +00:00
2003-10-06 01:24:48 +00:00
for ( i = 0 ; i < num_aces ; i + + ) {
2006-09-20 22:23:12 +00:00
dst - > aces [ i ] = ace_list [ i ] ; /* Structure copy. */
2003-10-06 01:24:48 +00:00
dst - > size + = ace_list [ i ] . size ;
}
return dst ;
}