dsdb-descriptor: Avoid segfault copying an SD without an owner or group
authorAndrew Bartlett <abartlet@samba.org>
Mon, 11 Feb 2013 03:46:43 +0000 (14:46 +1100)
committerStefan Metzmacher <metze@samba.org>
Fri, 22 Feb 2013 10:06:17 +0000 (11:06 +0100)
This is an unusual SD, but it does exist is some very old upgraded databases.

Andrew Bartlett

Reviewed-by: Stefan Metzmacher <metze@samba.org>
Autobuild-User(master): Stefan Metzmacher <metze@samba.org>
Autobuild-Date(master): Fri Feb 22 11:06:17 CET 2013 on sn-devel-104

source4/dsdb/samdb/ldb_modules/descriptor.c

index 859558ca1e731aec0c4a03bba927b89929ed3585..7743baaaa5b8c94eb83a8dd2528d5060c99481b0 100644 (file)
@@ -181,20 +181,28 @@ static struct security_descriptor *descr_handle_sd_flags(TALLOC_CTX *mem_ctx,
        final_sd->type = SEC_DESC_SELF_RELATIVE;
 
        if (sd_flags & (SECINFO_OWNER)) {
-               final_sd->owner_sid = talloc_memdup(mem_ctx, new_sd->owner_sid, sizeof(struct dom_sid));
+               if (new_sd->owner_sid) {
+                       final_sd->owner_sid = talloc_memdup(mem_ctx, new_sd->owner_sid, sizeof(struct dom_sid));
+               }
                final_sd->type |= new_sd->type & SEC_DESC_OWNER_DEFAULTED;
        }
        else if (old_sd) {
-               final_sd->owner_sid = talloc_memdup(mem_ctx, old_sd->owner_sid, sizeof(struct dom_sid));
+               if (old_sd->owner_sid) {
+                       final_sd->owner_sid = talloc_memdup(mem_ctx, old_sd->owner_sid, sizeof(struct dom_sid));
+               }
                final_sd->type |= old_sd->type & SEC_DESC_OWNER_DEFAULTED;
        }
 
        if (sd_flags & (SECINFO_GROUP)) {
-               final_sd->group_sid = talloc_memdup(mem_ctx, new_sd->group_sid, sizeof(struct dom_sid));
+               if (new_sd->group_sid) {
+                       final_sd->group_sid = talloc_memdup(mem_ctx, new_sd->group_sid, sizeof(struct dom_sid));
+               }
                final_sd->type |= new_sd->type & SEC_DESC_GROUP_DEFAULTED;
        } 
        else if (old_sd) {
-               final_sd->group_sid = talloc_memdup(mem_ctx, old_sd->group_sid, sizeof(struct dom_sid));
+               if (old_sd->group_sid) {
+                       final_sd->group_sid = talloc_memdup(mem_ctx, old_sd->group_sid, sizeof(struct dom_sid));
+               }
                final_sd->type |= old_sd->type & SEC_DESC_GROUP_DEFAULTED;
        }