From 08f5aca7db1e48ce61c1f4914157efb64f01a32e Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 13 Jan 2015 20:31:06 +0000 Subject: [PATCH] Plug unlikely memleak (coverity) --- libraries/libldap_r/tpool.c | 12 +++++++++--- libraries/liblunicode/ucstr.c | 19 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/libraries/libldap_r/tpool.c b/libraries/libldap_r/tpool.c index 44f9544b58..3aaaf20e8a 100644 --- a/libraries/libldap_r/tpool.c +++ b/libraries/libldap_r/tpool.c @@ -266,16 +266,22 @@ ldap_pvt_thread_pool_init_q ( max_threads = LDAP_MAXTHR; rc = ldap_pvt_thread_mutex_init(&pool->ltp_mutex); - if (rc != 0) + if (rc != 0) { +fail: + for (i=0; iltp_wqs[i]->ltp_free); + LDAP_FREE(pool->ltp_wqs); + LDAP_FREE(pool); return(rc); + } rc = ldap_pvt_thread_cond_init(&pool->ltp_cond); if (rc != 0) - return(rc); + goto fail; rc = ldap_pvt_thread_cond_init(&pool->ltp_pcond); if (rc != 0) - return(rc); + goto fail; rem_thr = max_threads % numqs; rem_pend = max_pending % numqs; diff --git a/libraries/liblunicode/ucstr.c b/libraries/liblunicode/ucstr.c index ccb484e83f..7e8f3ec13c 100644 --- a/libraries/liblunicode/ucstr.c +++ b/libraries/liblunicode/ucstr.c @@ -109,6 +109,7 @@ struct berval * UTF8bvnormalize( void *ctx ) { int i, j, len, clen, outpos, ucsoutlen, outsize, last; + int didnewbv = 0; char *out, *outtmp, *s; ac_uint4 *ucs, *p, *ucsout; @@ -132,6 +133,7 @@ struct berval * UTF8bvnormalize( if ( !newbv ) { newbv = ber_memalloc_x( sizeof(struct berval), ctx ); if ( !newbv ) return NULL; + didnewbv = 1; } /* Should first check to see if string is already in proper @@ -145,6 +147,9 @@ struct berval * UTF8bvnormalize( outsize = len + 7; out = (char *) ber_memalloc_x( outsize, ctx ); if ( out == NULL ) { +fail: + if ( didnewbv ) + ber_memfree_x( newbv, ctx ); return NULL; } outpos = 0; @@ -171,7 +176,7 @@ struct berval * UTF8bvnormalize( outsize = len + 7; out = (char *) ber_memalloc_x( outsize, ctx ); if ( out == NULL ) { - return NULL; + goto fail; } outpos = i - 1; memcpy(out, s, outpos); @@ -180,7 +185,7 @@ struct berval * UTF8bvnormalize( outsize = len + 7; out = (char *) ber_memalloc_x( outsize, ctx ); if ( out == NULL ) { - return NULL; + goto fail; } outpos = 0; i = 0; @@ -189,7 +194,7 @@ struct berval * UTF8bvnormalize( p = ucs = ber_memalloc_x( len * sizeof(*ucs), ctx ); if ( ucs == NULL ) { ber_memfree_x(out, ctx); - return NULL; + goto fail; } /* convert character before first non-ascii to ucs-4 */ @@ -207,7 +212,7 @@ struct berval * UTF8bvnormalize( if ( clen == 0 ) { ber_memfree_x( ucs, ctx ); ber_memfree_x( out, ctx ); - return NULL; + goto fail; } if ( clen == 1 ) { /* ascii */ @@ -219,7 +224,7 @@ struct berval * UTF8bvnormalize( if ( (s[i] & 0xc0) != 0x80 ) { ber_memfree_x( ucs, ctx ); ber_memfree_x( out, ctx ); - return NULL; + goto fail; } *p <<= 6; *p |= s[i] & 0x3f; @@ -251,7 +256,7 @@ struct berval * UTF8bvnormalize( ber_memfree_x( ucsout, ctx ); ber_memfree_x( ucs, ctx ); ber_memfree_x( out, ctx ); - return NULL; + goto fail; } out = outtmp; } @@ -275,7 +280,7 @@ struct berval * UTF8bvnormalize( if (outtmp == NULL) { ber_memfree_x( ucs, ctx ); ber_memfree_x( out, ctx ); - return NULL; + goto fail; } out = outtmp; } -- 2.39.5