From 61f3a05fde969df172c3e3d17dd9fc423998ff26 Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Sep 22 2015 17:52:56 +0000 Subject: Ticket 48284 - free entry when internal add fails Bug Description: The entry passed to an internal add operaton is expected to be consumed, but it is not freed during an internal add when setting slapi_add_internal_pb() returns an error. Fix Description: Free the entry in slapi_add_internal_pb() when the operation is not allowed. https://fedorahosted.org/389/ticket/48284 Reviewed by: nhosoi(Thanks!) (cherry picked from commit 622be8bfbc942fe100b8880df72db26e99e1c954) --- diff --git a/ldap/servers/slapd/add.c b/ldap/servers/slapd/add.c index 12b97e8..8f72e28 100644 --- a/ldap/servers/slapd/add.c +++ b/ldap/servers/slapd/add.c @@ -348,6 +348,12 @@ int slapi_add_internal_pb (Slapi_PBlock *pb) if (!allow_operation (pb)) { + /* free the entry as it's expected to be consumed */ + Slapi_Entry *e; + slapi_pblock_get(pb, SLAPI_ADD_ENTRY, &e); + slapi_pblock_set(pb, SLAPI_ADD_ENTRY, NULL); + slapi_entry_free(e); + slapi_send_ldap_result( pb, LDAP_UNWILLING_TO_PERFORM, NULL, "This plugin is not configured to access operation target data", 0, NULL ); return 0; @@ -759,8 +765,8 @@ static void op_shared_add (Slapi_PBlock *pb) slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &pse); do_ps_service(pse, NULL, LDAP_CHANGETYPE_ADD, 0); /* - * If be_add succeeded, then e is consumed except the resurect case. - * If it is resurect, the corresponding tombstone entry is resurected + * If be_add succeeded, then e is consumed except the resurrect case. + * If it is resurrect, the corresponding tombstone entry is resurrected * and put into the cache. * Otherwise, we set e to NULL to prevent freeing it ourselves. */