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,
ref[0].bv_val ? ref[0].bv_val : "NULL",
NULL, NULL );
#endif
-
}
#ifdef LDAP_CONNECTIONLESS
}
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}" );
{
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",
}
}
-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,
* 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,
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) {
* 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,
#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 );
#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;
continue;
}
- if ( e_flags[j][i] == 0 ){
+ if ( op->vrFilter && e_flags[j][i] == 0 ){
continue;
}
#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 );
#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;
}
/* 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 ) {
#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 );
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;
continue;
}
- if ( e_flags[j][i] == 0 ){
+ if ( op->vrFilter && e_flags[j][i] == 0 ){
continue;
}
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;
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;
}
/* 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)
rc = 0;
error_return:;
+ if ( e_flags ) free( e_flags );
return( rc );
}
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,