Author: nkinder
Update of /cvs/dirsec/ldapserver/ldap/servers/slapd
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv3170
Modified Files:
libglobs.c
Log Message:
Bug(s) fixed: 181032
Bug Description: Most of our integer based config parameters do not do a good job
validating input. For example, alphabetic characters will be accepted as a value
if "0" is a valid setting for a given parameter since atoi returns "0" on error. We
also don't properly check for range errors for many parameters.
Reviewed by: Rich, Pete, and Noriko (Thanks!)
Files: ldapserver/ldap/servers/slapd/libglobs.c
Branch: HEAD
Fix Description: This adds better input validation for a number of integer based config
settings. I replaced our usage of atoi() with strtol() so we can recognize
conversion errors. I also added more descriptive error strings where they were
missing. I revised the fix due to feedback from Noriko. She recommended that
we check for ERANGE areas for all calls to strtol insead of only checking when
LONG_MAX is a valid setting for a config parameter.
Flag Day: no
Doc impact: no
QA impact: should be covered by regular nightly and manual testing
New Tests integrated into TET: none
Index: libglobs.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/libglobs.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- libglobs.c 25 Jan 2006 16:51:39 -0000 1.7
+++ libglobs.c 15 Feb 2006 00:26:19 -0000 1.8
@@ -950,7 +950,8 @@
int
config_set_port( const char *attrname, char *port, char *errorbuf, int apply ) {
- int nPort;
+ long nPort;
+ char *endp = NULL;
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
int retVal = LDAP_SUCCESS;
@@ -958,17 +959,20 @@
return LDAP_OPERATIONS_ERROR;
}
- nPort = atoi( port );
+ errno = 0;
+ nPort = strtol(port, &endp, 10);
- if ( nPort == 0 ) {
- LDAPDebug( LDAP_DEBUG_ANY,
- "Information: Non-Secure Port Disabled, server only contactable via secure port\n", 0, 0, 0 );
- }
- else if (nPort > LDAP_PORT_MAX || nPort < 0 ) {
+ if ( *endp != '\0' || errno == ERANGE || nPort > LDAP_PORT_MAX || nPort < 0 ) {
retVal = LDAP_OPERATIONS_ERROR;
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "%s: %d is invalid, ports must range from 1 to %d",
- attrname, nPort, LDAP_PORT_MAX );
+ "%s: \"%s\" is invalid, ports must range from 0 to %d",
+ attrname, port, LDAP_PORT_MAX );
+ return retVal;
+ }
+
+ if ( nPort == 0 ) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Information: Non-Secure Port Disabled, server only contactable via secure port\n", 0, 0, 0 );
}
if ( apply ) {
@@ -984,19 +988,23 @@
int
config_set_secureport( const char *attrname, char *port, char *errorbuf, int apply ) {
- int nPort = atoi ( port );
+ long nPort;
+ char *endp = NULL;
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
int retVal = LDAP_SUCCESS;
if ( config_value_is_null( attrname, port, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
+
+ errno = 0;
+ nPort = strtol(port, &endp, 10);
- if (nPort > LDAP_PORT_MAX || nPort <= 0 ) {
+ if (*endp != '\0' || errno == ERANGE || nPort > LDAP_PORT_MAX || nPort <= 0 ) {
retVal = LDAP_OPERATIONS_ERROR;
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "%s: %d is invalid, ports must range from 1 to %d",
- attrname, nPort, LDAP_PORT_MAX );
+ "%s: \"%s\" is invalid, ports must range from 1 to %d",
+ attrname, port, LDAP_PORT_MAX );
}
if (apply) {
@@ -1159,23 +1167,27 @@
int
config_set_sizelimit( const char *attrname, char *value, char *errorbuf, int apply ) {
int retVal = LDAP_SUCCESS;
+ long sizelimit;
+ char *endp = NULL;
Slapi_Backend *be;
char *cookie;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
- int sizelimit = atoi ( value );
-
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- if ( sizelimit < -1 ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: %d is too small",
- attrname, sizelimit );
+ errno = 0;
+ sizelimit = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || sizelimit < -1 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: \"%s\" is invalid, sizelimit must range from -1 to %ld",
+ attrname, value, LONG_MAX );
retVal = LDAP_OPERATIONS_ERROR;
return retVal;
}
-
+
if (apply) {
CFG_LOCK_WRITE(slapdFrontendConfig);
@@ -1347,15 +1359,20 @@
int
config_set_pw_minlength( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minLength = 0;
+ int retVal = LDAP_SUCCESS;
+ long minLength = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minLength = atoi(value);
- if ( minLength < 2 || minLength > 512 ) {
+ errno = 0;
+ minLength = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minLength < 2 || minLength > 512 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum length \"%s\" is invalid. "
"The minimum length must range from 2 to 512.",
@@ -1377,15 +1394,20 @@
int
config_set_pw_mindigits( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minDigits = 0;
+ int retVal = LDAP_SUCCESS;
+ long minDigits = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minDigits = atoi(value);
- if ( minDigits < 0 || minDigits > 64 ) {
+ errno = 0;
+ minDigits = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minDigits < 0 || minDigits > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of digits \"%s\" is invalid. "
"The minimum number of digits must range from 0 to 64.",
@@ -1407,15 +1429,20 @@
int
config_set_pw_minalphas( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minAlphas = 0;
+ int retVal = LDAP_SUCCESS;
+ long minAlphas = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minAlphas = atoi(value);
- if ( minAlphas < 0 || minAlphas > 64 ) {
+ errno = 0;
+ minAlphas = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minAlphas < 0 || minAlphas > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of alphas \"%s\" is invalid. "
"The minimum number of alphas must range from 0 to 64.",
@@ -1437,15 +1464,20 @@
int
config_set_pw_minuppers( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minUppers = 0;
+ int retVal = LDAP_SUCCESS;
+ long minUppers = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minUppers = atoi(value);
- if ( minUppers < 0 || minUppers > 64 ) {
+ errno = 0;
+ minUppers = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minUppers < 0 || minUppers > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of uppercase characters \"%s\" is invalid. "
"The minimum number of uppercase characters must range from 0 to 64.",
@@ -1467,15 +1499,20 @@
int
config_set_pw_minlowers( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minLowers = 0;
+ int retVal = LDAP_SUCCESS;
+ long minLowers = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minLowers = atoi(value);
- if ( minLowers < 0 || minLowers > 64 ) {
+ errno = 0;
+ minLowers = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minLowers < 0 || minLowers > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of lowercase characters \"%s\" is invalid. "
"The minimum number of lowercase characters must range from 0 to 64.",
@@ -1497,15 +1534,20 @@
int
config_set_pw_minspecials( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minSpecials = 0;
+ int retVal = LDAP_SUCCESS;
+ long minSpecials = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minSpecials = atoi(value);
- if ( minSpecials < 0 || minSpecials > 64 ) {
+ errno = 0;
+ minSpecials = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minSpecials < 0 || minSpecials > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of special characters \"%s\" is invalid. "
"The minimum number of special characters must range from 0 to 64.",
@@ -1527,15 +1569,20 @@
int
config_set_pw_min8bit( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, min8bit = 0;
+ int retVal = LDAP_SUCCESS;
+ long min8bit = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- min8bit = atoi(value);
- if ( min8bit < 0 || min8bit > 64 ) {
+ errno = 0;
+ min8bit = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || min8bit < 0 || min8bit > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of 8-bit characters \"%s\" is invalid. "
"The minimum number of 8-bit characters must range from 0 to 64.",
@@ -1557,15 +1604,20 @@
int
config_set_pw_maxrepeats( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, maxRepeats = 0;
+ int retVal = LDAP_SUCCESS;
+ long maxRepeats = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- maxRepeats = atoi(value);
- if ( maxRepeats < 0 || maxRepeats > 64 ) {
+ errno = 0;
+ maxRepeats = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || maxRepeats < 0 || maxRepeats > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password maximum number of repeated characters \"%s\" is invalid. "
"The maximum number of repeated characters must range from 0 to 64.",
@@ -1587,15 +1639,20 @@
int
config_set_pw_mincategories( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minCategories = 0;
+ int retVal = LDAP_SUCCESS;
+ long minCategories = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minCategories = atoi(value);
- if ( minCategories < 1 || minCategories > 5 ) {
+ errno = 0;
+ minCategories = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minCategories < 1 || minCategories > 5 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum number of categories \"%s\" is invalid. "
"The minimum number of categories must range from 1 to 5.",
@@ -1617,15 +1674,20 @@
int
config_set_pw_mintokenlength( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, minTokenLength = 0;
+ int retVal = LDAP_SUCCESS;
+ long minTokenLength = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- minTokenLength = atoi(value);
- if ( minTokenLength < 1 || minTokenLength > 64 ) {
+ errno = 0;
+ minTokenLength = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || minTokenLength < 1 || minTokenLength > 64 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password minimum token length \"%s\" is invalid. "
"The minimum token length must range from 1 to 64.",
@@ -1647,15 +1709,20 @@
int
config_set_pw_maxfailure( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, maxFailure = 0;
+ int retVal = LDAP_SUCCESS;
+ long maxFailure = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- maxFailure = atoi(value);
- if ( maxFailure <= 0 || maxFailure > 32767 ) {
+ errno = 0;
+ maxFailure = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || maxFailure <= 0 || maxFailure > 32767 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password maximum retry \"%s\" is invalid. "
"Password maximum failure must range from 1 to 32767",
@@ -1679,15 +1746,20 @@
int
config_set_pw_inhistory( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, history = 0;
+ int retVal = LDAP_SUCCESS;
+ long history = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- history = atoi(value);
- if ( history < 2 || history > 24 ) {
+ errno = 0;
+ history = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || history < 2 || history > 24 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password history length \"%s\" is invalid. "
"The password history must range from 2 to 24",
@@ -1712,16 +1784,19 @@
config_set_pw_lockduration( const char *attrname, char *value, char *errorbuf, int apply ) {
int retVal = LDAP_SUCCESS;
long duration = 0; /* in minutes */
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
+ errno = 0;
/* in seconds */
- duration = strtol (value, NULL, 0);
+ duration = strtol(value, &endp, 10);
- if ( duration <= 0 || duration > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
+ if ( *endp != '\0' || errno == ERANGE || duration <= 0 || duration > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password lockout duration \"%s\" seconds is invalid. ",
value );
@@ -1741,15 +1816,19 @@
config_set_pw_resetfailurecount( const char *attrname, char *value, char *errorbuf, int apply ) {
int retVal = LDAP_SUCCESS;
long duration = 0; /* in minutes */
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
+ errno = 0;
/* in seconds */
- duration = strtol (value, NULL, 0);
- if ( duration < 0 || duration > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
+ duration = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || duration < 0 || duration > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
"password reset count duration \"%s\" seconds is invalid. ",
value );
@@ -1824,18 +1903,22 @@
int
config_set_pw_gracelimit( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, gracelimit = 0;
+ int retVal = LDAP_SUCCESS;
+ long gracelimit = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
-
- gracelimit = atoi(value);
- if ( gracelimit < 0 ) {
+ errno = 0;
+ gracelimit = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || gracelimit < 0 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "password grace limit \"%s\" is invalid.",
- value );
+ "password grace limit \"%s\" is invalid, password grace limit must range from 0 to %ld",
+ value , LONG_MAX );
retVal = LDAP_OPERATIONS_ERROR;
return retVal;
}
@@ -2296,17 +2379,21 @@
int
config_set_threadnumber( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, threadnum = 0;
+ int retVal = LDAP_SUCCESS;
+ long threadnum = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- threadnum = atoi ( value );
+ errno = 0;
+ threadnum = strtol(value, &endp, 10);
- if ( threadnum < 1 || threadnum > 65535 ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, maximum thread number must range from 1 to 65535", attrname, threadnum );
+ if ( *endp != '\0' || errno == ERANGE || threadnum < 1 || threadnum > 65535 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", maximum thread number must range from 1 to 65535", attrname, value );
retVal = LDAP_OPERATIONS_ERROR;
}
@@ -2321,17 +2408,21 @@
int
config_set_maxthreadsperconn( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, maxthreadnum = 0;
+ int retVal = LDAP_SUCCESS;
+ long maxthreadnum = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- maxthreadnum = atoi ( value );
+ errno = 0;
+ maxthreadnum = strtol(value, &endp, 10);
- if ( maxthreadnum < 1 || maxthreadnum > 65535 ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, maximum thread number per connection must range from 1 to 65535", attrname, maxthreadnum );
+ if ( *endp != '\0' || errno == ERANGE || maxthreadnum < 1 || maxthreadnum > 65535 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", maximum thread number per connection must range from 1 to 65535", attrname, value );
retVal = LDAP_OPERATIONS_ERROR;
}
@@ -2348,29 +2439,34 @@
#include <sys/resource.h>
int
config_set_maxdescriptors( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ long nValue = 0;
int maxVal = 65535;
struct rlimit rlp;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
if ( 0 == getrlimit( RLIMIT_NOFILE, &rlp ) ) {
- maxVal = (int)rlp.rlim_max;
+ maxVal = (int)rlp.rlim_max;
}
-
- if ( nValue < 1 || nValue > maxVal ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, maximum file descriptors must range from 1 to %d (the current process limit)",
- attrname, nValue, maxVal );
- if ( nValue < 1 ) {
- retVal = LDAP_OPERATIONS_ERROR;
- } else {
- nValue = maxVal;
- retVal = LDAP_UNWILLING_TO_PERFORM;
- }
+
+ errno = 0;
+ nValue = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || nValue < 1 || nValue > maxVal ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", maximum file descriptors must range from 1 to %d (the current process limit)",
+ attrname, value, maxVal );
+ if ( nValue > maxVal ) {
+ nValue = maxVal;
+ retVal = LDAP_UNWILLING_TO_PERFORM;
+ } else {
+ retVal = LDAP_OPERATIONS_ERROR;
+ }
}
if (apply) {
@@ -2385,8 +2481,10 @@
int
config_set_conntablesize( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ long nValue = 0;
int maxVal = 65535;
+ char *endp = NULL;
#ifndef _WIN32
struct rlimit rlp;
#endif
@@ -2396,27 +2494,31 @@
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
+#ifndef _WIN32
+ if ( 0 == getrlimit( RLIMIT_NOFILE, &rlp ) ) {
+ maxVal = (int)rlp.rlim_max;
+ }
+#endif
+
+ errno = 0;
+ nValue = strtol(value, &endp, 0);
#ifdef _WIN32
- if ( nValue < 1 || nValue > 0xfffffe ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, connection table size must range from 1 to 0xfffffe", attrname, nValue );
+ if ( *endp != '\0' || errno == ERANGE || nValue < 1 || nValue > 0xfffffe ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", connection table size must range from 1 to 0xfffffe", attrname, value );
retVal = LDAP_OPERATIONS_ERROR;
}
#elif !defined(AIX)
- if ( 0 == getrlimit( RLIMIT_NOFILE, &rlp ) ) {
- maxVal = (int)rlp.rlim_max;
- }
- if ( nValue < 1 || nValue > maxVal ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, connection table size must range from 1 to %d (the current process maxdescriptors limit)",
- attrname, nValue, maxVal );
- if ( nValue < 1 ) {
- retVal = LDAP_OPERATIONS_ERROR;
- } else {
- nValue = maxVal;
- retVal = LDAP_UNWILLING_TO_PERFORM;
- }
+ if ( *endp != '\0' || errno == ERANGE || nValue < 1 || nValue > maxVal ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", connection table size must range from 1 to %d"
+ " (the current process maxdescriptors limit)", attrname, value, maxVal );
+ if ( nValue > maxVal) {
+ nValue = maxVal;
+ retVal = LDAP_UNWILLING_TO_PERFORM;
+ } else {
+ retVal = LDAP_OPERATIONS_ERROR;
+ }
}
#endif
@@ -2431,18 +2533,38 @@
int
config_set_reservedescriptors( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ int maxVal = 65535;
+ long nValue = 0;
+ char *endp = NULL;
+#ifndef _WIN32
+ struct rlimit rlp;
+#endif
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
+#ifndef _WIN32
+ if ( 0 == getrlimit( RLIMIT_NOFILE, &rlp ) ) {
+ maxVal = (int)rlp.rlim_max;
+ }
+#endif
+
+ errno = 0;
+ nValue = strtol(value, &endp, 10);
- if ( nValue < 1 || nValue > 65535 ) {
- PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value %d, reserved file descriptors must range from 1 to 65535", attrname, nValue );
- retVal = LDAP_OPERATIONS_ERROR;
+ if ( *endp != '\0' || errno == ERANGE || nValue < 1 || nValue > maxVal ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", reserved file descriptors must range from 1 to %d"
+ " (the current process maxdescriptors limit)", attrname, value, maxVal );
+ if ( nValue > maxVal) {
+ nValue = maxVal;
+ retVal = LDAP_UNWILLING_TO_PERFORM;
+ } else {
+ retVal = LDAP_OPERATIONS_ERROR;
+ }
}
if (apply) {
@@ -2458,14 +2580,25 @@
int
config_set_ioblocktimeout( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ long nValue = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
+ errno = 0;
+ nValue = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || nValue < 0 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", I/O block timeout must range from 0 to %ld",
+ attrname, value, LONG_MAX );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
+ }
#if defined(IRIX)
/* on IRIX poll can only handle timeouts up to
@@ -2489,14 +2622,25 @@
int
config_set_idletimeout( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ long nValue = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
+ errno = 0;
+ nValue = strtol(value, &endp, 10);
+
+ if (*endp != '\0' || errno == ERANGE || nValue < 0 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: invalid value \"%s\", idle timeout must range from 0 to %ld",
+ attrname, value, LONG_MAX );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
+ }
if (apply) {
CFG_LOCK_WRITE(slapdFrontendConfig);
@@ -2511,19 +2655,25 @@
int
config_set_groupevalnestlevel( const char *attrname, char * value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nValue = 0;
+ int retVal = LDAP_SUCCESS;
+ long nValue = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
return LDAP_OPERATIONS_ERROR;
}
- nValue = atoi ( value );
+ errno = 0;
+ nValue = strtol(value, &endp, 10);
- if ( nValue < 1 ) {
+ if ( *endp != '\0' || errno == ERANGE || nValue < 0 || nValue > 5 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "%s: invalid value %d, must be a positive number",
- attrname, nValue );
+ "%s: invalid value \"%s\", group eval nest level must range from 0 to 5",
+ attrname, value );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
}
if (apply) {
CFG_LOCK_WRITE(slapdFrontendConfig);
@@ -2571,7 +2721,9 @@
int
config_set_timelimit( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, nVal = 0;
+ int retVal = LDAP_SUCCESS;
+ long nVal = 0;
+ char *endp = NULL;
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
Slapi_Backend *be = NULL;
char *cookie;
@@ -2582,10 +2734,15 @@
return LDAP_OPERATIONS_ERROR;
}
- nVal = atoi(value);
- if ( nVal < 0 ) {
+ errno = 0;
+ nVal = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || nVal < 0 ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "%s: invalid value %d", attrname, nVal );
+ "%s: invalid value \"%s\", time limit must range from 0 to %ld",
+ attrname, value, LONG_MAX );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
}
if ( apply ) {
@@ -2699,22 +2856,27 @@
}
return retVal;
}
+
int
config_set_pw_maxage( const char *attrname, char *value, char *errorbuf, int apply ) {
int retVal = LDAP_SUCCESS;
long age;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 1 )) {
return LDAP_OPERATIONS_ERROR;
}
+ errno = 0;
/* age in seconds */
- age = strtol(value, NULL, 0 );
- if ( age <= 0 || age > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
+ age = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || age <= 0 || age > (MAX_ALLOWED_TIME_IN_SECS - current_time()) ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "password maximum age \"%s\" seconds is invalid. ",
- value );
+ "%s: password maximum age \"%s\" seconds is invalid. ",
+ attrname, value );
retVal = LDAP_OPERATIONS_ERROR;
return retVal;
}
@@ -2736,6 +2898,7 @@
return LDAP_OPERATIONS_ERROR;
}
+ errno = 0;
/* age in seconds */
age = strtol(value, &endPtr, 0 );
/* endPtr should never be NULL, but we check just in case; if the
@@ -2750,10 +2913,11 @@
*/
if ( (age < 0) ||
(age > (MAX_ALLOWED_TIME_IN_SECS - current_time())) ||
- (endPtr == NULL) || (endPtr == value) || !isdigit(*(endPtr-1)) ) {
+ (endPtr == NULL) || (endPtr == value) || !isdigit(*(endPtr-1)) ||
+ errno == ERANGE ) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "password minimum age \"%s\" seconds is invalid. ",
- value );
+ "%s: password minimum age \"%s\" seconds is invalid. ",
+ attrname, value );
retVal = LDAP_OPERATIONS_ERROR;
return retVal;
}
@@ -2768,19 +2932,23 @@
config_set_pw_warning( const char *attrname, char *value, char *errorbuf, int apply ) {
int retVal = LDAP_SUCCESS;
long sec;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 1 )) {
return LDAP_OPERATIONS_ERROR;
}
+ errno = 0;
/* in seconds */
- sec = strtol(value, NULL, 0);
- if (sec < 0) {
+ sec = strtol(value, &endp, 10);
+
+ if (*endp != '\0' || errno == ERANGE || sec < 0) {
PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
- "password warning age \"%s\" seconds is invalid, password warning "
- "age must be >= 0 seconds",
- value );
+ "%s: password warning age \"%s\" seconds is invalid, password warning "
+ "age must range from 0 to %ld seconds",
+ attrname, value, LONG_MAX );
retVal = LDAP_OPERATIONS_ERROR;
return retVal;
}
@@ -2795,16 +2963,28 @@
int
config_set_errorlog_level( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, level = 0;
+ int retVal = LDAP_SUCCESS;
+ long level = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 1 )) {
return LDAP_OPERATIONS_ERROR;
}
+
+ errno = 0;
+ level = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || level < 0 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: error log level \"%s\" is invalid,"
+ " error log level must range from 0 to %ld", attrname, value, LONG_MAX );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
+ }
if ( apply ) {
CFG_LOCK_WRITE(slapdFrontendConfig);
- level = atoi ( value );
level |= LDAP_DEBUG_ANY;
#ifdef _WIN32
@@ -2821,16 +3001,28 @@
int
config_set_accesslog_level( const char *attrname, char *value, char *errorbuf, int apply ) {
- int retVal = LDAP_SUCCESS, level = 0;
+ int retVal = LDAP_SUCCESS;
+ long level = 0;
+ char *endp = NULL;
+
slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
if ( config_value_is_null( attrname, value, errorbuf, 1 )) {
return LDAP_OPERATIONS_ERROR;
}
+
+ errno = 0;
+ level = strtol(value, &endp, 10);
+
+ if ( *endp != '\0' || errno == ERANGE || level < 0 ) {
+ PR_snprintf ( errorbuf, SLAPI_DSE_RETURNTEXT_SIZE, "%s: access log level \"%s\" is invalid,"
+ " access log level must range from 0 to %ld", attrname, value, LONG_MAX );
+ retVal = LDAP_OPERATIONS_ERROR;
+ return retVal;
+ }
if ( apply ) {
CFG_LOCK_WRITE(slapdFrontendConfig);
- level = atoi ( value );
g_set_accesslog_level ( level );
slapdFrontendConfig->accessloglevel = level;
CFG_UNLOCK_WRITE(slapdFrontendConfig);