View | Details | Raw Unified | Return to bug 51183
Collapse All | Expand All

(-)a/servers/slapd/filter.c (-10 / +32 lines)
 Lines 37-47    Link Here 
37
const Filter *slap_filter_objectClass_pres;
37
const Filter *slap_filter_objectClass_pres;
38
const struct berval *slap_filterstr_objectClass_pres;
38
const struct berval *slap_filterstr_objectClass_pres;
39
39
40
#ifndef SLAPD_MAX_FILTER_DEPTH
41
#define SLAPD_MAX_FILTER_DEPTH	5000
42
#endif
43
40
static int	get_filter_list(
44
static int	get_filter_list(
41
	Operation *op,
45
	Operation *op,
42
	BerElement *ber,
46
	BerElement *ber,
43
	Filter **f,
47
	Filter **f,
44
	const char **text );
48
	const char **text,
49
	int depth );
45
50
46
static int	get_ssa(
51
static int	get_ssa(
47
	Operation *op,
52
	Operation *op,
 Lines 80-91   filter_destroy( void ) Link Here 
80
	return;
85
	return;
81
}
86
}
82
87
83
int
88
static int
84
get_filter(
89
get_filter0(
85
	Operation *op,
90
	Operation *op,
86
	BerElement *ber,
91
	BerElement *ber,
87
	Filter **filt,
92
	Filter **filt,
88
	const char **text )
93
	const char **text,
94
	int depth )
89
{
95
{
90
	ber_tag_t	tag;
96
	ber_tag_t	tag;
91
	ber_len_t	len;
97
	ber_len_t	len;
 Lines 126-131   get_filter( Link Here 
126
	 *
132
	 *
127
	 */
133
	 */
128
134
135
	if( depth > SLAPD_MAX_FILTER_DEPTH ) {
136
		*text = "filter nested too deeply";
137
		return SLAPD_DISCONNECT;
138
	}
139
129
	tag = ber_peek_tag( ber, &len );
140
	tag = ber_peek_tag( ber, &len );
130
141
131
	if( tag == LBER_ERROR ) {
142
	if( tag == LBER_ERROR ) {
 Lines 221-227   get_filter( Link Here 
221
232
222
	case LDAP_FILTER_AND:
233
	case LDAP_FILTER_AND:
223
		Debug( LDAP_DEBUG_FILTER, "AND\n", 0, 0, 0 );
234
		Debug( LDAP_DEBUG_FILTER, "AND\n", 0, 0, 0 );
224
		err = get_filter_list( op, ber, &f.f_and, text );
235
		err = get_filter_list( op, ber, &f.f_and, text, depth+1 );
225
		if ( err != LDAP_SUCCESS ) {
236
		if ( err != LDAP_SUCCESS ) {
226
			break;
237
			break;
227
		}
238
		}
 Lines 234-240   get_filter( Link Here 
234
245
235
	case LDAP_FILTER_OR:
246
	case LDAP_FILTER_OR:
236
		Debug( LDAP_DEBUG_FILTER, "OR\n", 0, 0, 0 );
247
		Debug( LDAP_DEBUG_FILTER, "OR\n", 0, 0, 0 );
237
		err = get_filter_list( op, ber, &f.f_or, text );
248
		err = get_filter_list( op, ber, &f.f_or, text, depth+1 );
238
		if ( err != LDAP_SUCCESS ) {
249
		if ( err != LDAP_SUCCESS ) {
239
			break;
250
			break;
240
		}
251
		}
 Lines 248-254   get_filter( Link Here 
248
	case LDAP_FILTER_NOT:
259
	case LDAP_FILTER_NOT:
249
		Debug( LDAP_DEBUG_FILTER, "NOT\n", 0, 0, 0 );
260
		Debug( LDAP_DEBUG_FILTER, "NOT\n", 0, 0, 0 );
250
		(void) ber_skip_tag( ber, &len );
261
		(void) ber_skip_tag( ber, &len );
251
		err = get_filter( op, ber, &f.f_not, text );
262
		err = get_filter0( op, ber, &f.f_not, text, depth+1 );
252
		if ( err != LDAP_SUCCESS ) {
263
		if ( err != LDAP_SUCCESS ) {
253
			break;
264
			break;
254
		}
265
		}
 Lines 311-320   get_filter( Link Here 
311
	return( err );
322
	return( err );
312
}
323
}
313
324
325
int
326
get_filter(
327
	Operation *op,
328
	BerElement *ber,
329
	Filter **filt,
330
	const char **text )
331
{
332
	return get_filter0( op, ber, filt, text, 0 );
333
}
334
335
314
static int
336
static int
315
get_filter_list( Operation *op, BerElement *ber,
337
get_filter_list( Operation *op, BerElement *ber,
316
	Filter **f,
338
	Filter **f,
317
	const char **text )
339
	const char **text,
340
	int depth )
318
{
341
{
319
	Filter		**new;
342
	Filter		**new;
320
	int		err;
343
	int		err;
 Lines 328-334   get_filter_list( Operation *op, BerElement *ber, Link Here 
328
		tag != LBER_DEFAULT;
351
		tag != LBER_DEFAULT;
329
		tag = ber_next_element( ber, &len, last ) )
352
		tag = ber_next_element( ber, &len, last ) )
330
	{
353
	{
331
		err = get_filter( op, ber, new, text );
354
		err = get_filter0( op, ber, new, text, depth );
332
		if ( err != LDAP_SUCCESS )
355
		if ( err != LDAP_SUCCESS )
333
			return( err );
356
			return( err );
334
		new = &(*new)->f_next;
357
		new = &(*new)->f_next;
335
- 

Return to bug 51183