r25610: Add security_descriptor_appendv() which takes va_list directly.
[samba.git] / source4 / libcli / security / security_descriptor.c
index d744f2cc8d4829a4d347a14f247aab63b30e7369..9454560c947f8665af5cceb9997b73dac56698da 100644 (file)
@@ -338,13 +338,11 @@ bool security_descriptor_mask_equal(const struct security_descriptor *sd1,
   that would create a sd with one DACL ACE
 */
 
-struct security_descriptor *security_descriptor_append(struct security_descriptor *sd,
-                                                      ...)
+struct security_descriptor *security_descriptor_appendv(struct security_descriptor *sd,
+                                                       va_list ap)
 {
-       va_list ap;
        const char *sidstr;
 
-       va_start(ap, sd);
        while ((sidstr = va_arg(ap, const char *))) {
                struct dom_sid *sid;
                struct security_ace *ace = talloc(sd, struct security_ace);
@@ -352,7 +350,6 @@ struct security_descriptor *security_descriptor_append(struct security_descripto
 
                if (ace == NULL) {
                        talloc_free(sd);
-                       va_end(ap);
                        return NULL;
                }
                ace->type = va_arg(ap, unsigned int);
@@ -360,7 +357,6 @@ struct security_descriptor *security_descriptor_append(struct security_descripto
                ace->flags = va_arg(ap, unsigned int);
                sid = dom_sid_parse_talloc(ace, sidstr);
                if (sid == NULL) {
-                       va_end(ap);
                        talloc_free(sd);
                        return NULL;
                }
@@ -368,15 +364,24 @@ struct security_descriptor *security_descriptor_append(struct security_descripto
                status = security_descriptor_dacl_add(sd, ace);
                /* TODO: check: would talloc_free(ace) here be correct? */
                if (!NT_STATUS_IS_OK(status)) {
-                       va_end(ap);
                        talloc_free(sd);
                        return NULL;
                }
        }
-       va_end(ap);
 
        return sd;
+}
 
+struct security_descriptor *security_descriptor_append(struct security_descriptor *sd,
+                                                      ...)
+{
+       va_list ap;
+
+       va_start(ap, sd);
+       sd = security_descriptor_appendv(sd, ap);
+       va_end(ap);
+
+       return sd;
 }
 
 struct security_descriptor *security_descriptor_create(TALLOC_CTX *mem_ctx,
@@ -409,7 +414,7 @@ struct security_descriptor *security_descriptor_create(TALLOC_CTX *mem_ctx,
        }
 
        va_start(ap, group_sid);
-       sd = security_descriptor_append(sd, ap);
+       sd = security_descriptor_appendv(sd, ap);
        va_end(ap);
 
        return sd;