[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#9127) memory leak in mdb_entry_decode()



Full_Name: Konstantin Andreev
Version: 2.4.48
OS: Solaris 11.3 x64
URL: 
Submission from: (NULL) (79.135.238.172)


servers/slapd/back-mdb/id2entry.c`mdb_entry_decode() leaks allocated [Entry] on
error.
Here is a fix for the master branch:

--- a/servers/slapd/back-mdb/id2entry.c
+++ b/servers/slapd/back-mdb/id2entry.c
@@ -1130,8 +1130,12 @@ done:
 	*e = x;
 	rc = 0;
 
-leave:
+clr_mvc:
 	if (mvc)
 		mdb_cursor_close(mvc);
 	return rc;
+leave:
+	/* can't mdb_entry_return() because [Entry *x] init is incomplete */
+	op->o_tmpfree( x, op->o_tmpmemctx );
+	goto clr_mvc;
 }

and for 2.4 branch, if you care:

--- a/servers/slapd/back-mdb/id2entry.c
+++ b/servers/slapd/back-mdb/id2entry.c
@@ -695,12 +695,13 @@
 		if (i > mdb->mi_numads) {
 			rc = mdb_ad_read(mdb, txn);
 			if (rc)
-				return rc;
+				goto leave;
 			if (i > mdb->mi_numads) {
 				Debug( LDAP_DEBUG_ANY,
 					"mdb_entry_decode: attribute index %d not recognized\n",
 					i, 0, 0 );
-				return LDAP_OTHER;
+				rc = LDAP_OTHER;
+				goto leave;
 			}
 		}
 		a->a_desc = mdb->mi_ads[i];
@@ -745,7 +746,7 @@
 				Debug( LDAP_DEBUG_ANY,
 					"mdb_entry_decode: attributeType %s value #%d provided more than once\n",
 					a->a_desc->ad_cname.bv_val, j, 0 );
-				return rc;
+				goto leave;
 			}
 		}
 		a->a_next = a+1;
@@ -758,4 +759,8 @@
 		0, 0, 0 );
 	*e = x;
 	return 0;
+leave:
+	/* can't mdb_entry_return() because [Entry *x] init is incomplete */
+	op->o_tmpfree( x, op->o_tmpmemctx );
+	return rc;
 }