Continued atoi() replacement with strtol() wrapper (issue #21)
authorMichael Rash <mbr@cipherdyne.org>
Tue, 19 Feb 2013 03:22:44 +0000 (22:22 -0500)
committerMichael Rash <mbr@cipherdyne.org>
Tue, 19 Feb 2013 03:22:44 +0000 (22:22 -0500)
This commit replaces a few additional atoi() calls with the strtol() wrapper
function, and also fixes a bug where access SOURCE IP/mask combinations would
not be accepted when the string length was a long as something like
'123.123.123.123/255.255.255.255'.

server/access.c
server/access.h
test/conf/multi_stanzas_access.conf

index 34effc8..0abe4e8 100644 (file)
@@ -82,14 +82,6 @@ add_acc_b64_string(char **var, int *len, const char *val)
     }
 }
 
-/* Add an access int entry
-*/
-static int
-add_acc_int(int *var, const char *val)
-{
-    return(*var = atoi(val));
-}
-
 /* Add an access bool entry (unsigned char of 1 or 0)
 */
 static unsigned char
@@ -221,6 +213,7 @@ add_source_mask(fko_srv_options_t *opts, acc_stanza_t *acc, const char *ip)
     char                *ndx;
     char                ip_str[MAX_IPV4_STR_LEN] = {0};
     uint32_t            mask;
+    int                 is_err;
 
     struct in_addr      in;
 
@@ -256,7 +249,16 @@ add_source_mask(fko_srv_options_t *opts, acc_stanza_t *acc, const char *ip)
                 return 0;
             }
 
-            mask = atoi(ndx+1);
+            mask = strtol_wrapper(ndx+1, 0, 0, NO_EXIT_UPON_ERR, &is_err);
+            if(is_err != FKO_SUCCESS)
+            {
+                fprintf(stderr,
+                    "[*] Invalid IP mask str '%s'.", ndx+1);
+                free(new_sle);
+                new_sle = NULL;
+                return 0;
+            }
+
             strlcpy(ip_str, ip, (ndx-ip)+1);
         }
         else
@@ -368,6 +370,7 @@ parse_proto_and_port(char *pstr, int *proto, int *port)
 {
     char    *ndx;
     char    proto_str[ACCESS_BUF_LEN];
+    int     is_err;
 
     /* Parse the string into its components.
     */
@@ -388,9 +391,8 @@ parse_proto_and_port(char *pstr, int *proto, int *port)
 
     strlcpy(proto_str, pstr, (ndx - pstr)+1);
 
-    *port = atoi(ndx+1);
-
-    if((*port < 0) || (*port > MAX_PORT))
+    *port = strtol_wrapper(ndx+1, 0, MAX_PORT, NO_EXIT_UPON_ERR, &is_err);
+    if(is_err != FKO_SUCCESS)
     {
         log_msg(LOG_ERR,
             "Invalid port in access request: %s", pstr);
@@ -891,7 +893,7 @@ parse_access_file(fko_srv_options_t *opts)
 {
     FILE           *file_ptr;
     char           *ndx;
-    int             got_source = 0;
+    int             got_source = 0, is_err;
     unsigned int    num_lines = 0;
 
     char            access_line_buf[MAX_LINE_LEN] = {0};
@@ -1071,7 +1073,14 @@ parse_access_file(fko_srv_options_t *opts)
         }
         else if(CONF_VAR_IS(var, "FW_ACCESS_TIMEOUT"))
         {
-            add_acc_int(&(curr_acc->fw_access_timeout), val);
+            curr_acc->fw_access_timeout = strtol_wrapper(val, 0,
+                    (2 << 31), NO_EXIT_UPON_ERR, &is_err);
+            if(is_err != FKO_SUCCESS)
+            {
+                fprintf(stderr,
+                    "[*] FW_ACCESS_TIMEOUT value not in range.");
+                clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
+            }
         }
         else if(CONF_VAR_IS(var, "ENCRYPTION_MODE"))
         {
index 4ecae19..2098b46 100644 (file)
@@ -34,7 +34,9 @@
 #define PROTO_TCP   6
 #define PROTO_UDP   17
 
-#define ACCESS_BUF_LEN  32
+/* Allow strings as large as 123.123.123.123/255.255.255.255
+*/
+#define ACCESS_BUF_LEN  33
 
 /* Function Prototypes
 */
index 93fc057..70d2bef 100644 (file)
@@ -2,7 +2,7 @@ SOURCE: 4.3.2.0/24, 23.43.0.0/16, 10.10.10.10;
 KEY: fwknoptest;
 FW_ACCESS_TIMEOUT:  3;
 
-SOURCE: 23.43.0.0/16, 10.10.10.10;
+SOURCE: 23.43.0.0/16, 123.123.123.123/255.255.255.255, 10.10.10.10;
 KEY: fwknoptest;
 FW_ACCESS_TIMEOUT:  3;