nivanova(a)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 );
--
-- Howard Chu
CTO, Symas Corp.
http://www.symas.com
Director, Highland Sun
http://highlandsun.com/hyc/
Chief Architect, OpenLDAP
http://www.openldap.org/project/