2013-12-06 13:25:20 +04:00
/*
2003-10-06 05:24:48 +04: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 13:25:20 +04:00
*
2003-10-06 05:24:48 +04: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 23:25:36 +04:00
* the Free Software Foundation ; either version 3 of the License , or
2003-10-06 05:24:48 +04:00
* ( at your option ) any later version .
2013-12-06 13:25:20 +04:00
*
2003-10-06 05:24:48 +04: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 13:25:20 +04:00
*
2003-10-06 05:24:48 +04:00
* You should have received a copy of the GNU General Public License
2007-07-10 09:23:25 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2003-10-06 05:24:48 +04:00
*/
2023-03-03 20:41:33 +03:00
# include "replace.h"
2009-03-02 10:55:00 +03:00
# include "librpc/gen_ndr/ndr_security.h"
2009-03-02 14:05:43 +03:00
# include "libcli/security/secace.h"
2011-03-19 02:45:56 +03:00
# include "libcli/security/secacl.h"
2009-03-01 20:15:36 +03:00
# define SEC_ACL_HEADER_SIZE (2 * sizeof(uint16_t) + sizeof(uint32_t))
2003-10-06 05:24:48 +04:00
/*******************************************************************
2013-12-06 13:25:20 +04:00
Create a SEC_ACL structure .
2003-10-06 05:24:48 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-01-14 23:51:01 +03: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 05:24:48 +04:00
{
2009-03-01 20:15:36 +03:00
struct security_acl * dst ;
2003-10-06 05:24:48 +04:00
int i ;
2013-12-06 13:26:25 +04:00
dst = talloc ( ctx , struct security_acl ) ;
if ( dst = = NULL ) {
2003-10-06 05:24:48 +04:00
return NULL ;
2013-12-06 13:26:25 +04:00
}
2003-10-06 05:24:48 +04:00
dst - > revision = revision ;
dst - > num_aces = num_aces ;
dst - > size = SEC_ACL_HEADER_SIZE ;
2013-12-06 13:26:25 +04:00
dst - > aces = NULL ;
2003-10-06 05:24:48 +04: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 13:29:19 +04:00
if ( num_aces = = 0 ) {
return dst ;
}
dst - > aces = talloc_array ( dst , struct security_ace , num_aces ) ;
if ( dst - > aces = = NULL ) {
2013-12-06 13:28:40 +04:00
TALLOC_FREE ( dst ) ;
2003-10-06 05:24:48 +04:00
return NULL ;
}
2013-12-06 13:25:20 +04:00
2003-10-06 05:24:48 +04:00
for ( i = 0 ; i < num_aces ; i + + ) {
2006-09-21 02:23:12 +04:00
dst - > aces [ i ] = ace_list [ i ] ; /* Structure copy. */
2003-10-06 05:24:48 +04:00
dst - > size + = ace_list [ i ] . size ;
}
return dst ;
}