From 2dac2e27b5d87e7eec59634acd56fdcb1bcdf2af Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Sat, 9 Sep 2006 16:23:02 +0000 Subject: [PATCH] - use STRLENOF, looks cleaner - in case a value is incorrectly empty (technically, it's null because that's how it's returned by the stringification function), make enough room to add the error string "(null)" - in case a value is legitimately empty (see above), use it accordingly; for example, a filter "(entryDN=)" is valid, so it should be possible to stringify it like that. --- servers/slapd/filter.c | 158 +++++++++++++++++++++++++---------------- 1 file changed, 96 insertions(+), 62 deletions(-) diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index 17bc674e23..87cfd71937 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -562,77 +562,97 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) switch ( f->f_choice ) { case LDAP_FILTER_EQUALITY: filter_escape_value_x( &f->f_av_value, &tmp, op->o_tmpmemctx ); + /* NOTE: tmp can legitimately be NULL (meaning empty) + * since in a Filter values in AVAs are supposed + * to have been normalized, meaning that an empty value + * is legal for that attribute's syntax */ fstr->bv_len = f->f_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(=)") - 1 ); + tmp.bv_len + STRLENOF("(=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=%s)", f->f_av_desc->ad_cname.bv_val, - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : "" ); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); break; case LDAP_FILTER_GE: filter_escape_value_x( &f->f_av_value, &tmp, op->o_tmpmemctx ); + /* NOTE: tmp can legitimately be NULL (meaning empty) + * since in a Filter values in AVAs are supposed + * to have been normalized, meaning that an empty value + * is legal for that attribute's syntax */ fstr->bv_len = f->f_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(>=)") - 1 ); + tmp.bv_len + STRLENOF("(>=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s>=%s)", f->f_av_desc->ad_cname.bv_val, - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); break; case LDAP_FILTER_LE: filter_escape_value_x( &f->f_av_value, &tmp, op->o_tmpmemctx ); + /* NOTE: tmp can legitimately be NULL (meaning empty) + * since in a Filter values in AVAs are supposed + * to have been normalized, meaning that an empty value + * is legal for that attribute's syntax */ fstr->bv_len = f->f_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(<=)") - 1 ); + tmp.bv_len + STRLENOF("(<=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s<=%s)", f->f_av_desc->ad_cname.bv_val, - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); break; case LDAP_FILTER_APPROX: filter_escape_value_x( &f->f_av_value, &tmp, op->o_tmpmemctx ); + /* NOTE: tmp can legitimately be NULL (meaning empty) + * since in a Filter values in AVAs are supposed + * to have been normalized, meaning that an empty value + * is legal for that attribute's syntax */ fstr->bv_len = f->f_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(~=)") - 1 ); + tmp.bv_len + STRLENOF("(~=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s~=%s)", f->f_av_desc->ad_cname.bv_val, - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); break; case LDAP_FILTER_SUBSTRINGS: fstr->bv_len = f->f_sub_desc->ad_cname.bv_len + - ( sizeof("(=*)") - 1 ); + STRLENOF("(=*)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 128, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)", f->f_sub_desc->ad_cname.bv_val ); if ( f->f_sub_initial.bv_val != NULL ) { + ber_len_t tmplen; + len = fstr->bv_len; filter_escape_value_x( &f->f_sub_initial, &tmp, op->o_tmpmemctx ); + tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); - fstr->bv_len += tmp.bv_len; - fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, - op->o_tmpmemctx ); + fstr->bv_len += tmplen; + fstr->bv_val = op->o_tmprealloc( fstr->bv_val, + fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-2], tmp.bv_len+3, + snprintf( &fstr->bv_val[len-2], + tmplen + STRLENOF( /*(*/ "*)" ) + 1, /* "(attr=" */ "%s*)", tmp.bv_len ? tmp.bv_val : "(null)"); @@ -641,15 +661,19 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) if ( f->f_sub_any != NULL ) { for ( i = 0; f->f_sub_any[i].bv_val != NULL; i++ ) { + ber_len_t tmplen; + len = fstr->bv_len; filter_escape_value_x( &f->f_sub_any[i], &tmp, op->o_tmpmemctx ); + tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); - fstr->bv_len += tmp.bv_len + 1; - fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, - op->o_tmpmemctx ); + fstr->bv_len += tmplen + STRLENOF( /*(*/ ")" ); + fstr->bv_val = op->o_tmprealloc( fstr->bv_val, + fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-1], tmp.bv_len+3, + snprintf( &fstr->bv_val[len-1], + tmplen + STRLENOF( /*(*/ "*)" ) + 1, /* "(attr=[init]*[any*]" */ "%s*)", tmp.bv_len ? tmp.bv_val : "(null)"); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); @@ -657,15 +681,19 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) } if ( f->f_sub_final.bv_val != NULL ) { + ber_len_t tmplen; + len = fstr->bv_len; filter_escape_value_x( &f->f_sub_final, &tmp, op->o_tmpmemctx ); + tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); - fstr->bv_len += tmp.bv_len; - fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, - op->o_tmpmemctx ); + fstr->bv_len += tmplen; + fstr->bv_val = op->o_tmprealloc( fstr->bv_val, + fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-1], tmp.bv_len+3, + snprintf( &fstr->bv_val[len-1], + tmplen + STRLENOF( /*(*/ ")" ) + 1, /* "(attr=[init*][any*]" */ "%s)", tmp.bv_len ? tmp.bv_val : "(null)"); @@ -676,7 +704,7 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) case LDAP_FILTER_PRESENT: fstr->bv_len = f->f_desc->ad_cname.bv_len + - ( sizeof("(=*)") - 1 ); + STRLENOF("(=*)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)", @@ -686,7 +714,7 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) case LDAP_FILTER_AND: case LDAP_FILTER_OR: case LDAP_FILTER_NOT: - fstr->bv_len = sizeof("(%)") - 1; + fstr->bv_len = STRLENOF("(%)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 128, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%c)", @@ -702,7 +730,8 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-1], tmp.bv_len + 2, + snprintf( &fstr->bv_val[len-1], + tmp.bv_len + STRLENOF( /*(*/ ")" ) + 1, /*"("*/ "%s)", tmp.bv_val ); op->o_tmpfree( tmp.bv_val, op->o_tmpmemctx ); @@ -711,29 +740,34 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) break; case LDAP_FILTER_EXT: { - struct berval ad; - filter_escape_value_x( &f->f_mr_value, &tmp, op->o_tmpmemctx ); - - if ( f->f_mr_desc ) { - ad = f->f_mr_desc->ad_cname; - } else { - ad.bv_len = 0; - ad.bv_val = ""; - } - - fstr->bv_len = ad.bv_len + - ( f->f_mr_dnattrs ? sizeof(":dn")-1 : 0 ) + - ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) + - tmp.bv_len + ( sizeof("(:=)") - 1 ); - fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); - - snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)", - ad.bv_val, - f->f_mr_dnattrs ? ":dn" : "", - f->f_mr_rule_text.bv_len ? ":" : "", - f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "", - tmp.bv_len ? tmp.bv_val : "(null)"); - ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); + struct berval ad; + + filter_escape_value_x( &f->f_mr_value, &tmp, op->o_tmpmemctx ); + /* NOTE: tmp can legitimately be NULL (meaning empty) + * since in a Filter values in MRAs are supposed + * to have been normalized, meaning that an empty value + * is legal for that attribute's syntax */ + + if ( f->f_mr_desc ) { + ad = f->f_mr_desc->ad_cname; + } else { + ad.bv_len = 0; + ad.bv_val = ""; + } + + fstr->bv_len = ad.bv_len + + ( f->f_mr_dnattrs ? STRLENOF(":dn") : 0 ) + + ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) + + tmp.bv_len + STRLENOF("(:=)"); + fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); + + snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)", + ad.bv_val, + f->f_mr_dnattrs ? ":dn" : "", + f->f_mr_rule_text.bv_len ? ":" : "", + f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "", + tmp.bv_len ? tmp.bv_val : "" ); + ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); } break; case SLAPD_FILTER_COMPUTED: @@ -1116,12 +1150,12 @@ vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr ) ber_len_t len; if ( vrf == NULL ) { - ber_str2bv_x( "No filter!", sizeof("No filter!")-1, + ber_str2bv_x( "No filter!", STRLENOF("No filter!"), 1, fstr, op->o_tmpmemctx ); return; } - fstr->bv_len = sizeof("()") - 1; + fstr->bv_len = STRLENOF("()"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 128, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "()"); @@ -1149,7 +1183,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr ber_len_t len; if ( vrf == NULL ) { - ber_str2bv_x( "No filter!", sizeof("No filter!")-1, 1, fstr, + ber_str2bv_x( "No filter!", STRLENOF("No filter!"), 1, fstr, op->o_tmpmemctx ); return; } @@ -1159,7 +1193,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr filter_escape_value_x( &vrf->vrf_av_value, &tmp, op->o_tmpmemctx ); fstr->bv_len = vrf->vrf_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(=)") - 1 ); + tmp.bv_len + STRLENOF("(=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=%s)", @@ -1173,7 +1207,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr filter_escape_value_x( &vrf->vrf_av_value, &tmp, op->o_tmpmemctx ); fstr->bv_len = vrf->vrf_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(>=)") - 1 ); + tmp.bv_len + STRLENOF("(>=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s>=%s)", @@ -1187,7 +1221,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr filter_escape_value_x( &vrf->vrf_av_value, &tmp, op->o_tmpmemctx ); fstr->bv_len = vrf->vrf_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(<=)") - 1 ); + tmp.bv_len + STRLENOF("(<=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s<=%s)", @@ -1201,7 +1235,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr filter_escape_value_x( &vrf->vrf_av_value, &tmp, op->o_tmpmemctx ); fstr->bv_len = vrf->vrf_av_desc->ad_cname.bv_len + - tmp.bv_len + ( sizeof("(~=)") - 1 ); + tmp.bv_len + STRLENOF("(~=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s~=%s)", @@ -1212,7 +1246,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr case LDAP_FILTER_SUBSTRINGS: fstr->bv_len = vrf->vrf_sub_desc->ad_cname.bv_len + - ( sizeof("(=*)") - 1 ); + STRLENOF("(=*)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 128, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)", @@ -1272,7 +1306,7 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr case LDAP_FILTER_PRESENT: fstr->bv_len = vrf->vrf_desc->ad_cname.bv_len + - ( sizeof("(=*)") - 1 ); + STRLENOF("(=*)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)", @@ -1291,10 +1325,10 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr } fstr->bv_len = ad.bv_len + - ( vrf->vrf_mr_dnattrs ? sizeof(":dn")-1 : 0 ) + + ( vrf->vrf_mr_dnattrs ? STRLENOF(":dn") : 0 ) + ( vrf->vrf_mr_rule_text.bv_len ? vrf->vrf_mr_rule_text.bv_len+1 : 0 ) + - tmp.bv_len + ( sizeof("(:=)") - 1 ); + tmp.bv_len + STRLENOF("(:=)"); fstr->bv_val = op->o_tmpalloc( fstr->bv_len + 1, op->o_tmpmemctx ); snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)", @@ -1313,15 +1347,15 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr vrf->vrf_result == LDAP_COMPARE_TRUE ? "(?=true)" : vrf->vrf_result == SLAPD_COMPARE_UNDEFINED ? "(?=undefined)" : "(?=error)", - vrf->vrf_result == LDAP_COMPARE_FALSE ? sizeof("(?=false)")-1 : - vrf->vrf_result == LDAP_COMPARE_TRUE ? sizeof("(?=true)")-1 : + vrf->vrf_result == LDAP_COMPARE_FALSE ? STRLENOF("(?=false)") : + vrf->vrf_result == LDAP_COMPARE_TRUE ? STRLENOF("(?=true)") : vrf->vrf_result == SLAPD_COMPARE_UNDEFINED - ? sizeof("(?=undefined)")-1 : sizeof("(?=error)")-1, + ? STRLENOF("(?=undefined)") : STRLENOF("(?=error)"), 1, fstr, op->o_tmpmemctx ); break; default: - ber_str2bv_x( "(?=unknown)", sizeof("(?=unknown)")-1, + ber_str2bv_x( "(?=unknown)", STRLENOF("(?=unknown)"), 1, fstr, op->o_tmpmemctx ); break; } -- 2.39.5