[email protected] 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/



Reply via email to