nivanova@symas.com wrote:
Full_Name: Nadezhda Ivanova Version: 2.5 OS: Ubuntu 14.04 URL: ftp://ftp.openldap.org/incoming/nadezhda-ivanova-160414.patch Submission from: (NULL) (78.83.54.234)
The problem was reproduced when attempting to modify the dynamic configuration of meta and asyncmeta rewrite engine. On a meta database that has rewrite enabled and some rewrite rules configured, execute ldapmodify with the following LDIF: dn: olcMetaSub={0}uri,olcDatabase={1}meta,cn=config replace: olcDbRewrite olcDbRewrite: rewriteEngine "off"
Hm, multiple problems with this patch:
diff --git a/servers/slapd/back-asyncmeta/config.c b/servers/slapd/back-asyncmeta/config.c index 1801a55..a4fbb91 100644 --- a/servers/slapd/back-asyncmeta/config.c +++ b/servers/slapd/back-asyncmeta/config.c @@ -1797,14 +1797,66 @@ asyncmeta_back_cf_gen( ConfigArgs *c )
case LDAP_BACK_CFG_SUFFIXM: /* unused */ case LDAP_BACK_CFG_REWRITE:
if ( mt->mt_rwmap.rwm_bva_rewrite ) {
ber_bvarray_free( mt->mt_rwmap.rwm_bva_rewrite );
mt->mt_rwmap.rwm_bva_rewrite = NULL;
}
if ( mt->mt_rwmap.rwm_rw )
{
char *argv0;
if ( c->valx >= 0 ) {
int i;
for ( i = 0; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i ] ); i++ )
Need a semicolon for the empty for-loop. Or, if it's intended that the following if-block is part of the loop, it needs to be properly enclosed in braces and indented.
if ( c->valx >= i ) {
rc = 1;
break;
}
ber_memfree( mt->mt_rwmap.rwm_bva_rewrite[ c->valx ].bv_val );
for ( i = c->valx; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i + 1 ] ); i++ )
{
mt->mt_rwmap.rwm_bva_rewrite[ i ] = mt->mt_rwmap.rwm_bva_rewrite[ i + 1 ];
}
BER_BVZERO( &mt->mt_rwmap.rwm_bva_rewrite[ i ] );
rewrite_info_delete( &mt->mt_rwmap.rwm_rw );
break;
assert( mt->mt_rwmap.rwm_rw == NULL );
rc = asyncmeta_rwi_init( &mt->mt_rwmap.rwm_rw );
for ( i = 0; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i ] ); i++ )
{
ConfigArgs ca = { 0 };
ca.line = mt->mt_rwmap.rwm_bva_rewrite[ i ].bv_val;
ca.argc = 0;
Unnecessary initialization, you already set all of ca = {0}.
init_config_argv( &ca );
config_parse_ldif( &ca );
argv0 = ca.argv[ 0 ];
What is argv0 being saved for?
if ( !strcasecmp( ca.argv[0], "suffixmassage" )) {
rc = asyncmeta_suffixm_config( &ca, ca.argc, ca.argv, mt );
} else {
rc = rewrite_parse( mt->mt_rwmap.rwm_rw,
c->fname, c->lineno, ca.argc, ca.argv );
}
ca.argv[ 0 ] = argv0;
Why is argv0 being restored? All you're doing after this is freeing ca.argv anyway.
ch_free( ca.tline );
ch_free( ca.argv );
assert( rc == 0 );
}
} else if ( mt->mt_rwmap.rwm_rw != NULL ) {
if ( mt->mt_rwmap.rwm_bva_rewrite ) {
ber_bvarray_free( mt->mt_rwmap.rwm_bva_rewrite );
mt->mt_rwmap.rwm_bva_rewrite = NULL;
}
if ( mt->mt_rwmap.rwm_rw )
rewrite_info_delete( &mt->mt_rwmap.rwm_rw );
asyncmeta_rwi_init( &mt->mt_rwmap.rwm_rw );
}
}
break;
case LDAP_BACK_CFG_MAP: if ( mt->mt_rwmap.rwm_bva_map ) { ber_bvarray_free( mt->mt_rwmap.rwm_bva_map );