]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
r19305: Potential memleak on the ldb_context if we don't use a temp mem context
authorSimo Sorce <idra@samba.org>
Mon, 16 Oct 2006 01:01:37 +0000 (01:01 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:21:05 +0000 (14:21 -0500)
(This used to be commit c989dfbe18a2f700e952f478e258bd626c9eb2f5)

source4/lib/ldb/common/ldb_ldif.c

index 0c31f25cc793b5cf1e0be0d637f1a13c536d4e64..ed76ceec76f78d6c7be21e263d6ccd20372084b9 100644 (file)
@@ -232,6 +232,8 @@ static int fold_string(int (*fprintf_fn)(void *, const char *, ...), void *priva
        return total;
 }
 
+#undef CHECK_RET
+
 /*
   encode as base64 to a file
 */
@@ -264,6 +266,9 @@ static const struct {
        {NULL, 0}
 };
 
+/* this macro is used to handle the return checking on fprintf_fn() */
+#define CHECK_RET do { if (ret < 0) { talloc_free(mem_ctx); return ret; } total += ret; } while (0)
+
 /*
   write to ldif, using a caller supplied write method
 */
@@ -272,10 +277,13 @@ int ldb_ldif_write(struct ldb_context *ldb,
                   void *private_data,
                   const struct ldb_ldif *ldif)
 {
+       TALLOC_CTX *mem_ctx;
        unsigned int i, j;
        int total=0, ret;
        const struct ldb_message *msg;
 
+       mem_ctx = talloc_named_const(NULL, 0, "ldb_ldif_write");
+
        msg = ldif->msg;
 
        ret = fprintf_fn(private_data, "dn: %s\n", ldb_dn_linearize(msg->dn, msg->dn));
@@ -290,6 +298,7 @@ int ldb_ldif_write(struct ldb_context *ldb,
                if (!ldb_changetypes[i].name) {
                        ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Invalid ldif changetype %d\n",
                                  ldif->changetype);
+                       talloc_free(mem_ctx);
                        return -1;
                }
                ret = fprintf_fn(private_data, "changetype: %s\n", ldb_changetypes[i].name);
@@ -320,7 +329,7 @@ int ldb_ldif_write(struct ldb_context *ldb,
 
                for (j=0;j<msg->elements[i].num_values;j++) {
                        struct ldb_val v;
-                       ret = h->ldif_write_fn(ldb, ldb, &msg->elements[i].values[j], &v);
+                       ret = h->ldif_write_fn(ldb, mem_ctx, &msg->elements[i].values[j], &v);
                        CHECK_RET;
                        if (ldb_should_b64_encode(&v)) {
                                ret = fprintf_fn(private_data, "%s:: ",