mirror of
https://github.com/samba-team/samba.git
synced 2025-11-29 16:23:52 +03:00
r19365: fixed a memory leak in the ldb attribute handling
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
916413097d
commit
d7e0768516
@@ -39,6 +39,7 @@ int ldb_set_attrib_handlers(struct ldb_context *ldb,
|
|||||||
const struct ldb_attrib_handler *handlers,
|
const struct ldb_attrib_handler *handlers,
|
||||||
unsigned num_handlers)
|
unsigned num_handlers)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
struct ldb_attrib_handler *h;
|
struct ldb_attrib_handler *h;
|
||||||
h = talloc_realloc(ldb, ldb->schema.attrib_handlers,
|
h = talloc_realloc(ldb, ldb->schema.attrib_handlers,
|
||||||
struct ldb_attrib_handler,
|
struct ldb_attrib_handler,
|
||||||
@@ -50,6 +51,16 @@ int ldb_set_attrib_handlers(struct ldb_context *ldb,
|
|||||||
ldb->schema.attrib_handlers = h;
|
ldb->schema.attrib_handlers = h;
|
||||||
memcpy(h + ldb->schema.num_attrib_handlers,
|
memcpy(h + ldb->schema.num_attrib_handlers,
|
||||||
handlers, sizeof(*h) * num_handlers);
|
handlers, sizeof(*h) * num_handlers);
|
||||||
|
for (i=0;i<num_handlers;i++) {
|
||||||
|
if (h[ldb->schema.num_attrib_handlers+i].flags & LDB_ATTR_FLAG_ALLOCATED) {
|
||||||
|
h[ldb->schema.num_attrib_handlers+i].attr = talloc_strdup(ldb->schema.attrib_handlers,
|
||||||
|
h[ldb->schema.num_attrib_handlers+i].attr);
|
||||||
|
if (h[ldb->schema.num_attrib_handlers+i].attr == NULL) {
|
||||||
|
ldb_oom(ldb);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ldb->schema.num_attrib_handlers += num_handlers;
|
ldb->schema.num_attrib_handlers += num_handlers;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -129,6 +140,9 @@ void ldb_remove_attrib_handler(struct ldb_context *ldb, const char *attrib)
|
|||||||
if (h == &ldb_default_attrib_handler) {
|
if (h == &ldb_default_attrib_handler) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (h->flags & LDB_ATTR_FLAG_ALLOCATED) {
|
||||||
|
talloc_free(h->attr);
|
||||||
|
}
|
||||||
i = h - ldb->schema.attrib_handlers;
|
i = h - ldb->schema.attrib_handlers;
|
||||||
if (i < ldb->schema.num_attrib_handlers - 1) {
|
if (i < ldb->schema.num_attrib_handlers - 1) {
|
||||||
memmove(&ldb->schema.attrib_handlers[i],
|
memmove(&ldb->schema.attrib_handlers[i],
|
||||||
|
|||||||
@@ -357,6 +357,9 @@ struct ldb_attrib_handler {
|
|||||||
*/
|
*/
|
||||||
#define LDB_ATTR_FLAG_HIDDEN (1<<0)
|
#define LDB_ATTR_FLAG_HIDDEN (1<<0)
|
||||||
|
|
||||||
|
/* the attribute handler name should be freed when released */
|
||||||
|
#define LDB_ATTR_FLAG_ALLOCATED (1<<1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The attribute is constructed from other attributes
|
The attribute is constructed from other attributes
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -71,13 +71,7 @@ static void ltdb_attributes_unload(struct ldb_module *module)
|
|||||||
|
|
||||||
msg = ltdb->cache->attributes;
|
msg = ltdb->cache->attributes;
|
||||||
for (i=0;i<msg->num_elements;i++) {
|
for (i=0;i<msg->num_elements;i++) {
|
||||||
const struct ldb_attrib_handler *h;
|
|
||||||
/* this is rather ugly - a consequence of const handling */
|
|
||||||
h = ldb_attrib_handler(module->ldb, msg->elements[i].name);
|
|
||||||
ldb_remove_attrib_handler(module->ldb, msg->elements[i].name);
|
ldb_remove_attrib_handler(module->ldb, msg->elements[i].name);
|
||||||
if (strcmp(h->attr, msg->elements[i].name) == 0) {
|
|
||||||
talloc_steal(msg, h->attr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_free(ltdb->cache->attributes);
|
talloc_free(ltdb->cache->attributes);
|
||||||
@@ -163,11 +157,11 @@ static int ltdb_attributes_load(struct ldb_module *module)
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
h2 = *h;
|
h2 = *h;
|
||||||
h2.attr = talloc_strdup(module, msg->elements[i].name);
|
h2.attr = msg->elements[i].name;
|
||||||
|
h2.flags |= LDB_ATTR_FLAG_ALLOCATED;
|
||||||
if (ldb_set_attrib_handlers(module->ldb, &h2, 1) != 0) {
|
if (ldb_set_attrib_handlers(module->ldb, &h2, 1) != 0) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
talloc_steal(module->ldb->schema.attrib_handlers, h2.attr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user