grap...@gmail.com wrote:
> 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:

Since this is allocated in thread-local memory, there is no actual leak.

> --- 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;
>  }
> 
> 


-- 
  -- Howard Chu
  CTO, Symas Corp.           http://www.symas.com
  Director, Highland Sun     http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP  http://www.openldap.org/project/



Reply via email to