fix: parse_number 64-bit architecture compatibility 66/196466/1 submit/tizen/20181231.025611
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Sun, 30 Dec 2018 02:05:32 +0000 (03:05 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Sun, 30 Dec 2018 02:12:01 +0000 (02:12 +0000)
Simplify strtol() return error code checking to properly handle 64-bit
architectures.  Problem appears only on 64-bit architectures, where
LONG_MAX (long type, 4 bytes) does not fit into regular int type
(4 bytes).

Additionally, this commit removes str2num() function which is copy
paste of parse_number (with same bugs).

Change-Id: I44cbcdd1e5601c8ed988368932e84f29f719c8a9

Makefile.am
src/shared/logconfig.c
src/shared/parsers.c

index 9e4fea8..126eabf 100644 (file)
@@ -116,6 +116,7 @@ dlogctl_LDFLAGS = \
 dlogctl_SOURCES = \
        src/shared/logcommon.c \
        src/shared/logconfig.c \
+       src/shared/parsers.c \
        src/libdlog/loglimiter.c \
        src/logctl/logctl.c
 
@@ -206,15 +207,15 @@ src_tests_test_ptrs_list_SOURCES = src/tests/test_ptrs_list.c src/shared/ptrs_li
 src_tests_test_ptrs_list_CFLAGS = $(check_CFLAGS)
 src_tests_test_ptrs_list_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=free,--wrap=calloc
 
-src_tests_test_common_SOURCES = src/tests/test_common.c src/shared/logcommon.c src/shared/logconfig.c
+src_tests_test_common_SOURCES = src/tests/test_common.c src/shared/logcommon.c src/shared/logconfig.c src/shared/parsers.c
 src_tests_test_common_CFLAGS = $(check_CFLAGS)
 src_tests_test_common_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=sendmsg,--wrap=recvmsg,--wrap=writev,--wrap=read,--wrap=poll,--wrap=fcntl,--wrap=malloc,--wrap=calloc,--wrap=connect,--wrap=socket,--wrap=open,--wrap=ioctl
 
-src_tests_limiter_SOURCES = src/tests/limiter.c src/libdlog/loglimiter.c src/shared/logconfig.c src/shared/logcommon.c
+src_tests_limiter_SOURCES = src/tests/limiter.c src/libdlog/loglimiter.c src/shared/logconfig.c src/shared/logcommon.c src/shared/parsers.c
 src_tests_limiter_CFLAGS = $(check_CFLAGS)
 src_tests_limiter_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=snprintf,--wrap=malloc,--wrap=time
 
-src_tests_dynamic_config_SOURCES = src/tests/dynamic_config.c src/libdlog/dynamic_config.c src/shared/logcommon.c src/shared/logconfig.c
+src_tests_dynamic_config_SOURCES = src/tests/dynamic_config.c src/libdlog/dynamic_config.c src/shared/logcommon.c src/shared/logconfig.c src/shared/parsers.c
 src_tests_dynamic_config_CFLAGS = $(check_CFLAGS) -pthread
 src_tests_dynamic_config_LDFLAGS = $(AM_LDFLAGS) -pthread -Wl,--wrap=read,--wrap=syslog_critical_failure,--wrap=inotify_init1,--wrap=inotify_add_watch,--wrap=log_config_read_file,--wrap=asprintf
 
@@ -222,11 +223,11 @@ src_tests_libdlog_pipe_SOURCES = src/tests/libdlog_pipe.c src/libdlog/log_pipe.c
 src_tests_libdlog_pipe_CFLAGS = $(check_CFLAGS)
 src_tests_libdlog_pipe_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=syslog_critical_failure,--wrap=connect,--wrap=write,--wrap=recv_pipe,--wrap=dup2,--wrap=socket
 
-src_tests_libdlog_android_SOURCES = src/tests/libdlog_android.c src/libdlog/log_android.c src/shared/logconfig.c src/shared/logcommon.c
+src_tests_libdlog_android_SOURCES = src/tests/libdlog_android.c src/libdlog/log_android.c src/shared/logconfig.c src/shared/logcommon.c src/shared/parsers.c
 src_tests_libdlog_android_CFLAGS = $(check_CFLAGS)
 src_tests_libdlog_android_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=logger_open_buffer_from_config,--wrap=close,--wrap=writev
 
-src_tests_libdlog_base_SOURCES = src/tests/libdlog_base.c src/libdlog/log.c src/shared/logcommon.c src/shared/logconfig.c
+src_tests_libdlog_base_SOURCES = src/tests/libdlog_base.c src/libdlog/log.c src/shared/logcommon.c src/shared/logconfig.c src/shared/parsers.c
 src_tests_libdlog_base_CFLAGS = $(check_CFLAGS)
 src_tests_libdlog_base_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=log_config_read,--wrap=snprintf
 
@@ -234,7 +235,7 @@ src_tests_queued_entry_SOURCES = src/tests/queued_entry.c src/shared/queued_entr
 src_tests_queued_entry_CFLAGS = $(check_CFLAGS)
 src_tests_queued_entry_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=clock_gettime
 
-src_tests_config_SOURCES = src/tests/config.c src/shared/logconfig.c src/shared/logcommon.c
+src_tests_config_SOURCES = src/tests/config.c src/shared/logconfig.c src/shared/logcommon.c src/shared/parsers.c
 src_tests_config_CFLAGS = $(check_CFLAGS)
 src_tests_config_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=openat,--wrap=scandirat,--wrap=fdopen,--wrap=open
 
index b49b1e5..fabfe87 100644 (file)
@@ -12,6 +12,8 @@
 #include <limits.h>
 #include <stdbool.h>
 
+#include "parsers.h"
+
 /**
  * @addtogroup SHARED_FUNCTIONS
  * @{
@@ -50,35 +52,6 @@ const char *log_config_get(const struct log_config *config, const char *key)
 }
 
 /**
- * @brief Convert decimal number string to int
- * @param[in] str string of decimal number
- * @param[out] num a place to store the result
- * @return 0 on success otherwise -errno
- * @see strtol(3)
- */
-static int str2num(const char *str, int *num)
-{
-       if (str == NULL)
-               return -EINVAL;
-
-       errno = 0; /* To distinguish success/failure after call */
-       char *endptr;
-       int val = strtol(str, &endptr, 10);
-
-       /* Check for various possible errors */
-       if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
-               || (errno != 0 && val == 0))
-               return -errno;
-
-       else if (endptr == str)
-               return -EINVAL; /* No digits were found */
-
-       /* If we got here, strtol() successfully parsed a number */
-       *num = val;
-       return 0;
-}
-
-/**
  * @brief Get a config value converted to int
  * @details Returns a value with the given key from the given config
  * @param[in] c The config to work with
@@ -90,7 +63,8 @@ static int str2num(const char *str, int *num)
 int log_config_get_int(const struct log_config *c, const char *key, int default_val)
 {
        int val = default_val;
-       return (str2num(log_config_get(c, key), &val) == 0 ? val : default_val);
+       const char *str = log_config_get(c, key);
+       return (str && parse_number(&str, &val) == 0) ? val : default_val;
 }
 
 /**
index e22e9ff..3248184 100644 (file)
@@ -35,11 +35,7 @@ int parse_number(const char **cursor, void *user_data)
        char *endptr;
        errno = 0;
        int val = strtol(*cursor, &endptr, 10);
-       if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
-               || (errno != 0 && val == 0)) {
-               return -EINVAL;
-       }
-       if (endptr == *cursor)
+       if (errno != 0 || endptr == *cursor)
                return -EINVAL;
 
        *cursor = endptr;