<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/19457">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: Allow 64 bit values in numeric ranges if system supports it<br><br>This fixes commands not being matched due to providing a range with more<br>than 10 digits.<br><br>The last case (passing -4000 matching 0-ULONG_MAX) shows a different bug<br>which will be fixed in next commit.<br><br>Change-Id: I0afa0caabffe36083c36b92ba90696ded00bb7be<br>---<br>M src/vty/command.c<br>M tests/vty/vty_test.c<br>M tests/vty/vty_test.ok<br>3 files changed, 31 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/57/19457/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/vty/command.c b/src/vty/command.c</span><br><span>index 9b32d22..16dd07f 100644</span><br><span>--- a/src/vty/command.c</span><br><span>+++ b/src/vty/command.c</span><br><span>@@ -37,6 +37,7 @@</span><br><span> #include <unistd.h></span><br><span> #include <ctype.h></span><br><span> #include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> #include <sys/time.h></span><br><span> #include <sys/stat.h></span><br><span> </span><br><span>@@ -1262,12 +1263,27 @@</span><br><span> </span><br><span> #endif                             /* HAVE_IPV6  */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define DECIMAL_STRLEN_MAX 10</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if ULONG_MAX == 18446744073709551615UL</span><br><span style="color: hsl(120, 100%, 40%);">+#define DECIMAL_STRLEN_MAX_UNSIGNED 20</span><br><span style="color: hsl(120, 100%, 40%);">+#elif ULONG_MAX == 4294967295UL</span><br><span style="color: hsl(120, 100%, 40%);">+#define DECIMAL_STRLEN_MAX_UNSIGNED 10</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#error "ULONG_MAX not defined!"</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if LONG_MAX == 9223372036854775807L</span><br><span style="color: hsl(120, 100%, 40%);">+#define DECIMAL_STRLEN_MAX_SIGNED 19</span><br><span style="color: hsl(120, 100%, 40%);">+#elif LONG_MAX == 2147483647L</span><br><span style="color: hsl(120, 100%, 40%);">+#define DECIMAL_STRLEN_MAX_SIGNED 10</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#error "LONG_MAX not defined!"</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> static int cmd_range_match(const char *range, const char *str)</span><br><span> {</span><br><span>       char *p;</span><br><span style="color: hsl(0, 100%, 40%);">-        char buf[DECIMAL_STRLEN_MAX + 1];</span><br><span style="color: hsl(120, 100%, 40%);">+     char buf[DECIMAL_STRLEN_MAX_UNSIGNED + 1];</span><br><span>   char *endptr = NULL;</span><br><span> </span><br><span>     if (str == NULL)</span><br><span>@@ -1284,7 +1300,7 @@</span><br><span>             p = strchr(range, '-');</span><br><span>              if (p == NULL)</span><br><span>                       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (p - range > DECIMAL_STRLEN_MAX)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (p - range > DECIMAL_STRLEN_MAX_SIGNED)</span><br><span>                        return 0;</span><br><span>            strncpy(buf, range, p - range);</span><br><span>              buf[p - range] = '\0';</span><br><span>@@ -1296,7 +1312,7 @@</span><br><span>               p = strchr(range, '>');</span><br><span>           if (p == NULL)</span><br><span>                       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (p - range > DECIMAL_STRLEN_MAX)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (p - range > DECIMAL_STRLEN_MAX_SIGNED)</span><br><span>                        return 0;</span><br><span>            strncpy(buf, range, p - range);</span><br><span>              buf[p - range] = '\0';</span><br><span>@@ -1317,7 +1333,7 @@</span><br><span>               p = strchr(range, '-');</span><br><span>              if (p == NULL)</span><br><span>                       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (p - range > DECIMAL_STRLEN_MAX)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (p - range > DECIMAL_STRLEN_MAX_UNSIGNED)</span><br><span>                      return 0;</span><br><span>            strncpy(buf, range, p - range);</span><br><span>              buf[p - range] = '\0';</span><br><span>@@ -1329,7 +1345,7 @@</span><br><span>               p = strchr(range, '>');</span><br><span>           if (p == NULL)</span><br><span>                       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (p - range > DECIMAL_STRLEN_MAX)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (p - range > DECIMAL_STRLEN_MAX_UNSIGNED)</span><br><span>                      return 0;</span><br><span>            strncpy(buf, range, p - range);</span><br><span>              buf[p - range] = '\0';</span><br><span>diff --git a/tests/vty/vty_test.c b/tests/vty/vty_test.c</span><br><span>index 7146a1d..a7aef11 100644</span><br><span>--- a/tests/vty/vty_test.c</span><br><span>+++ b/tests/vty/vty_test.c</span><br><span>@@ -506,9 +506,9 @@</span><br><span>    printf("Going to test test_numeric_range()\n");</span><br><span>    vty = create_test_vty(&test);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(do_vty_command(vty, "numeric-range 0") == CMD_ERR_NO_MATCH);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(do_vty_command(vty, "numeric-range 40000") == CMD_ERR_NO_MATCH);</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(do_vty_command(vty, "numeric-range -400000") == CMD_ERR_NO_MATCH);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(do_vty_command(vty, "numeric-range 0") == CMD_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(do_vty_command(vty, "numeric-range 40000") == CMD_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(do_vty_command(vty, "numeric-range -400000") == CMD_SUCCESS);</span><br><span> </span><br><span>      destroy_test_vty(&test, vty);</span><br><span> }</span><br><span>diff --git a/tests/vty/vty_test.ok b/tests/vty/vty_test.ok</span><br><span>index d81c6c7..bac083d 100644</span><br><span>--- a/tests/vty/vty_test.ok</span><br><span>+++ b/tests/vty/vty_test.ok</span><br><span>@@ -313,9 +313,12 @@</span><br><span> Returned: 0, Current node: 1 '%s> '</span><br><span> Going to test test_numeric_range()</span><br><span> Going to execute 'numeric-range 0'</span><br><span style="color: hsl(0, 100%, 40%);">-Returned: 2, Current node: 1 '%s> '</span><br><span style="color: hsl(120, 100%, 40%);">+Called: 'return-success'</span><br><span style="color: hsl(120, 100%, 40%);">+Returned: 0, Current node: 1 '%s> '</span><br><span> Going to execute 'numeric-range 40000'</span><br><span style="color: hsl(0, 100%, 40%);">-Returned: 2, Current node: 1 '%s> '</span><br><span style="color: hsl(120, 100%, 40%);">+Called: 'return-success'</span><br><span style="color: hsl(120, 100%, 40%);">+Returned: 0, Current node: 1 '%s> '</span><br><span> Going to execute 'numeric-range -400000'</span><br><span style="color: hsl(0, 100%, 40%);">-Returned: 2, Current node: 1 '%s> '</span><br><span style="color: hsl(120, 100%, 40%);">+Called: 'return-success'</span><br><span style="color: hsl(120, 100%, 40%);">+Returned: 0, Current node: 1 '%s> '</span><br><span> All tests passed</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/19457">change 19457</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/19457"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0afa0caabffe36083c36b92ba90696ded00bb7be </div>
<div style="display:none"> Gerrit-Change-Number: 19457 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>