]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
Experimental cruft to propagate valid Operation to SASL callbacks.
[openldap] / servers / slapd / result.c
index 8ed77725da147c1253740f326f13b33cd9c72802..ccc1de308336c816201a3ada61da4c65b11bc830 100644 (file)
@@ -165,6 +165,38 @@ static long send_ldap_ber(
        return bytes;
 }
 
+static int
+send_ldap_controls( BerElement *ber, LDAPControl **c )
+{
+       int rc;
+       if( c == NULL ) return 0;
+
+       rc = ber_printf( ber, "t{"/*}*/, LDAP_TAG_CONTROLS );
+       if( rc == -1 ) return rc;
+
+       for( ; *c != NULL; c++) {
+               rc = ber_printf( ber, "{s" /*}*/, (*c)->ldctl_oid );
+
+               if( (*c)->ldctl_iscritical ) {
+                       rc = ber_printf( ber, "b",
+                               (ber_int_t) (*c)->ldctl_iscritical ) ;
+                       if( rc == -1 ) return rc;
+               }
+
+               if( (*c)->ldctl_value.bv_val != NULL ) {
+                       rc = ber_printf( ber, "O", &((*c)->ldctl_value)); 
+                       if( rc == -1 ) return rc;
+               }
+
+               rc = ber_printf( ber, /*{*/"N}" );
+               if( rc == -1 ) return rc;
+       }
+
+       rc = ber_printf( ber, /*{*/"N}" );
+
+       return rc;
+}
+
 static void
 send_ldap_response(
     Connection *conn,
@@ -217,7 +249,6 @@ send_ldap_response(
                        ref[0].bv_val ? ref[0].bv_val : "NULL",
                        NULL, NULL );
 #endif
-
        }
 
 #ifdef LDAP_CONNECTIONLESS
@@ -275,8 +306,17 @@ send_ldap_response(
        }
 
        if( rc != -1 ) {
-               rc = ber_printf( ber, /*"{{"*/ "N}N}" );
+               rc = ber_printf( ber, /*"{"*/ "N}" );
+       }
+
+       if( rc != -1 && ctrls != NULL ) {
+               rc = send_ldap_controls( ber, ctrls );
+       }
+
+       if( rc != -1 ) {
+               rc = ber_printf( ber, /*"{"*/ "N}" );
        }
+
 #ifdef LDAP_CONNECTIONLESS
        if( conn->c_is_udp && op->o_protocol == LDAP_VERSION2 && rc != -1 ) {
                rc = ber_printf( ber, /*"{"*/ "N}" );
@@ -593,7 +633,7 @@ send_search_result(
 
        {
        char nbuf[64];
-       sprintf( nbuf, "%d nentries=%d", err, nentries );
+       snprintf( nbuf, sizeof nbuf, "%d nentries=%d", err, nentries );
 
        Statslog( LDAP_DEBUG_STATS,
            "conn=%lu op=%lu SEARCH RESULT tag=%lu err=%s text=%s\n",
@@ -605,11 +645,6 @@ send_search_result(
        }
 }
 
-static struct berval AllUser = { sizeof(LDAP_ALL_USER_ATTRIBUTES)-1,
-       LDAP_ALL_USER_ATTRIBUTES };
-static struct berval AllOper = { sizeof(LDAP_ALL_OPERATIONAL_ATTRIBUTES)-1,
-       LDAP_ALL_OPERATIONAL_ATTRIBUTES };
-
 int
 send_search_entry(
     Backend    *be,
@@ -637,7 +672,7 @@ send_search_entry(
         *          returned or filtered out
         * e_flags: array of a_flags
         */
-       char *a_flags, **e_flags;
+       char **e_flags = NULL;
 
        if (op->o_callback && op->o_callback->sc_sendentry) {
                return op->o_callback->sc_sendentry( be, conn, op, e, attrs,
@@ -686,7 +721,7 @@ send_search_entry(
                Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 );
 #endif
                ber_free_buf( ber );
-               return;
+               return( 1 );
            }
        }
        if (conn->c_is_udp && op->o_protocol == LDAP_VERSION2) {
@@ -726,27 +761,22 @@ send_search_entry(
         * to particular value of attribute and equals 1 if value matches
         * to ValuesReturnFilter or 0 if not
         */     
-       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next ) i++;
-       e_flags = ch_malloc ( i * sizeof(a_flags) );
-       
-       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-               for ( j = 0; a->a_vals[j].bv_val != NULL; j++ );
-
-               if( j ) {
-                       a_flags = ch_calloc ( j, sizeof(char) );
-                       /* If no ValuesReturnFilter control return everything */
-                       if ( op->vrFilter == NULL ) {
-                               memset(a_flags, 1, j);
-                       }
-               } else {
-                       a_flags = NULL;
+       if ( op->vrFilter != NULL ) {
+               int k = 0;
+               char *a_flags;
+
+               for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
+                       for ( j = 0; a->a_vals[j].bv_val != NULL; j++ ) k++;
+               }
+               e_flags = ch_calloc ( 1, i * sizeof(char *) + k );
+               a_flags = (char *)(e_flags + i);
+               for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
+                       for ( j = 0; a->a_vals[j].bv_val != NULL; j++ );
+                       e_flags[i] = a_flags;
+                       a_flags += j;
                }
-               e_flags[i] = a_flags; 
-       }
 
-       if ( op->vrFilter != NULL ) { 
                rc = filter_matched_values(be, conn, op, e->e_attrs, &e_flags) ; 
-           
                if ( rc == -1 ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( OPERATION, ERR, 
@@ -758,12 +788,6 @@ send_search_entry(
 #endif
                        ber_free( ber, 1 );
 
-                       /* free e_flags */
-                       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
-
                        send_ldap_result( conn, op, LDAP_OTHER,
                                NULL, "matched values filtering error", 
                                NULL, NULL );
@@ -821,11 +845,6 @@ send_search_entry(
 #endif
 
                        ber_free_buf( ber );
-                       /* free e_flags */
-                       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
                        send_ldap_result( conn, op, LDAP_OTHER,
                            NULL, "encoding description error", NULL, NULL );
                        goto error_return;
@@ -851,7 +870,7 @@ send_search_entry(
                                        continue;
                                }
 
-                               if ( e_flags[j][i] == 0 ){
+                               if ( op->vrFilter && e_flags[j][i] == 0 ){
                                        continue;
                                }
 
@@ -866,11 +885,6 @@ send_search_entry(
 #endif
 
                                        ber_free_buf( ber );
-                                       /* free e_flags */
-                                       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-                                               free( e_flags[i] );
-                                       }
-                                       free( e_flags );
                                        send_ldap_result( conn, op, LDAP_OTHER,
                                                NULL, "encoding values error",
                                                NULL, NULL );
@@ -889,11 +903,6 @@ send_search_entry(
 #endif
 
                        ber_free_buf( ber );
-                       /* free e_flags */
-                       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
                        send_ldap_result( conn, op, LDAP_OTHER,
                            NULL, "encode end error", NULL, NULL );
                        goto error_return;
@@ -901,30 +910,29 @@ send_search_entry(
        }
 
        /* free e_flags */
-       for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
-               free( e_flags[i] );
+       if ( e_flags ) {
+               free( e_flags );
+               e_flags = NULL;
        }
-       free( e_flags );
 
        /* eventually will loop through generated operational attributes */
        /* only have subschemaSubentry implemented */
        aa = backend_operational( be, conn, op, e, attrs, opattrs );
 
-       for ( a = aa, i=0; a != NULL; a = a->a_next ) i++;
-       e_flags = ch_malloc ( i * sizeof(a_flags) );
-       
-       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-               for ( j = 0; a->a_vals[j].bv_val != NULL; j++ );
+       if ( aa != NULL && op->vrFilter != NULL ) {
+               int k = 0;
+               char *a_flags;
 
-               a_flags = ch_calloc ( j, sizeof(char) );
-               /* If no ValuesReturnFilter control return everything */
-               if ( op->vrFilter == NULL ){
-                   memset(a_flags, 1, j);
+               for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
+                       for ( j = 0; a->a_vals[j].bv_val != NULL; j++ ) k++;
+               }
+               e_flags = ch_calloc ( 1, i * sizeof(char *) + k );
+               a_flags = (char *)(e_flags + i);
+               for ( a = e->e_attrs, i=0; a != NULL; a = a->a_next, i++ ) {
+                       for ( j = 0; a->a_vals[j].bv_val != NULL; j++ );
+                       e_flags[i] = a_flags;
+                       a_flags += j;
                }
-               e_flags[i] = a_flags; 
-       }
-
-       if ( op->vrFilter != NULL ) {
                rc = filter_matched_values(be, conn, op, aa, &e_flags) ; 
            
                if ( rc == -1 ) {
@@ -939,12 +947,6 @@ send_search_entry(
 #endif
                        ber_free( ber, 1 );
 
-                       /* free e_flags */
-                       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
-
                        send_ldap_result( conn, op, LDAP_OTHER,
                                NULL, "matched values filtering error", 
                                NULL, NULL );
@@ -1007,11 +1009,6 @@ send_search_entry(
                        ber_free_buf( ber );
                        send_ldap_result( conn, op, LDAP_OTHER,
                            NULL, "encoding description error", NULL, NULL );
-                       /* free e_flags */
-                       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
 
                        attrs_free( aa );
                        goto error_return;
@@ -1037,7 +1034,7 @@ send_search_entry(
                                        continue;
                                }
 
-                               if ( e_flags[j][i] == 0 ){
+                               if ( op->vrFilter && e_flags[j][i] == 0 ){
                                        continue;
                                }
 
@@ -1055,11 +1052,6 @@ send_search_entry(
                                        send_ldap_result( conn, op, LDAP_OTHER,
                                                NULL, "encoding values error", 
                                                NULL, NULL );
-                                       /* free e_flags */
-                                       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-                                               free( e_flags[i] );
-                                       }
-                                       free( e_flags );
 
                                        attrs_free( aa );
                                        goto error_return;
@@ -1079,11 +1071,6 @@ send_search_entry(
                        ber_free_buf( ber );
                        send_ldap_result( conn, op, LDAP_OTHER,
                            NULL, "encode end error", NULL, NULL );
-                       /* free e_flags */
-                       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-                               free( e_flags[i] );
-                       }
-                       free( e_flags );
 
                        attrs_free( aa );
                        goto error_return;
@@ -1091,13 +1078,21 @@ send_search_entry(
        }
 
        /* free e_flags */
-       for ( a = aa, i=0; a != NULL; a = a->a_next, i++ ) {
-               free( e_flags[i] );
+       if ( e_flags ) {
+               free( e_flags );
+               e_flags = NULL;
        }
-       free( e_flags );
 
        attrs_free( aa );
-       rc = ber_printf( ber, /*{{{*/ "}N}N}" );
+       rc = ber_printf( ber, /*{{*/ "}N}" );
+
+       if( rc != -1 && ctrls != NULL ) {
+               rc = send_ldap_controls( ber, ctrls );
+       }
+
+       if( rc != -1 ) {
+               rc = ber_printf( ber, /*{*/ "N}" );
+       }
 
 #ifdef LDAP_CONNECTIONLESS
        if (conn->c_is_udp && op->o_protocol == LDAP_VERSION2 && rc != -1)
@@ -1154,6 +1149,7 @@ send_search_entry(
        rc = 0;
 
 error_return:;
+       if ( e_flags ) free( e_flags );
        return( rc );
 }
 
@@ -1244,9 +1240,18 @@ send_search_reference(
 
        ber_init_w_nullc( ber, LBER_USE_DER );
 
-       rc = ber_printf( ber, "{it{W}N}", op->o_msgid,
+       rc = ber_printf( ber, "{it{W}" /*"}"*/ , op->o_msgid,
                LDAP_RES_SEARCH_REFERENCE, refs );
 
+       if( rc != -1 && ctrls != NULL ) {
+               rc = send_ldap_controls( ber, ctrls );
+       }
+
+       if( rc != -1 ) {
+               rc = ber_printf( ber, /*"{"*/ "N}", op->o_msgid,
+                       LDAP_RES_SEARCH_REFERENCE, refs );
+       }
+
        if ( rc == -1 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, ERR,