]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/sets.c
don't return entry if requested attr is not present (ITS#5650)
[openldap] / servers / slapd / sets.c
index 7f3f8ceba89eb216a6cc3909fde204d2ad0fb8a8..52f23306eff96c8852a1c72b388b59875410b1b3 100644 (file)
@@ -200,6 +200,7 @@ slap_set_join(
                                                        cp->set_op->o_tmpfree( rset[ i ].bv_val, cp->set_op->o_tmpmemctx );
                                                        rset[ i ] = rset[ --rlast ];
                                                        BER_BVZERO( &rset[ rlast ] );
+                                                       i--;
                                                }
                                                exists = 1;
                                                break;
@@ -709,23 +710,23 @@ slap_set_filter( SLAP_SET_GATHER gatherer,
                        break;
 
                default:
-                       if ( ( c != '_' )
-                                       && ( c < 'A' || c > 'Z' )
-                                       && ( c < 'a' || c > 'z' ) )
-                       {
+                       if ( !AD_LEADCHAR( c ) ) {
                                SF_ERROR( syntax );
                        }
                        filter--;
                        for ( len = 1;
-                                       ( c = filter[ len ] )
-                                               && ( ( c >= '0' && c <= '9' )
-                                                       || ( c >= 'A' && c <= 'Z' )
-                                                       || ( c >= 'a' && c <= 'z' ) );
-                                       len++ )
-                               /* count */ ;
+                               ( c = filter[ len ] ) && AD_CHAR( c );
+                               len++ )
+                       {
+                               /* count */
+                               if ( c == '-' && !AD_CHAR( filter[ len + 1 ] ) ) {
+                                       break;
+                               }
+                       }
                        if ( len == 4
                                && memcmp( "this", filter, len ) == 0 )
                        {
+                               assert( !BER_BVISNULL( target ) );
                                if ( ( SF_TOP() == (void *)'/' ) || IS_SET( SF_TOP() ) ) {
                                        SF_ERROR( syntax );
                                }
@@ -746,15 +747,15 @@ slap_set_filter( SLAP_SET_GATHER gatherer,
                                if ( ( SF_TOP() == (void *)'/' ) || IS_SET( SF_TOP() ) ) {
                                        SF_ERROR( syntax );
                                }
+                               if ( BER_BVISNULL( user ) ) {
+                                       SF_ERROR( memory );
+                               }
                                set = cp->set_op->o_tmpcalloc( 2, sizeof( struct berval ),
                                                cp->set_op->o_tmpmemctx );
                                if ( set == NULL ) {
                                        SF_ERROR( memory );
                                }
                                ber_dupbv_x( set, user, cp->set_op->o_tmpmemctx );
-                               if ( BER_BVISNULL( set ) ) {
-                                       SF_ERROR( memory );
-                               }
                                BER_BVZERO( &set[ 1 ] );
                                
                        } else if ( SF_TOP() != (void *)'/' ) {