dsdb: Avoid talloc() calls in dsdb_get_extended_dn_*()
authorAndrew Bartlett <abartlet@samba.org>
Thu, 16 Jun 2016 02:04:44 +0000 (14:04 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 26 Jun 2016 22:18:18 +0000 (00:18 +0200)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
source4/dsdb/common/util.c

index cfa13768ea267186660457fe6db8dc01939f6c91..667bd866a6f40a519843984f396fd73da6c47ba8 100644 (file)
@@ -3642,18 +3642,19 @@ NTSTATUS dsdb_get_extended_dn_guid(struct ldb_dn *dn, struct GUID *guid, const c
 NTSTATUS dsdb_get_extended_dn_uint64(struct ldb_dn *dn, uint64_t *val, const char *component_name)
 {
        const struct ldb_val *v;
-       char *s;
 
        v = ldb_dn_get_extended_component(dn, component_name);
        if (v == NULL) {
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
-       s = talloc_strndup(dn, (const char *)v->data, v->length);
-       NT_STATUS_HAVE_NO_MEMORY(s);
 
-       *val = strtoull(s, NULL, 0);
+       {
+               char s[v->length+1];
+               memcpy(s, v->data, v->length);
+               s[v->length] = 0;
 
-       talloc_free(s);
+               *val = strtoull(s, NULL, 0);
+       }
        return NT_STATUS_OK;
 }
 
@@ -3671,19 +3672,19 @@ NTSTATUS dsdb_get_extended_dn_nttime(struct ldb_dn *dn, NTTIME *nttime, const ch
 NTSTATUS dsdb_get_extended_dn_uint32(struct ldb_dn *dn, uint32_t *val, const char *component_name)
 {
        const struct ldb_val *v;
-       char *s;
 
        v = ldb_dn_get_extended_component(dn, component_name);
        if (v == NULL) {
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
 
-       s = talloc_strndup(dn, (const char *)v->data, v->length);
-       NT_STATUS_HAVE_NO_MEMORY(s);
-
-       *val = strtoul(s, NULL, 0);
+       {
+               char s[v->length + 1];
+               memcpy(s, v->data, v->length);
+               s[v->length] = 0;
+               *val = strtoul(s, NULL, 0);
+       }
 
-       talloc_free(s);
        return NT_STATUS_OK;
 }
 
@@ -3693,7 +3694,6 @@ NTSTATUS dsdb_get_extended_dn_uint32(struct ldb_dn *dn, uint32_t *val, const cha
 NTSTATUS dsdb_get_extended_dn_sid(struct ldb_dn *dn, struct dom_sid *sid, const char *component_name)
 {
        const struct ldb_val *sid_blob;
-       struct TALLOC_CTX *tmp_ctx;
        enum ndr_err_code ndr_err;
 
        sid_blob = ldb_dn_get_extended_component(dn, component_name);
@@ -3701,17 +3701,13 @@ NTSTATUS dsdb_get_extended_dn_sid(struct ldb_dn *dn, struct dom_sid *sid, const
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
 
-       tmp_ctx = talloc_new(NULL);
-
-       ndr_err = ndr_pull_struct_blob_all(sid_blob, tmp_ctx, sid,
-                                          (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
+       ndr_err = ndr_pull_struct_blob_all_noalloc(sid_blob, sid,
+                                                  (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
-               talloc_free(tmp_ctx);
                return status;
        }
 
-       talloc_free(tmp_ctx);
        return NT_STATUS_OK;
 }