diff options
Diffstat (limited to 'ldap/servers/plugins/syntaxes/string.c')
-rw-r--r-- | ldap/servers/plugins/syntaxes/string.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/ldap/servers/plugins/syntaxes/string.c b/ldap/servers/plugins/syntaxes/string.c index 21ff5d1b..9131f9f3 100644 --- a/ldap/servers/plugins/syntaxes/string.c +++ b/ldap/servers/plugins/syntaxes/string.c @@ -601,7 +601,7 @@ string_assertion2keys_ava( size_t len; char *w, *c; Slapi_Value *tmpval=NULL; - char *alt = NULL; + char *alt = NULL; switch ( ftype ) { case LDAP_FILTER_EQUALITY_FAST: @@ -613,12 +613,14 @@ string_assertion2keys_ava( } memcpy(tmpval->bv.bv_val,slapi_value_get_string(val),len); tmpval->bv.bv_val[len]='\0'; - /* 3rd arg: 1 - trim leading blanks */ + /* 3rd arg: 1 - trim leading blanks */ value_normalize_ext(tmpval->bv.bv_val, syntax, 1, &alt ); - if (alt) { - slapi_ch_free_string(&tmpval->bv.bv_val); - tmpval->bv.bv_val = alt; - } + if (alt) { + if (len >= tmpval->bv.bv_len) { + slapi_ch_free_string(&tmpval->bv.bv_val); + } + tmpval->bv.bv_val = alt; + } tmpval->bv.bv_len=strlen(tmpval->bv.bv_val); break; case LDAP_FILTER_EQUALITY: @@ -627,7 +629,7 @@ string_assertion2keys_ava( /* 3rd arg: 1 - trim leading blanks */ value_normalize_ext( (*ivals)[0]->bv.bv_val, syntax, 1, &alt ); if (alt) { - slapi_ch_free_string(&(*ivals)[0]->bv.bv_val); + slapi_ch_free_string(&(*ivals)[0]->bv.bv_val); (*ivals)[0]->bv.bv_val = alt; } (*ivals)[0]->bv.bv_len = strlen( (*ivals)[0]->bv.bv_val ); @@ -687,8 +689,11 @@ string_assertion2keys_sub( int maxsublen; char *comp_buf = NULL; char *altinit = NULL; + char *oaltinit = NULL; char **altany = NULL; + char **oaltany = NULL; char *altfinal = NULL; + char *oaltfinal = NULL; int anysize = 0; slapi_pblock_get(pb, SLAPI_SYNTAX_SUBSTRLENS, &substrlens); @@ -719,6 +724,7 @@ string_assertion2keys_sub( if ( initial != NULL ) { /* 3rd arg: 0 - DO NOT trim leading blanks */ value_normalize_ext( initial, syntax, 0, &altinit ); + oaltinit = altinit; if (NULL == altinit) { altinit = initial; } @@ -737,11 +743,14 @@ string_assertion2keys_sub( anysize++; } altany = (char **)slapi_ch_calloc(anysize + 1, sizeof(char *)); + oaltany = (char **)slapi_ch_calloc(anysize + 1, sizeof(char *)); for ( i = 0; any != NULL && any[i] != NULL; i++ ) { /* 3rd arg: 0 - DO NOT trim leading blanks */ value_normalize_ext( any[i], syntax, 0, &altany[i] ); if (NULL == altany[i]) { altany[i] = any[i]; + } else { + oaltany[i] = altany[i]; } len = strlen( altany[i] ); if ( len >= substrlens[INDEX_SUBSTRMIDDLE] ) { @@ -751,6 +760,7 @@ string_assertion2keys_sub( if ( final != NULL ) { /* 3rd arg: 0 - DO NOT trim leading blanks */ value_normalize_ext( final, syntax, 0, &altfinal ); + oaltfinal = altfinal; if (NULL == altfinal) { altfinal = final; } @@ -784,10 +794,8 @@ string_assertion2keys_sub( if ( altinit != NULL ) { substring_comp_keys( ivals, &nsubs, altinit, initiallen, '^', syntax, comp_buf, substrlens ); - if (altinit != initial) { - slapi_ch_free_string(&altinit); - } } + slapi_ch_free_string(&oaltinit); for ( i = 0; altany != NULL && altany[i] != NULL; i++ ) { len = strlen( altany[i] ); if ( len < substrlens[INDEX_SUBSTRMIDDLE] ) { @@ -795,18 +803,15 @@ string_assertion2keys_sub( } substring_comp_keys( ivals, &nsubs, altany[i], len, 0, syntax, comp_buf, substrlens ); - if (altany[i] != any[i]) { - slapi_ch_free_string(&altany[i]); - } + slapi_ch_free_string(&oaltany[i]); } + slapi_ch_free((void **)&oaltany); slapi_ch_free((void **)&altany); if ( altfinal != NULL ) { substring_comp_keys( ivals, &nsubs, altfinal, finallen, '$', syntax, comp_buf, substrlens ); - if (altfinal != final) { - slapi_ch_free_string(&final); - } } + slapi_ch_free_string(&oaltfinal); (*ivals)[nsubs] = NULL; slapi_ch_free_string(&comp_buf); |