diff --git a/libraries/librewrite/subst.c b/libraries/librewrite/subst.c index 4c0bc411e0..a6d9fdbabf 100644 --- a/libraries/librewrite/subst.c +++ b/libraries/librewrite/subst.c @@ -300,10 +300,12 @@ rewrite_subst_apply( /* * Prepare room for submatch expansion */ - submatch = calloc( sizeof( struct berval ), - subst->lt_num_submatch ); - if ( submatch == NULL ) { - return REWRITE_REGEXEC_ERR; + if ( subst->lt_num_submatch > 0 ) { + submatch = calloc( sizeof( struct berval ), + subst->lt_num_submatch ); + if ( submatch == NULL ) { + return REWRITE_REGEXEC_ERR; + } } /* @@ -408,8 +410,8 @@ rewrite_subst_apply( l += subst->lt_subs_len; res = calloc( sizeof( char ), l + 1 ); if ( res == NULL ) { - free( submatch ); - return REWRITE_REGEXEC_ERR; + rc = REWRITE_REGEXEC_ERR; + goto cleanup; } /* @@ -433,7 +435,12 @@ rewrite_subst_apply( val->bv_val = res; val->bv_len = l; - + +cleanup:; + if ( submatch ) { + free( submatch ); + } + return rc; }