27
28
/* define to get an error if requesting limit higher than hard */
28
29
#undef ABOVE_HARD_LIMIT_IS_ERROR
31
static const struct berval lmpats[] = {
34
BER_BVC( "onelevel" ),
36
BER_BVC( "children" ),
38
BER_BVC( "anonymous" ),
44
static const char *const dn_source[2] = { "DN", "DN.THIS" };
45
static const char *const lmpats_out[] = {
31
58
limits2str( unsigned i )
34
case SLAP_LIMITS_UNDEFINED:
37
case SLAP_LIMITS_EXACT:
43
case SLAP_LIMITS_SUBTREE:
46
case SLAP_LIMITS_CHILDREN:
49
case SLAP_LIMITS_REGEX:
52
case SLAP_LIMITS_ANONYMOUS:
55
case SLAP_LIMITS_USERS:
60
return i < (sizeof( lmpats_out ) / sizeof( lmpats_out[0] ))
61
? lmpats_out[i] : "UNKNOWN";
63
#endif /* LDAP_DEBUG */
70
68
struct slap_limits_set **limit
71
static struct berval empty_dn = BER_BVC( "" );
73
72
struct slap_limits **lm;
73
struct berval *ndns[2];
75
75
assert( op != NULL );
76
76
assert( limit != NULL );
78
Debug( LDAP_DEBUG_TRACE, "==> limits_get: %s dn=\"%s\"\n",
79
ndns[1] = &op->o_req_ndn;
81
Debug( LDAP_DEBUG_TRACE, "==> limits_get: %s self=\"%s\" this=\"%s\"\n",
80
BER_BVISNULL( ndn ) ? "[anonymous]" : ndn->bv_val, 0 );
83
BER_BVISNULL( ndns[0] ) ? "[anonymous]" : ndns[0]->bv_val,
84
BER_BVISNULL( ndns[1] ) ? "" : ndns[1]->bv_val );
90
94
for ( lm = op->o_bd->be_limits; lm[0] != NULL; lm++ ) {
91
95
unsigned style = lm[0]->lm_flags & SLAP_LIMITS_MASK;
92
96
unsigned type = lm[0]->lm_flags & SLAP_LIMITS_TYPE_MASK;
97
unsigned isthis = type == SLAP_LIMITS_TYPE_THIS;
98
struct berval *ndn = ndns[isthis];
100
if ( style == SLAP_LIMITS_ANY )
103
if ( BER_BVISEMPTY( ndn ) ) {
104
if ( style == SLAP_LIMITS_ANONYMOUS )
94
111
switch ( style ) {
95
112
case SLAP_LIMITS_EXACT:
96
if ( BER_BVISEMPTY( ndn ) ) {
100
113
if ( type == SLAP_LIMITS_TYPE_GROUP ) {
103
rc = backend_group( op, NULL,
114
int rc = backend_group( op, NULL,
104
115
&lm[0]->lm_pat, ndn,
105
116
lm[0]->lm_group_oc,
106
117
lm[0]->lm_group_ad );
108
*limit = &lm[0]->lm_limits;
109
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=GROUP match=EXACT "
110
"dn=\"%s\" oc=\"%s\" ad=\"%s\"\n",
111
lm[0]->lm_pat.bv_val,
112
lm[0]->lm_group_oc->soc_cname.bv_val,
113
lm[0]->lm_group_ad->ad_cname.bv_val );
119
122
if ( dn_match( &lm[0]->lm_pat, ndn ) ) {
120
*limit = &lm[0]->lm_limits;
121
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=DN match=EXACT dn=\"%s\"\n",
122
lm[0]->lm_pat.bv_val, 0, 0 );
155
/* in case of (sub)match ... */
156
if ( lm[0]->lm_pat.bv_len == ( ndn->bv_len - d )
157
&& strcmp( lm[0]->lm_pat.bv_val,
158
&ndn->bv_val[d] ) == 0 )
160
/* check for exactly one rdn in case of ONE */
161
if ( style == SLAP_LIMITS_ONE ) {
163
* if ndn is more that one rdn
164
* below dn_pat, continue
166
if ( (size_t) dn_rdnlen( NULL, ndn )
151
/* check that ndn ends with lm_pat */
152
if ( strcmp( lm[0]->lm_pat.bv_val, &ndn->bv_val[d] ) != 0 ) {
156
/* in case of ONE, require exactly one rdn below lm_pat */
157
if ( style == SLAP_LIMITS_ONE ) {
158
if ( dn_rdnlen( NULL, ndn ) != d - 1 ) {
173
*limit = &lm[0]->lm_limits;
174
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=DN match=%s dn=\"%s\"\n",
175
limits2str( style ), lm[0]->lm_pat.bv_val, 0 );
182
166
case SLAP_LIMITS_REGEX:
183
if ( BER_BVISEMPTY( ndn ) ) {
186
if ( regexec( &lm[0]->lm_regex, ndn->bv_val,
189
*limit = &lm[0]->lm_limits;
190
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=DN match=%s dn=\"%s\"\n",
191
limits2str( style ), lm[0]->lm_pat.bv_val, 0 );
167
if ( regexec( &lm[0]->lm_regex, ndn->bv_val, 0, NULL, 0 ) == 0 ) {
196
172
case SLAP_LIMITS_ANONYMOUS:
197
if ( BER_BVISEMPTY( ndn ) ) {
198
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=DN match=%s\n",
199
limits2str( style ), 0, 0 );
200
*limit = &lm[0]->lm_limits;
205
175
case SLAP_LIMITS_USERS:
206
if ( !BER_BVISEMPTY( ndn ) ) {
207
*limit = &lm[0]->lm_limits;
208
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=DN match=%s\n",
209
limits2str( style ), 0, 0 );
214
case SLAP_LIMITS_ANY:
177
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=%s match=%s\n",
178
dn_source[isthis], limits2str( style ), 0 );
180
*limit = &lm[0]->lm_limits;
184
Debug( LDAP_DEBUG_TRACE,
185
"<== limits_get: type=%s match=%s dn=\"%s\"\n",
186
dn_source[isthis], limits2str( style ), lm[0]->lm_pat.bv_val );
187
*limit = &lm[0]->lm_limits;
191
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=GROUP match=EXACT "
192
"dn=\"%s\" oc=\"%s\" ad=\"%s\"\n",
193
lm[0]->lm_pat.bv_val,
194
lm[0]->lm_group_oc->soc_cname.bv_val,
195
lm[0]->lm_group_ad->ad_cname.bv_val );
215
196
*limit = &lm[0]->lm_limits;
394
378
} else if ( strcasecmp( pattern, "users" ) == 0 ) {
395
379
flags = SLAP_LIMITS_USERS;
397
} else if ( strncasecmp( pattern, "dn", STRLENOF( "dn" ) ) == 0 ) {
381
} else if ( STRSTART( pattern, "dn" ) ) {
398
382
pattern += STRLENOF( "dn" );
399
if ( pattern[0] == '.' ) {
401
if ( strncasecmp( pattern, "exact", STRLENOF( "exact" )) == 0 ) {
402
flags = SLAP_LIMITS_EXACT;
383
flags = SLAP_LIMITS_TYPE_SELF;
384
if ( pattern[0] == '.' ) {
386
if ( STRSTART( pattern, "this" ) ) {
387
flags = SLAP_LIMITS_TYPE_THIS;
388
pattern += STRLENOF( "this" );
389
} else if ( STRSTART( pattern, "self" ) ) {
390
pattern += STRLENOF( "self" );
395
if ( pattern[0] == '.' ) {
398
if ( STRSTART( pattern, "exact" ) ) {
399
flags |= SLAP_LIMITS_EXACT;
403
400
pattern += STRLENOF( "exact" );
405
} else if ( strncasecmp( pattern, "base", STRLENOF( "base" ) ) == 0 ) {
406
flags = SLAP_LIMITS_BASE;
402
} else if ( STRSTART( pattern, "base" ) ) {
403
flags |= SLAP_LIMITS_BASE;
407
404
pattern += STRLENOF( "base" );
409
} else if ( strncasecmp( pattern, "one", STRLENOF( "one" ) ) == 0 ) {
410
flags = SLAP_LIMITS_ONE;
406
} else if ( STRSTART( pattern, "one" ) ) {
407
flags |= SLAP_LIMITS_ONE;
411
408
pattern += STRLENOF( "one" );
412
if ( strncasecmp( pattern, "level", STRLENOF( "level" ) ) == 0 ) {
409
if ( STRSTART( pattern, "level" ) ) {
413
410
pattern += STRLENOF( "level" );
432
429
"use \"subtree\" instead.\n", fname, lineno, 0 );
435
} else if ( strncasecmp( pattern, "children", STRLENOF( "children" ) ) == 0 ) {
436
flags = SLAP_LIMITS_CHILDREN;
432
} else if ( STRSTART( pattern, "children" ) ) {
433
flags |= SLAP_LIMITS_CHILDREN;
437
434
pattern += STRLENOF( "children" );
439
} else if ( strncasecmp( pattern, "regex", STRLENOF( "regex" ) ) == 0 ) {
440
flags = SLAP_LIMITS_REGEX;
436
} else if ( STRSTART( pattern, "regex" ) ) {
437
flags |= SLAP_LIMITS_REGEX;
441
438
pattern += STRLENOF( "regex" );
444
441
* this could be deprecated in favour
445
442
* of the pattern = "anonymous" form
447
} else if ( strncasecmp( pattern, "anonymous", STRLENOF( "anonymous" ) ) == 0 ) {
444
} else if ( STRSTART( pattern, "anonymous" )
445
&& flags == SLAP_LIMITS_TYPE_SELF )
448
447
flags = SLAP_LIMITS_ANONYMOUS;
451
/* force error below */
452
if ( *pattern == '=' )
453
457
/* pre-check the data */
455
case SLAP_LIMITS_ANONYMOUS:
456
case SLAP_LIMITS_USERS:
458
/* no need for pattern */
458
if ( pattern != NULL ) {
463
459
if ( pattern[0] != '=' ) {
464
460
Debug( LDAP_DEBUG_ANY,
465
"%s : line %d: missing '=' in "
466
"\"dn[.{exact|base|onelevel|subtree"
467
"|children|regex|anonymous}]"
469
"\"limits <pattern> <limits>\" "
461
"%s : line %d: %s in "
462
"\"dn[.{this|self}][.{exact|base"
463
"|onelevel|subtree|children|regex"
464
"|anonymous}]=<pattern>\" in "
465
"\"limits <pattern> <limits>\" line.\n",
467
isalnum( (unsigned char)pattern[0] )
468
? "unknown DN modifier" : "missing '='" );
862
static const char *lmpats[] = {
874
#define WHATSLEFT ( buflen - ( ptr - bv->bv_val ) )
877
/* Helper macros for limits_unparse() and limits_unparse_one():
878
* Write to ptr, but not past bufEnd. Move ptr past the new text.
879
* Return (success && enough room ? 0 : -1).
881
#define ptr_APPEND_BV(bv) /* Append a \0-terminated berval */ \
882
(WHATSLEFT <= (bv).bv_len ? -1 : \
883
((void) (ptr = lutil_strcopy( ptr, (bv).bv_val )), 0))
884
#define ptr_APPEND_LIT(str) /* Append a string literal */ \
885
(WHATSLEFT <= STRLENOF( "" str "" ) ? -1 : \
886
((void) (ptr = lutil_strcopy( ptr, str )), 0))
887
#define ptr_APPEND_FMT(args) /* Append formatted text */ \
888
(WHATSLEFT <= (tmpLen = snprintf args) ? -1 : ((void) (ptr += tmpLen), 0))
889
#define ptr_APPEND_FMT1(fmt, arg) ptr_APPEND_FMT(( ptr, WHATSLEFT, fmt, arg ))
890
#define WHATSLEFT ((ber_len_t) (bufEnd - ptr))
876
892
/* Caller must provide an adequately sized buffer in bv */
878
894
limits_unparse( struct slap_limits *lim, struct berval *bv, ber_len_t buflen )
880
896
struct berval btmp;
897
char *ptr, *bufEnd; /* Updated/used by ptr_APPEND_*()/WHATSLEFT */
898
ber_len_t tmpLen; /* Used by ptr_APPEND_FMT*() */
899
unsigned type, style;
884
902
if ( !bv || !bv->bv_val ) return -1;
886
904
ptr = bv->bv_val;
888
if (( lim->lm_flags & SLAP_LIMITS_TYPE_MASK ) == SLAP_LIMITS_TYPE_GROUP ) {
889
if ( WHATSLEFT <= STRLENOF( "group/" "/" "=\"" "\"" )
890
+ lim->lm_group_oc->soc_cname.bv_len
891
+ lim->lm_group_ad->ad_cname.bv_len
892
+ lim->lm_pat.bv_len ) return -1;
894
ptr = lutil_strcopy( ptr, "group/" );
895
ptr = lutil_strcopy( ptr, lim->lm_group_oc->soc_cname.bv_val );
897
ptr = lutil_strcopy( ptr, lim->lm_group_ad->ad_cname.bv_val );
898
ptr = lutil_strcopy( ptr, "=\"" );
899
ptr = lutil_strcopy( ptr, lim->lm_pat.bv_val );
905
bufEnd = ptr + buflen;
906
type = lim->lm_flags & SLAP_LIMITS_TYPE_MASK;
908
if ( type == SLAP_LIMITS_TYPE_GROUP ) {
909
rc = ptr_APPEND_FMT(( ptr, WHATSLEFT, "group/%s/%s=\"%s\"",
910
lim->lm_group_oc->soc_cname.bv_val,
911
lim->lm_group_ad->ad_cname.bv_val,
912
lim->lm_pat.bv_val ));
902
lm = lim->lm_flags & SLAP_LIMITS_MASK;
914
style = lim->lm_flags & SLAP_LIMITS_MASK;
904
916
case SLAP_LIMITS_ANONYMOUS:
905
917
case SLAP_LIMITS_USERS:
906
918
case SLAP_LIMITS_ANY:
907
if ( WHATSLEFT <= strlen( lmpats[lm] ) ) return -1;
908
ptr = lutil_strcopy( ptr, lmpats[lm] );
919
rc = ptr_APPEND_BV( lmpats[style] );
910
921
case SLAP_LIMITS_UNDEFINED:
911
922
case SLAP_LIMITS_EXACT:
913
924
case SLAP_LIMITS_SUBTREE:
914
925
case SLAP_LIMITS_CHILDREN:
915
926
case SLAP_LIMITS_REGEX:
916
if ( WHATSLEFT <= STRLENOF( "dn." "=" "\"" "\"" )
917
+ strlen( lmpats[lm] ) + lim->lm_pat.bv_len ) return -1;
918
ptr = lutil_strcopy( ptr, "dn." );
919
ptr = lutil_strcopy( ptr, lmpats[lm] );
922
ptr = lutil_strcopy( ptr, lim->lm_pat.bv_val );
927
rc = ptr_APPEND_FMT(( ptr, WHATSLEFT, "dn.%s%s=\"%s\"",
928
type == SLAP_LIMITS_TYPE_SELF ? "" : "this.",
929
lmpats[style].bv_val, lim->lm_pat.bv_val ));
927
bv->bv_len = ptr - bv->bv_val;
930
if ( limits_unparse_one( &lim->lm_limits,
931
SLAP_LIMIT_SIZE|SLAP_LIMIT_TIME,
934
bv->bv_len = ptr - bv->bv_val;
937
rc = limits_unparse_one( &lim->lm_limits,
938
SLAP_LIMIT_SIZE | SLAP_LIMIT_TIME,
941
bv->bv_len += btmp.bv_len;
936
bv->bv_len += btmp.bv_len;
940
946
/* Caller must provide an adequately sized buffer in bv */
942
limits_unparse_one( struct slap_limits_set *lim, int which, struct berval *bv, ber_len_t buflen )
949
struct slap_limits_set *lim,
954
char *ptr, *bufEnd; /* Updated/used by ptr_APPEND_*()/WHATSLEFT */
955
ber_len_t tmpLen; /* Used by ptr_APPEND_FMT*() */
946
957
if ( !bv || !bv->bv_val ) return -1;
948
959
ptr = bv->bv_val;
960
bufEnd = ptr + buflen;
950
962
if ( which & SLAP_LIMIT_SIZE ) {
951
963
if ( lim->lms_s_soft != SLAPD_DEFAULT_SIZELIMIT ) {
958
970
/* If there's also a hard limit, fully qualify this one */
959
971
} else if ( lim->lms_s_hard ) {
960
if ( WHATSLEFT <= STRLENOF( " size.soft=" ) ) return -1;
961
ptr = lutil_strcopy( ptr, " size.soft=" );
972
if ( ptr_APPEND_LIT( " size.soft=" ) ) return -1;
963
974
/* If doing both size & time, qualify this */
964
975
} else if ( which & SLAP_LIMIT_TIME ) {
965
if ( WHATSLEFT <= STRLENOF( " size=" ) ) return -1;
966
ptr = lutil_strcopy( ptr, " size=" );
976
if ( ptr_APPEND_LIT( " size=" ) ) return -1;
969
if ( lim->lms_s_soft == -1 ) {
970
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
971
ptr = lutil_strcopy( ptr, "unlimited" );
973
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_s_soft );
974
if ( WHATSLEFT < 0 ) return -1;
979
if ( lim->lms_s_soft == -1
980
? ptr_APPEND_LIT( "unlimited " )
981
: ptr_APPEND_FMT1( "%d ", lim->lms_s_soft ) )
979
985
if ( lim->lms_s_hard ) {
980
if ( WHATSLEFT <= STRLENOF( " size.hard=" ) ) return -1;
981
ptr = lutil_strcopy( ptr, " size.hard=" );
982
if ( lim->lms_s_hard == -1 ) {
983
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
984
ptr = lutil_strcopy( ptr, "unlimited" );
986
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_s_hard );
987
if ( WHATSLEFT < 0 ) return -1;
986
if ( ptr_APPEND_LIT( " size.hard=" ) ) return -1;
987
if ( lim->lms_s_hard == -1
988
? ptr_APPEND_LIT( "unlimited " )
989
: ptr_APPEND_FMT1( "%d ", lim->lms_s_hard ) )
991
992
if ( lim->lms_s_unchecked != -1 ) {
992
if ( WHATSLEFT <= STRLENOF( " size.unchecked=" ) ) return -1;
993
ptr = lutil_strcopy( ptr, " size.unchecked=" );
994
if ( lim->lms_s_unchecked == 0 ) {
995
if ( WHATSLEFT <= STRLENOF( "disabled" ) ) return -1;
996
ptr = lutil_strcopy( ptr, "disabled" );
998
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_s_unchecked );
999
if ( WHATSLEFT < 0 ) return -1;
993
if ( ptr_APPEND_LIT( " size.unchecked=" ) ) return -1;
994
if ( lim->lms_s_unchecked == 0
995
? ptr_APPEND_LIT( "disabled " )
996
: ptr_APPEND_FMT1( "%d ", lim->lms_s_unchecked ) )
1003
999
if ( lim->lms_s_pr_hide ) {
1004
if ( WHATSLEFT <= STRLENOF( " size.pr=noEstimate " ) ) return -1;
1005
ptr = lutil_strcopy( ptr, " size.pr=noEstimate " );
1000
if ( ptr_APPEND_LIT( " size.pr=noEstimate " ) ) return -1;
1007
1002
if ( lim->lms_s_pr ) {
1008
if ( WHATSLEFT <= STRLENOF( " size.pr=" ) ) return -1;
1009
ptr = lutil_strcopy( ptr, " size.pr=" );
1010
if ( lim->lms_s_pr == -1 ) {
1011
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
1012
ptr = lutil_strcopy( ptr, "unlimited" );
1014
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_s_pr );
1015
if ( WHATSLEFT < 0 ) return -1;
1003
if ( ptr_APPEND_LIT( " size.pr=" ) ) return -1;
1004
if ( lim->lms_s_pr == -1
1005
? ptr_APPEND_LIT( "unlimited " )
1006
: ptr_APPEND_FMT1( "%d ", lim->lms_s_pr ) )
1019
1009
if ( lim->lms_s_pr_total ) {
1020
if ( WHATSLEFT <= STRLENOF( " size.prtotal=" ) ) return -1;
1021
ptr = lutil_strcopy( ptr, " size.prtotal=" );
1022
if ( lim->lms_s_pr_total == -1 ) {
1023
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
1024
ptr = lutil_strcopy( ptr, "unlimited" );
1025
} else if ( lim->lms_s_pr_total == -2 ) {
1026
if ( WHATSLEFT <= STRLENOF( "disabled" ) ) return -1;
1027
ptr = lutil_strcopy( ptr, "disabled" );
1029
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_s_pr_total );
1030
if ( WHATSLEFT < 0 ) return -1;
1010
if ( ptr_APPEND_LIT( " size.prtotal=" ) ) return -1;
1011
if ( lim->lms_s_pr_total == -1 ? ptr_APPEND_LIT( "unlimited " )
1012
: lim->lms_s_pr_total == -2 ? ptr_APPEND_LIT( "disabled " )
1013
: ptr_APPEND_FMT1( "%d ", lim->lms_s_pr_total ) )
1045
1027
/* If there's also a hard limit, fully qualify this one */
1046
1028
} else if ( lim->lms_t_hard ) {
1047
if ( WHATSLEFT <= STRLENOF( " time.soft=" ) ) return -1;
1048
ptr = lutil_strcopy( ptr, " time.soft=" );
1029
if ( ptr_APPEND_LIT( " time.soft=" ) ) return -1;
1050
1031
/* If doing both size & time, qualify this */
1051
1032
} else if ( which & SLAP_LIMIT_SIZE ) {
1052
if ( WHATSLEFT <= STRLENOF( " time=" ) ) return -1;
1053
ptr = lutil_strcopy( ptr, " time=" );
1033
if ( ptr_APPEND_LIT( " time=" ) ) return -1;
1056
if ( lim->lms_t_soft == -1 ) {
1057
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
1058
ptr = lutil_strcopy( ptr, "unlimited" );
1060
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_t_soft );
1061
if ( WHATSLEFT < 0 ) return -1;
1036
if ( lim->lms_t_soft == -1
1037
? ptr_APPEND_LIT( "unlimited " )
1038
: ptr_APPEND_FMT1( "%d ", lim->lms_t_soft ) )
1066
1042
if ( lim->lms_t_hard ) {
1067
if ( WHATSLEFT <= STRLENOF( " time.hard=" ) ) return -1;
1068
ptr = lutil_strcopy( ptr, " time.hard=" );
1069
if ( lim->lms_t_hard == -1 ) {
1070
if ( WHATSLEFT <= STRLENOF( "unlimited" ) ) return -1;
1071
ptr = lutil_strcopy( ptr, "unlimited" );
1073
ptr += snprintf( ptr, WHATSLEFT, "%d", lim->lms_t_hard );
1074
if ( WHATSLEFT < 0 ) return -1;
1043
if ( ptr_APPEND_LIT( " time.hard=" ) ) return -1;
1044
if ( lim->lms_t_hard == -1
1045
? ptr_APPEND_LIT( "unlimited " )
1046
: ptr_APPEND_FMT1( "%d ", lim->lms_t_hard ) )
1079
1050
if ( ptr != bv->bv_val ) {
1239
/* first round of pagedResults: set count to any appropriate limit */
1213
/* first round of pagedResults:
1214
* set count to any appropriate limit */
1241
/* if the limit is set, check that it does not violate any server-side limit */
1216
/* if the limit is set, check that it does
1217
* not violate any server-side limit */
1242
1218
#ifdef ABOVE_HARD_LIMIT_IS_ERROR
1243
if ( op->ors_slimit == SLAP_MAX_LIMIT ) {
1244
slimit2 = op->ors_slimit = pr_total;
1219
if ( op->ors_slimit == SLAP_MAX_LIMIT )
1245
1220
#else /* ! ABOVE_HARD_LIMIT_IS_ERROR */
1246
if ( op->ors_slimit == SLAP_MAX_LIMIT || op->ors_slimit > pr_total ) {
1247
slimit2 = op->ors_slimit = pr_total;
1221
if ( op->ors_slimit == SLAP_MAX_LIMIT
1222
|| op->ors_slimit > pr_total )
1248
1223
#endif /* ! ABOVE_HARD_LIMIT_IS_ERROR */
1225
slimit2 = op->ors_slimit = pr_total;
1250
1227
} else if ( op->ors_slimit == 0 ) {
1251
1228
slimit2 = pr_total;