svn commit: samba r24567 - in
branches/SAMBA_4_0/source/lib/ldb/samba: .
abartlet at samba.org
abartlet at samba.org
Mon Aug 20 00:22:54 GMT 2007
Author: abartlet
Date: 2007-08-20 00:22:53 +0000 (Mon, 20 Aug 2007)
New Revision: 24567
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24567
Log:
Try much harder not to leak memory when comparing objectCategory entires.
Andrew Bartlett
Modified:
branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c
Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c 2007-08-20 00:22:08 UTC (rev 24566)
+++ branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c 2007-08-20 00:22:53 UTC (rev 24567)
@@ -300,26 +300,48 @@
struct ldb_dn *dn1 = NULL;
const struct dsdb_schema *schema = dsdb_get_schema(ldb);
const struct dsdb_class *class;
+ TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+ if (!tmp_ctx) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
if (!schema) {
*out = data_blob_talloc(mem_ctx, in->data, in->length);
+ if (in->data && !out->data) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
return LDB_SUCCESS;
}
- dn1 = ldb_dn_new(mem_ctx, ldb, (char *)in->data);
+ dn1 = ldb_dn_new(tmp_ctx, ldb, (char *)in->data);
if ( ! ldb_dn_validate(dn1)) {
- const char *lDAPDisplayName = talloc_strndup(mem_ctx, (char *)in->data, in->length);
+ const char *lDAPDisplayName = talloc_strndup(tmp_ctx, (char *)in->data, in->length);
class = dsdb_class_by_lDAPDisplayName(schema, lDAPDisplayName);
if (class) {
struct ldb_dn *dn = ldb_dn_new(mem_ctx, ldb,
class->defaultObjectCategory);
- *out = data_blob_string_const(ldb_dn_get_casefold(dn));
+ *out = data_blob_string_const(ldb_dn_alloc_casefold(mem_ctx, dn));
+ talloc_free(tmp_ctx);
+
+ if (!out->data) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
return LDB_SUCCESS;
} else {
*out = data_blob_talloc(mem_ctx, in->data, in->length);
+ talloc_free(tmp_ctx);
+
+ if (in->data && !out->data) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
return LDB_SUCCESS;
}
}
- *out = data_blob_string_const(ldb_dn_get_casefold(dn1));
+ *out = data_blob_string_const(ldb_dn_alloc_casefold(mem_ctx, dn1));
+ talloc_free(tmp_ctx);
+
+ if (!out->data) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
return LDB_SUCCESS;
}
@@ -328,16 +350,25 @@
const struct ldb_val *v2)
{
- int ret1, ret2;
+ int ret, ret1, ret2;
struct ldb_val v1_canon, v2_canon;
- ret1 = ldif_canonicalise_objectCategory(ldb, mem_ctx, v1, &v1_canon);
- ret2 = ldif_canonicalise_objectCategory(ldb, mem_ctx, v2, &v2_canon);
+ TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+ /* I could try and bail if tmp_ctx was NULL, but what return
+ * value would I use?
+ *
+ * It seems easier to continue on the NULL context
+ */
+ ret1 = ldif_canonicalise_objectCategory(ldb, tmp_ctx, v1, &v1_canon);
+ ret2 = ldif_canonicalise_objectCategory(ldb, tmp_ctx, v2, &v2_canon);
+
if (ret1 == LDB_SUCCESS && ret2 == LDB_SUCCESS) {
- return data_blob_cmp(&v1_canon, &v2_canon);
+ ret = data_blob_cmp(&v1_canon, &v2_canon);
} else {
- return data_blob_cmp(v1, v2);
+ ret = data_blob_cmp(v1, v2);
}
+ talloc_free(tmp_ctx);
+ return ret;
}
#define LDB_SYNTAX_SAMBA_SID "LDB_SYNTAX_SAMBA_SID"
More information about the samba-cvs
mailing list