s4-dsdb: Improve memory handling in kccsrv_find_connections() by adding a tmp_ctx
authorAndrew Bartlett <abartlet@samba.org>
Tue, 14 Aug 2012 05:56:04 +0000 (15:56 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 14 Aug 2012 06:27:19 +0000 (08:27 +0200)
source4/dsdb/kcc/kcc_connection.c

index 1c4ebb158164902d55cdebfb5439837c73d4d082..a5894c1a88884ffbb8e8683d6bcbb06cb8cf8f18 100644 (file)
@@ -184,32 +184,41 @@ struct kcc_connection_list *kccsrv_find_connections(struct kccsrv_service *s,
        struct ldb_result *res;
        const char *attrs[] = { "objectGUID", "fromServer", NULL };
        struct kcc_connection_list *list;
-
+       TALLOC_CTX *tmp_ctx;
        kcctpl_test(s);
 
+       tmp_ctx = talloc_new(mem_ctx);
+       if (!tmp_ctx) {
+               DEBUG(0, ("failed to talloc\n"));
+               return NULL;
+       }
+
        base_dn = samdb_ntds_settings_dn(s->samdb);
        if (!base_dn) {
                DEBUG(0, ("failed to find our own NTDS settings DN\n"));
+               talloc_free(tmp_ctx);
                return NULL;
        }
 
-       ret = ldb_search(s->samdb, mem_ctx, &res, base_dn, LDB_SCOPE_ONELEVEL,
+       ret = ldb_search(s->samdb, tmp_ctx, &res, base_dn, LDB_SCOPE_ONELEVEL,
                         attrs, "objectClass=nTDSConnection");
        if (ret != LDB_SUCCESS) {
                DEBUG(0, ("failed nTDSConnection search: %s\n",
                          ldb_strerror(ret)));
+               talloc_free(tmp_ctx);
                return NULL;
        }
 
-       list = talloc(mem_ctx, struct kcc_connection_list);
+       list = talloc(tmp_ctx, struct kcc_connection_list);
        if (!list) {
                DEBUG(0, ("out of memory"));
                return NULL;
        }
-       list->servers = talloc_array(mem_ctx, struct kcc_connection,
+       list->servers = talloc_array(list, struct kcc_connection,
                                     res->count);
        if (!list->servers) {
                DEBUG(0, ("out of memory"));
+               talloc_free(tmp_ctx);
                return NULL;
        }
        list->count = 0;
@@ -233,5 +242,7 @@ struct kcc_connection_list *kccsrv_find_connections(struct kccsrv_service *s,
                list->count++;
        }
        DEBUG(4, ("found %d existing nTDSConnection objects\n", list->count));
+       talloc_steal(mem_ctx, list);
+       talloc_free(tmp_ctx);
        return list;
 }