diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-07-30 14:56:38 +0200 |
---|---|---|
committer | pespin <pespin@sysmocom.de> | 2020-07-30 21:02:03 +0000 |
commit | 9fdc8715323a5ed621050c5541b9d7bd254c93c1 (patch) | |
tree | f309ce9f21f3ff6c71c87cd9c5fc24ab443f9501 | |
parent | d92be9ad13322268ec46073f4d271c4b34687dd7 (diff) |
vty: Allow 64 bit values in numeric ranges if system supports it
This fixes commands not being matched due to providing a range with more
than 10 digits.
The last case (passing -4000 matching 0-ULONG_MAX) shows a different bug
which will be fixed in next commit.
Change-Id: I0afa0caabffe36083c36b92ba90696ded00bb7be
-rw-r--r-- | src/vty/command.c | 28 | ||||
-rw-r--r-- | tests/vty/vty_test.c | 6 | ||||
-rw-r--r-- | tests/vty/vty_test.ok | 9 |
3 files changed, 31 insertions, 12 deletions
diff --git a/src/vty/command.c b/src/vty/command.c index 9b32d22d..16dd07fa 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -37,6 +37,7 @@ Boston, MA 02110-1301, USA. */ #include <unistd.h> #include <ctype.h> #include <time.h> +#include <limits.h> #include <sys/time.h> #include <sys/stat.h> @@ -1262,12 +1263,27 @@ static enum match_type cmd_ipv6_prefix_match(const char *str) #endif /* HAVE_IPV6 */ -#define DECIMAL_STRLEN_MAX 10 + +#if ULONG_MAX == 18446744073709551615UL +#define DECIMAL_STRLEN_MAX_UNSIGNED 20 +#elif ULONG_MAX == 4294967295UL +#define DECIMAL_STRLEN_MAX_UNSIGNED 10 +#else +#error "ULONG_MAX not defined!" +#endif + +#if LONG_MAX == 9223372036854775807L +#define DECIMAL_STRLEN_MAX_SIGNED 19 +#elif LONG_MAX == 2147483647L +#define DECIMAL_STRLEN_MAX_SIGNED 10 +#else +#error "LONG_MAX not defined!" +#endif static int cmd_range_match(const char *range, const char *str) { char *p; - char buf[DECIMAL_STRLEN_MAX + 1]; + char buf[DECIMAL_STRLEN_MAX_UNSIGNED + 1]; char *endptr = NULL; if (str == NULL) @@ -1284,7 +1300,7 @@ static int cmd_range_match(const char *range, const char *str) p = strchr(range, '-'); if (p == NULL) return 0; - if (p - range > DECIMAL_STRLEN_MAX) + if (p - range > DECIMAL_STRLEN_MAX_SIGNED) return 0; strncpy(buf, range, p - range); buf[p - range] = '\0'; @@ -1296,7 +1312,7 @@ static int cmd_range_match(const char *range, const char *str) p = strchr(range, '>'); if (p == NULL) return 0; - if (p - range > DECIMAL_STRLEN_MAX) + if (p - range > DECIMAL_STRLEN_MAX_SIGNED) return 0; strncpy(buf, range, p - range); buf[p - range] = '\0'; @@ -1317,7 +1333,7 @@ static int cmd_range_match(const char *range, const char *str) p = strchr(range, '-'); if (p == NULL) return 0; - if (p - range > DECIMAL_STRLEN_MAX) + if (p - range > DECIMAL_STRLEN_MAX_UNSIGNED) return 0; strncpy(buf, range, p - range); buf[p - range] = '\0'; @@ -1329,7 +1345,7 @@ static int cmd_range_match(const char *range, const char *str) p = strchr(range, '>'); if (p == NULL) return 0; - if (p - range > DECIMAL_STRLEN_MAX) + if (p - range > DECIMAL_STRLEN_MAX_UNSIGNED) return 0; strncpy(buf, range, p - range); buf[p - range] = '\0'; diff --git a/tests/vty/vty_test.c b/tests/vty/vty_test.c index 7146a1db..a7aef11a 100644 --- a/tests/vty/vty_test.c +++ b/tests/vty/vty_test.c @@ -506,9 +506,9 @@ void test_numeric_range() printf("Going to test test_numeric_range()\n"); vty = create_test_vty(&test); - OSMO_ASSERT(do_vty_command(vty, "numeric-range 0") == CMD_ERR_NO_MATCH); - OSMO_ASSERT(do_vty_command(vty, "numeric-range 40000") == CMD_ERR_NO_MATCH); - OSMO_ASSERT(do_vty_command(vty, "numeric-range -400000") == CMD_ERR_NO_MATCH); + OSMO_ASSERT(do_vty_command(vty, "numeric-range 0") == CMD_SUCCESS); + OSMO_ASSERT(do_vty_command(vty, "numeric-range 40000") == CMD_SUCCESS); + OSMO_ASSERT(do_vty_command(vty, "numeric-range -400000") == CMD_SUCCESS); destroy_test_vty(&test, vty); } diff --git a/tests/vty/vty_test.ok b/tests/vty/vty_test.ok index d81c6c72..bac083d6 100644 --- a/tests/vty/vty_test.ok +++ b/tests/vty/vty_test.ok @@ -313,9 +313,12 @@ Called: 'ambiguous_str ARG keyword' Returned: 0, Current node: 1 '%s> ' Going to test test_numeric_range() Going to execute 'numeric-range 0' -Returned: 2, Current node: 1 '%s> ' +Called: 'return-success' +Returned: 0, Current node: 1 '%s> ' Going to execute 'numeric-range 40000' -Returned: 2, Current node: 1 '%s> ' +Called: 'return-success' +Returned: 0, Current node: 1 '%s> ' Going to execute 'numeric-range -400000' -Returned: 2, Current node: 1 '%s> ' +Called: 'return-success' +Returned: 0, Current node: 1 '%s> ' All tests passed |