From 1970251bb72d0a71da9375d94e9ef442a287f113 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Sun, 22 Nov 2009 11:57:17 +0000 Subject: [PATCH] check result of str2filter; syncrepl: can be broken; retcode: can't; pcache: shouldn't (ITS#6391) --- servers/slapd/overlays/pcache.c | 13 ++++++++++++- servers/slapd/overlays/retcode.c | 3 +++ servers/slapd/syncrepl.c | 13 ++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index b0f2763ce5..b10320e4a6 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -768,6 +768,10 @@ url2query( } query.scope = lud->lud_scope; query.filter = str2filter( lud->lud_filter ); + if ( query.filter == NULL ) { + rc = -1; + goto error; + } tempstr.bv_val = ch_malloc( strlen( lud->lud_filter ) + 1 ); tempstr.bv_len = 0; @@ -2639,7 +2643,14 @@ pc_bind_attrs( Operation *op, Entry *e, QueryTemplate *temp, } *p2 = '\0'; op->o_tmpfree( vals, op->o_tmpmemctx ); - return str2filter_x( op, fbv->bv_val ); + + /* FIXME: are we sure str2filter_x can't fail? + * caller needs to check */ + { + Filter *f = str2filter_x( op, fbv->bv_val ); + assert( f != NULL ); + return f; + } } /* Check if the requested entry is from the cache and has a valid diff --git a/servers/slapd/overlays/retcode.c b/servers/slapd/overlays/retcode.c index 31aa0b011a..15912540c8 100644 --- a/servers/slapd/overlays/retcode.c +++ b/servers/slapd/overlays/retcode.c @@ -257,6 +257,9 @@ retcode_op_internal( Operation *op, SlapReply *rs ) 1, &op2.ors_filterstr, op2.o_tmpmemctx ); op2.ors_filter = str2filter_x( &op2, op2.ors_filterstr.bv_val ); + /* errAbsObject is defined by this overlay! */ + assert( op2.ors_filter != NULL ); + db.bd_info = on->on_info->oi_orig; op2.o_bd = &db; diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 703fe25a6b..723732f2e7 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -75,6 +75,7 @@ typedef struct syncinfo_s { struct berval si_base; struct berval si_logbase; struct berval si_filterstr; + Filter *si_filter; struct berval si_logfilterstr; struct berval si_contextdn; int si_scope; @@ -2724,7 +2725,7 @@ syncrepl_del_nonpresent( op->ors_tlimit = SLAP_NO_LIMIT; op->ors_limit = NULL; op->ors_attrsonly = 0; - op->ors_filter = str2filter_x( op, si->si_filterstr.bv_val ); + op->ors_filter = filter_dup( si->si_filter, op->o_tmpmemctx ); /* In multimaster, updates can continue to arrive while * we're searching. Limit the search result to entries * older than our newest cookie CSN. @@ -3760,6 +3761,9 @@ syncinfo_free( syncinfo_t *sie, int free_all ) if ( sie->si_filterstr.bv_val ) { ch_free( sie->si_filterstr.bv_val ); } + if ( sie->si_filter ) { + filter_free( sie->si_filter ); + } if ( sie->si_logfilterstr.bv_val ) { ch_free( sie->si_logfilterstr.bv_val ); } @@ -4372,6 +4376,13 @@ parse_syncrepl_line( } } + si->si_filter = str2filter( si->si_filterstr.bv_val ); + if ( si->si_filter == NULL ) { + Debug( LDAP_DEBUG_ANY, "syncrepl %s " SEARCHBASESTR "=\"%s\": unable to parse filter=\"%s\"\n", + si->si_ridtxt, c->be->be_suffix ? c->be->be_suffix[ 0 ].bv_val : "(null)", si->si_filterstr.bv_val ); + return 1; + } + return 0; } -- 2.39.5