settings: Use strtoul(3) for settings to int conversion
authorThomas Egerer <thomas.egerer@secunet.com>
Wed, 25 Mar 2020 17:01:37 +0000 (18:01 +0100)
committerTobias Brunner <tobias@strongswan.org>
Thu, 26 Mar 2020 14:26:59 +0000 (15:26 +0100)
strtol(3) accepts values in the range of [LONG_MIN;LONG_MAX].  Based
on the architecture (32 or 64 bits), these values expand to either
0x8000000000000000/0x7fffffffffffffff for 64-bit builds, or
0x80000000/0x7fffffff for 32-bit builds.

The behavior when retrieving non-default values for charon.spi_min or
charon.spi_max, for example, depends on the architecture of the target
platform.  While 0xC000001/0xCFFFFFFE work fine on a 64-bit build, on a
32-bit build, due to the use of strtol(3), an ERANGE causes get_int()
to return the default values.

By using strtoul(3) the default is only returned if the input value
exceeds 32 or 64 bits, based on the platform.  Negative values are still
parsed correctly.

Signed-off-by: Thomas Egerer <thomas.egerer@secunet.com>
src/libstrongswan/settings/settings.c

index 44d035f..b67b00e 100644 (file)
@@ -611,7 +611,7 @@ inline int settings_value_as_int(char *value, int def)
                {       /* manually detect 0x prefix as we want to avoid octal encoding */
                        base = 16;
                }
-               intval = strtol(value, &end, base);
+               intval = strtoul(value, &end, base);
                if (errno == 0 && *end == 0 && end != value)
                {
                        return intval;