Define SLAP_STRTOL macro for integerBitAndMatch() and integerBitOrMatch()

usage - necessary to use larger types for interop with a certain client
that would expect the assertion (attr:1.2.840.113556.1.4.803:=2147483648)
to match a signed value (eg. -2147483646).

There are probably better / more portable solutions; review appreciated.
This commit is contained in:
Luke Howard 2003-09-21 06:26:43 +00:00
parent 0143bfaaee
commit 3846a8881a

View File

@ -1787,6 +1787,22 @@ numericStringNormalize(
return LDAP_SUCCESS;
}
/*
* Integer conversion macros that will use the largest available
* type.
*/
#if defined(HAVE_STRTOLL) && defined(LLONG_MAX) && defined(LLONG_MIN)
# define SLAP_STRTOL(n,e,b) strtoll(n,e,b)
# define SLAP_LONG_MAX LLONG_MAX
# define SLAP_LONG_MIN LLONG_MIN
# define SLAP_LONG long long
#else
# define SLAP_STRTOL(n,e,b) strtol(n,e,b)
# define SLAP_LONG_MAX LONG_MAX
# define SLAP_LONG_MIN LONG_MIN
# define SLAP_LONG long
#endif /* HAVE_STRTOLL ... */
static int
integerBitAndMatch(
int *matchp,
@ -1796,16 +1812,16 @@ integerBitAndMatch(
struct berval *value,
void *assertedValue )
{
long lValue, lAssertedValue;
SLAP_LONG lValue, lAssertedValue;
/* safe to assume integers are NUL terminated? */
lValue = strtol(value->bv_val, NULL, 10);
if(( lValue == LONG_MIN || lValue == LONG_MAX) && errno == ERANGE ) {
lValue = SLAP_STRTOL(value->bv_val, NULL, 10);
if(( lValue == SLAP_LONG_MIN || lValue == SLAP_LONG_MAX) && errno == ERANGE ) {
return LDAP_CONSTRAINT_VIOLATION;
}
lAssertedValue = strtol(((struct berval *)assertedValue)->bv_val, NULL, 10);
if(( lAssertedValue == LONG_MIN || lAssertedValue == LONG_MAX)
lAssertedValue = SLAP_STRTOL(((struct berval *)assertedValue)->bv_val, NULL, 10);
if(( lAssertedValue == SLAP_LONG_MIN || lAssertedValue == SLAP_LONG_MAX )
&& errno == ERANGE )
{
return LDAP_CONSTRAINT_VIOLATION;
@ -1824,16 +1840,16 @@ integerBitOrMatch(
struct berval *value,
void *assertedValue )
{
long lValue, lAssertedValue;
SLAP_LONG lValue, lAssertedValue;
/* safe to assume integers are NUL terminated? */
lValue = strtol(value->bv_val, NULL, 10);
if(( lValue == LONG_MIN || lValue == LONG_MAX) && errno == ERANGE ) {
lValue = SLAP_STRTOL(value->bv_val, NULL, 10);
if(( lValue == SLAP_LONG_MIN || lValue == SLAP_LONG_MAX ) && errno == ERANGE ) {
return LDAP_CONSTRAINT_VIOLATION;
}
lAssertedValue = strtol(((struct berval *)assertedValue)->bv_val, NULL, 10);
if(( lAssertedValue == LONG_MIN || lAssertedValue == LONG_MAX)
lAssertedValue = SLAP_STRTOL(((struct berval *)assertedValue)->bv_val, NULL, 10);
if(( lAssertedValue == SLAP_LONG_MIN || lAssertedValue == SLAP_LONG_MAX )
&& errno == ERANGE )
{
return LDAP_CONSTRAINT_VIOLATION;