libcli/security: add better detection of SECINFO_[UN]PROTECTED_[D|S]ACL in get_sec_info()
authorStefan Metzmacher <metze@samba.org>
Wed, 20 Aug 2014 13:00:59 +0000 (15:00 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 22 Aug 2014 00:52:50 +0000 (02:52 +0200)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10773

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Stefan Metzmacher <metze@samba.org>
Autobuild-Date(master): Fri Aug 22 02:52:50 CEST 2014 on sn-devel-104

libcli/security/secdesc.c

index 052bafbe1d5acb4cf964c210d027333c5883c134..46b820ee24e52ad76d4d4c57eefca6029efbd044 100644 (file)
 #include "librpc/gen_ndr/ndr_security.h"
 #include "libcli/security/security.h"
 
-#define ALL_SECURITY_INFORMATION (SECINFO_OWNER|SECINFO_GROUP|\
-                                       SECINFO_DACL|SECINFO_SACL|\
-                                       SECINFO_UNPROTECTED_SACL|\
-                                       SECINFO_UNPROTECTED_DACL|\
-                                       SECINFO_PROTECTED_SACL|\
-                                       SECINFO_PROTECTED_DACL)
-
 /* Map generic permissions to file object specific permissions */
 
 const struct generic_mapping file_generic_mapping = {
@@ -46,21 +39,32 @@ const struct generic_mapping file_generic_mapping = {
 
 uint32_t get_sec_info(const struct security_descriptor *sd)
 {
-       uint32_t sec_info = ALL_SECURITY_INFORMATION;
+       uint32_t sec_info = 0;
 
        SMB_ASSERT(sd);
 
-       if (sd->owner_sid == NULL) {
-               sec_info &= ~SECINFO_OWNER;
+       if (sd->owner_sid != NULL) {
+               sec_info |= SECINFO_OWNER;
+       }
+       if (sd->group_sid != NULL) {
+               sec_info |= SECINFO_GROUP;
        }
-       if (sd->group_sid == NULL) {
-               sec_info &= ~SECINFO_GROUP;
+       if (sd->sacl != NULL) {
+               sec_info |= SECINFO_SACL;
        }
-       if (sd->sacl == NULL) {
-               sec_info &= ~SECINFO_SACL;
+       if (sd->dacl != NULL) {
+               sec_info |= SECINFO_DACL;
+       }
+
+       if (sd->type & SEC_DESC_SACL_PROTECTED) {
+               sec_info |= SECINFO_PROTECTED_SACL;
+       } else if (sd->type & SEC_DESC_SACL_AUTO_INHERITED) {
+               sec_info |= SECINFO_UNPROTECTED_SACL;
        }
-       if (sd->dacl == NULL) {
-               sec_info &= ~SECINFO_DACL;
+       if (sd->type & SEC_DESC_DACL_PROTECTED) {
+               sec_info |= SECINFO_PROTECTED_DACL;
+       } else if (sd->type & SEC_DESC_DACL_AUTO_INHERITED) {
+               sec_info |= SECINFO_UNPROTECTED_DACL;
        }
 
        return sec_info;