On Tue, Aug 14, 2012 at 02:32:55PM +0200, Petr Spacek wrote:
> Hello,
> 
> This patch fixes two memory leaks in persistent search.

Ack.

> From 892f1d5c59a97cdad7a2807ecd172488605ab181 Mon Sep 17 00:00:00 2001
> From: Petr Spacek <pspa...@redhat.com>
> Date: Tue, 14 Aug 2012 12:38:43 +0200
> Subject: [PATCH] Fix two memory leaks in persistent search.
> 
> Signed-off-by: Petr Spacek <pspa...@redhat.com>
> ---
>  src/ldap_helper.c | 45 ++++++++++++---------------------------------
>  1 file changed, 12 insertions(+), 33 deletions(-)
> 
> diff --git a/src/ldap_helper.c b/src/ldap_helper.c
> index 
> cc7003a6cdcd2d27404fec936623ed8a3e8fa7f8..6f9711c55abc008a1abfd4b36382bdf697cd2bd8
>  100644
> --- a/src/ldap_helper.c
> +++ b/src/ldap_helper.c
> @@ -313,8 +313,7 @@ static isc_result_t ldap_pool_connect(ldap_pool_t *pool,
>               ldap_instance_t *ldap_inst);
>  
>  /* Functions for manipulating LDAP persistent search control */
> -static isc_result_t ldap_pscontrol_create(isc_mem_t *mctx, LDAPControl 
> **ctrlp);
> -static void ldap_pscontrol_destroy(isc_mem_t *mctx, LDAPControl **ctrlp);
> +static isc_result_t ldap_pscontrol_create(LDAPControl **ctrlp);
>  
>  static isc_threadresult_t ldap_psearch_watcher(isc_threadarg_t arg);
>  static void psearch_update(ldap_instance_t *inst, ldap_entry_t *entry,
> @@ -639,8 +638,7 @@ new_ldap_connection(ldap_pool_t *pool, ldap_connection_t 
> **ldap_connp)
>  
>       CHECK(isc_lex_create(ldap_conn->mctx, TOKENSIZ, &ldap_conn->lex));
>       CHECKED_MEM_GET(ldap_conn->mctx, ldap_conn->rdata_target_mem, MINTSIZ);
> -     CHECK(ldap_pscontrol_create(ldap_conn->mctx,
> -                                 &ldap_conn->serverctrls[0]));
> +     CHECK(ldap_pscontrol_create(&ldap_conn->serverctrls[0]));
>  
>       *ldap_connp = ldap_conn;
>  
> @@ -674,8 +672,7 @@ destroy_ldap_connection(ldap_pool_t *pool, 
> ldap_connection_t **ldap_connp)
>                           ldap_conn->rdata_target_mem, MINTSIZ);
>       }
>       if (ldap_conn->serverctrls[0] != NULL) {
> -             ldap_pscontrol_destroy(ldap_conn->mctx,
> -                                    &ldap_conn->serverctrls[0]);
> +             ldap_control_free(ldap_conn->serverctrls[0]);
>       }
>  
>       isc_mem_detach(&ldap_conn->mctx);
> @@ -2819,10 +2816,10 @@ cleanup:
>   * http://tools.ietf.org/id/draft-ietf-ldapext-psearch-03.txt) control.
>   */
>  static isc_result_t
> -ldap_pscontrol_create(isc_mem_t *mctx, LDAPControl **ctrlp)
> +ldap_pscontrol_create(LDAPControl **ctrlp)
>  {
>       BerElement *ber;
> -     LDAPControl *ctrl = NULL;
> +     struct berval *berval;
>       isc_result_t result = ISC_R_FAILURE;
>  
>       REQUIRE(ctrlp != NULL && *ctrlp == NULL);
> @@ -2841,45 +2838,25 @@ ldap_pscontrol_create(isc_mem_t *mctx, LDAPControl 
> **ctrlp)
>       if (ber_printf(ber, "{ibb}", LDAP_ENTRYCHANGE_ALL, 0, 1) == -1)
>               goto cleanup;
>  
> -     CHECKED_MEM_GET(mctx, ctrl, sizeof(*ctrl));
> -     ZERO_PTR(ctrl);
> -     ctrl->ldctl_iscritical = 1;
> -     ctrl->ldctl_oid = strdup(LDAP_CONTROL_PERSISTENTSEARCH);
> -     if (ctrl->ldctl_oid == NULL)
> +     if (ber_flatten(ber, &berval) < 0)
>               goto cleanup;
>  
> -     if (ber_flatten2(ber, &ctrl->ldctl_value, 1) < 0)
> +     if (ldap_control_create(LDAP_CONTROL_PERSISTENTSEARCH, 1, berval, 1, 
> ctrlp)
> +                     != LDAP_SUCCESS)
>               goto cleanup;
>  
>       ber_free(ber, 1);
> -     *ctrlp = ctrl;
> +     ber_bvfree(berval);
>  
>       return ISC_R_SUCCESS;
>  
>  cleanup:
>       ber_free(ber, 1);
> -     ldap_pscontrol_destroy(mctx, &ctrl);
> +     ber_bvfree(berval);
>  
>       return result;
>  }
>  
> -static void
> -ldap_pscontrol_destroy(isc_mem_t *mctx, LDAPControl **ctrlp)
> -{
> -     LDAPControl *ctrl;
> -
> -     REQUIRE(ctrlp != NULL);
> -
> -     if (*ctrlp == NULL)
> -             return;
> -
> -     ctrl = *ctrlp;
> -     if (ctrl->ldctl_oid != NULL)
> -             free(ctrl->ldctl_oid);
> -     SAFE_MEM_PUT(mctx, ctrl, sizeof(*ctrl));
> -     *ctrlp = NULL;
> -}
> -
>  static inline isc_result_t
>  ldap_get_zone_serial(ldap_instance_t *inst, dns_name_t *zone_name,
>                               isc_uint32_t *serial) {
> @@ -3357,6 +3334,8 @@ psearch_update(ldap_instance_t *inst, ldap_entry_t 
> *entry, LDAPControl **ctrls)
>       isc_task_send(inst->task, (isc_event_t **)&pevent);
>  
>  cleanup:
> +     if (ctrls != NULL)
> +             ldap_controls_free(ctrls);
>       if (result != ISC_R_SUCCESS) {
>               if (dbname != NULL)
>                       isc_mem_free(mctx, dbname);
> -- 
> 1.7.11.2
> 


-- 
Adam Tkac, Red Hat, Inc.

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to