From 42f3b3d87b8bea05ab97304866ebc5cfae2890e7 Mon Sep 17 00:00:00 2001
From: Pierangelo Masarati <ando@openldap.org>
Date: Fri, 18 Jun 2004 09:11:53 +0000
Subject: [PATCH] improve parsing - first step

---
 servers/slapd/aclparse.c |  34 ++++++-
 servers/slapd/config.c   | 195 +++++++++++++++++++++++++++------------
 2 files changed, 167 insertions(+), 62 deletions(-)

diff --git a/servers/slapd/aclparse.c b/servers/slapd/aclparse.c
index b554fe0f2a..cb76aa9b24 100644
--- a/servers/slapd/aclparse.c
+++ b/servers/slapd/aclparse.c
@@ -252,7 +252,7 @@ parse_acl(
 )
 {
 	int		i;
-	char		*left, *right, *style;
+	char		*left, *right, *style, *next;
 	struct berval	bv;
 	AccessControl	*a;
 	Access	*b;
@@ -1270,7 +1270,13 @@ parse_acl(
 						acl_usage();
 					}
 
-					b->a_authz.sai_ssf = atoi( right );
+					b->a_authz.sai_ssf = strtol( right, *next, 10 );
+					if ( next == NULL || next[0] != '\0' ) {
+						fprintf( stderr,
+							"%s: line %d: unable to parse ssf value (%s)\n",
+							fname, lineno, right );
+						acl_usage();
+					}
 
 					if( !b->a_authz.sai_ssf ) {
 						fprintf( stderr,
@@ -1303,7 +1309,13 @@ parse_acl(
 						acl_usage();
 					}
 
-					b->a_authz.sai_transport_ssf = atoi( right );
+					b->a_authz.sai_transport_ssf = strtol( right, &next, 10 );
+					if ( next == NULL || next[0] != '\0' ) {
+						fprintf( stderr,
+							"%s: line %d: unable to parse transport_ssf value (%s)\n",
+							fname, lineno, right );
+						acl_usage();
+					}
 
 					if( !b->a_authz.sai_transport_ssf ) {
 						fprintf( stderr,
@@ -1336,7 +1348,13 @@ parse_acl(
 						acl_usage();
 					}
 
-					b->a_authz.sai_tls_ssf = atoi( right );
+					b->a_authz.sai_tls_ssf = strtol( right, &next, 10 );
+					if ( next == NULL || next[0] != '\0' ) {
+						fprintf( stderr,
+							"%s: line %d: unable to parse tls_ssf value (%s)\n",
+							fname, lineno, right );
+						acl_usage();
+					}
 
 					if( !b->a_authz.sai_tls_ssf ) {
 						fprintf( stderr,
@@ -1369,7 +1387,13 @@ parse_acl(
 						acl_usage();
 					}
 
-					b->a_authz.sai_sasl_ssf = atoi( right );
+					b->a_authz.sai_sasl_ssf = strtol( right, &next, 10 );
+					if ( next == NULL || next[0] != '\0' ) {
+						fprintf( stderr,
+							"%s: line %d: unable to parse sasl_ssf value (%s)\n",
+							fname, lineno, right );
+						acl_usage();
+					}
 
 					if( !b->a_authz.sai_sasl_ssf ) {
 						fprintf( stderr,
diff --git a/servers/slapd/config.c b/servers/slapd/config.c
index b91b0979df..e0c49c7c07 100644
--- a/servers/slapd/config.c
+++ b/servers/slapd/config.c
@@ -120,6 +120,8 @@ read_config( const char *fname, int depth )
 	LDAPURLDesc *ludp;
 	static BackendInfo *bi = NULL;
 	static BackendDB	*be = NULL;
+	char	*next;
+
 
 	vals[1].bv_val = NULL;
 
@@ -259,7 +261,7 @@ read_config( const char *fname, int depth )
 			if ( cargc < 2 ) {
 #ifdef NEW_LOGGING
 				LDAP_LOG( CONFIG, CRIT, 
-					"%s: line %d: missing level in \"concurrency <level\" "
+					"%s: line %d: missing level in \"concurrency <level>\" "
 					" line\n", fname, lineno, 0 );
 #else
 				Debug( LDAP_DEBUG_ANY,
@@ -270,7 +272,19 @@ read_config( const char *fname, int depth )
 				return( 1 );
 			}
 
-			c = atoi( cargv[1] );
+			c = strtol( cargv[1], &next, 10 );
+			if ( next == NULL || next[0] != '\0' ) {
+#ifdef NEW_LOGGING
+				LDAP_LOG( CONFIG, CRIT, 
+					"%s: line %d: unable to parse level \"%s\" in \"concurrency <level>\" "
+					" line\n", fname, lineno, cargv[1] );
+#else
+				Debug( LDAP_DEBUG_ANY,
+	    "%s: line %d: unable to parse level \"%s\" in \"concurrency <level>\" line\n",
+				    fname, lineno, cargv[1] );
+#endif
+				return( 1 );
+			}
 
 			if( c < 1 ) {
 #ifdef NEW_LOGGING
@@ -541,7 +555,19 @@ read_config( const char *fname, int depth )
 				return( 1 );
 			}
 
-			c = atoi( cargv[1] );
+			c = strtol( cargv[1], &next, 10 );
+			if (next == NULL || next[0] != '\0' ) {
+#ifdef NEW_LOGGING
+				LDAP_LOG( CONFIG, CRIT, 
+					"%s: line %d: unable to parse count \"%s\" in \"threads <count>\" line\n",
+					fname, lineno, cargv[1] );
+#else
+				Debug( LDAP_DEBUG_ANY,
+	    "%s: line %d: unable to parse count \"%s\" in \"threads <count>\" line\n",
+				    fname, lineno, cargv[1] );
+#endif
+				return( 1 );
+			}
 
 			if( c < 0 ) {
 #ifdef NEW_LOGGING
@@ -821,8 +847,6 @@ read_config( const char *fname, int depth )
 					if ( strcasecmp( cargv[i], "unlimited" ) == 0 ) {
 						lim->lms_s_soft = -1;
 					} else {
-						char *next;
-
 						lim->lms_s_soft = strtol( cargv[i] , &next, 0 );
 						if ( next == cargv[i] ) {
 #ifdef NEW_LOGGING
@@ -901,8 +925,6 @@ read_config( const char *fname, int depth )
 					if ( strcasecmp( cargv[i], "unlimited" ) == 0 ) {
 						lim->lms_t_soft = -1;
 					} else {
-						char *next;
-
 						lim->lms_t_soft = strtol( cargv[i] , &next, 0 );
 						if ( next == cargv[i] ) {
 #ifdef NEW_LOGGING
@@ -1150,25 +1172,38 @@ read_config( const char *fname, int depth )
 "%s: line %d: depth line must appear inside a database definition.\n",
                                    fname, lineno, 0 );
 #endif
-							return 1;
+				return 1;
+                       }
+
+		       i = strtol( cargv[1], &next, 10 );
+		       if ( next == NULL || next[0] != '\0' ) {
+#ifdef NEW_LOGGING
+			       LDAP_LOG( CONFIG, INFO, 
+					  "%s: line %d: unable to parse depth \"%s\" in \"maxDerefDepth <depth>\" "
+					  "line.\n", fname, lineno, cargv[1] );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+					  "%s: line %d: unable to parse depth \"%s\" in \"maxDerefDepth <depth>\" "
+					  "line.\n", fname, lineno, cargv[1] );
+#endif
+				return 1;
+		       }
 
-                       } else if ((i = atoi(cargv[1])) < 0) {
+		       if (i < 0) {
 #ifdef NEW_LOGGING
 			       LDAP_LOG( CONFIG, INFO, 
 					  "%s: line %d: depth must be positive.\n",
-					  fname, lineno ,0 );
+					  fname, lineno, 0 );
 #else
                                Debug( LDAP_DEBUG_ANY,
 "%s: line %d: depth must be positive.\n",
                                    fname, lineno, 0 );
 #endif
-							return 1;
-
+				return 1;
 
-                       } else {
-                           be->be_max_deref_depth = i;
-					   }
 
+                       }
+                       be->be_max_deref_depth = i;
 
 		/* set magic "root" dn for this database */
 		} else if ( strcasecmp( cargv[0], "rootdn" ) == 0 ) {
@@ -1632,64 +1667,67 @@ restrict_unknown:;
 			}
 
 			for( i=1; i < cargc; i++ ) {
-				if( strncasecmp( cargv[i], "ssf=",
-					sizeof("ssf") ) == 0 )
+				int	*tgt;
+				char	*src;
+
+				if ( strncasecmp( cargv[i], "ssf=",
+						STRLENOF("ssf=") ) == 0 )
 				{
-					set->sss_ssf =
-						atoi( &cargv[i][sizeof("ssf")] );
+					tgt = &set->sss_ssf;
+					src = &cargv[i][STRLENOF("ssf=")];
 
-				} else if( strncasecmp( cargv[i], "transport=",
-					sizeof("transport") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "transport=",
+						STRLENOF("transport=") ) == 0 )
 				{
-					set->sss_transport =
-						atoi( &cargv[i][sizeof("transport")] );
+					tgt = &set->sss_transport;
+					src = &cargv[i][STRLENOF("transport=")];
 
-				} else if( strncasecmp( cargv[i], "tls=",
-					sizeof("tls") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "tls=",
+						STRLENOF("tls=") ) == 0 )
 				{
-					set->sss_tls =
-						atoi( &cargv[i][sizeof("tls")] );
+					tgt = &set->sss_tls;
+					src = &cargv[i][STRLENOF("tls=")];
 
-				} else if( strncasecmp( cargv[i], "sasl=",
-					sizeof("sasl") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "sasl=",
+						STRLENOF("sasl=") ) == 0 )
 				{
-					set->sss_sasl =
-						atoi( &cargv[i][sizeof("sasl")] );
+					tgt = &set->sss_sasl;
+					src = &cargv[i][STRLENOF("sasl=")];
 
-				} else if( strncasecmp( cargv[i], "update_ssf=",
-					sizeof("update_ssf") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "update_ssf=",
+						STRLENOF("update_ssf=") ) == 0 )
 				{
-					set->sss_update_ssf =
-						atoi( &cargv[i][sizeof("update_ssf")] );
+					tgt = &set->sss_update_ssf;
+					src = &cargv[i][STRLENOF("update_ssf=")];
 
-				} else if( strncasecmp( cargv[i], "update_transport=",
-					sizeof("update_transport") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "update_transport=",
+						STRLENOF("update_transport=") ) == 0 )
 				{
-					set->sss_update_transport =
-						atoi( &cargv[i][sizeof("update_transport")] );
+					tgt = &set->sss_update_transport;
+					src = &cargv[i][STRLENOF("update_transport=")];
 
-				} else if( strncasecmp( cargv[i], "update_tls=",
-					sizeof("update_tls") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "update_tls=",
+						STRLENOF("update_tls=") ) == 0 )
 				{
-					set->sss_update_tls =
-						atoi( &cargv[i][sizeof("update_tls")] );
+					tgt = &set->sss_update_tls;
+					src = &cargv[i][STRLENOF("update_tls=")];
 
-				} else if( strncasecmp( cargv[i], "update_sasl=",
-					sizeof("update_sasl") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "update_sasl=",
+						STRLENOF("update_sasl=") ) == 0 )
 				{
-					set->sss_update_sasl =
-						atoi( &cargv[i][sizeof("update_sasl")] );
+					tgt = &set->sss_update_sasl;
+					src = &cargv[i][STRLENOF("update_sasl=")];
 
-				} else if( strncasecmp( cargv[i], "simple_bind=",
-					sizeof("simple_bind") ) == 0 )
+				} else if ( strncasecmp( cargv[i], "simple_bind=",
+						STRLENOF("simple_bind=") ) == 0 )
 				{
-					set->sss_simple_bind =
-						atoi( &cargv[i][sizeof("simple_bind")] );
+					tgt = &set->sss_simple_bind;
+					src = &cargv[i][STRLENOF("simple_bind=")];
 
 				} else {
 #ifdef NEW_LOGGING
 					LDAP_LOG( CONFIG, CRIT, 
-						   "%s: line %d: unknown factor %S in "
+						   "%s: line %d: unknown factor %s in "
 						   "\"security <factors>\" line.\n",
 						   fname, lineno, cargv[1] );
 #else
@@ -1700,7 +1738,24 @@ restrict_unknown:;
 
 					return( 1 );
 				}
+
+				*tgt = strtol( src, &next, 10 );
+				if ( next == NULL || next[0] != '\0' ) {
+#ifdef NEW_LOGGING
+					LDAP_LOG( CONFIG, CRIT, 
+						   "%s: line %d: unable to parse factor \"%s\" in "
+						   "\"security <factors>\" line.\n",
+						   fname, lineno, cargv[1] );
+#else
+					Debug( LDAP_DEBUG_ANY,
+		    "%s: line %d: unable to parse factor \"%s\" in \"security <factors>\" line\n",
+					    fname, lineno, cargv[i] );
+#endif
+
+					return( 1 );
+				}
 			}
+
 		/* where to send clients when we don't hold it */
 		} else if ( strcasecmp( cargv[0], "referral" ) == 0 ) {
 			if ( cargc < 2 ) {
@@ -1768,10 +1823,22 @@ restrict_unknown:;
 					"%s: line %d: Error in debug directive, \"debug subsys level\"\n",
 					fname, lineno, 0 );
 #endif
-
 				return( 1 );
 			}
-                        level = atoi( cargv[2] );
+                        level = strtol( cargv[2], &next, 10 );
+			if ( next == NULL || next[0] != '\0' ){
+#ifdef NEW_LOGGING
+				LDAP_LOG( CONFIG, CRIT, 
+					   "%s: line %d: unable to parse level \"%s\" in debug directive, "
+					   "\"debug <subsys> <level>\"\n", fname, lineno , cargv[2] );
+#else
+				Debug( LDAP_DEBUG_ANY,
+					   "%s: line %d: unable to parse level \"%s\" in debug directive, "
+					   "\"debug <subsys> <level>\"\n", fname, lineno , cargv[2] );
+#endif
+				return( 1 );
+			}
+
                         if ( level <= 0 ) level = lutil_mnem2level( cargv[2] );
                         lutil_set_debug_level( cargv[1], level );
 		/* specify an Object Identifier macro */
@@ -1898,11 +1965,11 @@ restrict_unknown:;
 			if ( cargc < 2 ) {
 #ifdef NEW_LOGGING
 				LDAP_LOG( CONFIG, CRIT, 
-					"%s: line %d: missing level in \"loglevel <level>\""
+					"%s: line %d: missing level(s) in \"loglevel <level> [...]\""
 					" line.\n", fname, lineno , 0 );
 #else
 				Debug( LDAP_DEBUG_ANY,
-		    "%s: line %d: missing level in \"loglevel <level>\" line\n",
+		    "%s: line %d: missing level(s) in \"loglevel <level> [...]\" line\n",
 				    fname, lineno, 0 );
 #endif
 
@@ -1912,7 +1979,21 @@ restrict_unknown:;
 			ldap_syslog = 0;
 
 			for( i=1; i < cargc; i++ ) {
-				ldap_syslog += atoi( cargv[1] );
+				int	level = strtol( cargv[i], &next, 10 );
+				if ( next == NULL || next[0] != '\0' ) {
+#ifdef NEW_LOGGING
+					LDAP_LOG( CONFIG, CRIT, 
+						"%s: line %d: unable to parse level \"%s\" in \"loglevel <level> [...]\""
+						" line.\n", fname, lineno , cargv[i] );
+#else
+					Debug( LDAP_DEBUG_ANY,
+						"%s: line %d: unable to parse level \"%s\" in \"loglevel <level> [...]\""
+						" line.\n", fname, lineno , cargv[i] );
+#endif
+					return( 1 );
+				}
+
+				ldap_syslog |= level;
 			}
 
 		/* list of sync replication information in this backend (slave only) */
-- 
GitLab