aboutsummaryrefslogtreecommitdiffstats
path: root/src/ipaccess
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-04-06 20:01:43 +0700
committerHarald Welte <laforge@gnumonks.org>2019-04-08 07:30:45 +0000
commite94ce889f011b15f7f98b16ae4ddb2123c7c9b0f (patch)
treea152cdfa43b6eae6b1389ec44662b8316c321965 /src/ipaccess
parentc53ca915943e29207e40abc79f72ae6a16f3ed66 (diff)
ipaccess-config: use POSIX regex for Unit ID format check
Instead of counting digits and slashes of the IPA Unit ID manually, use POSIX regex functions, so the code is easier to maintain and read. As a bonus, this fixes CID#188854: variable 'remain_slash' was of type 'uint8_t', so it could never be lower than zero. Change-Id: Id613bf650833dd38eaad08fdfffdf8dbe2f002b1 Related: CID#188854 Unsigned integer overflow
Diffstat (limited to 'src/ipaccess')
-rw-r--r--src/ipaccess/ipaccess-config.c30
1 files changed, 9 insertions, 21 deletions
diff --git a/src/ipaccess/ipaccess-config.c b/src/ipaccess/ipaccess-config.c
index da19ce20a..54e4efd09 100644
--- a/src/ipaccess/ipaccess-config.c
+++ b/src/ipaccess/ipaccess-config.c
@@ -27,6 +27,7 @@
#include <getopt.h>
#include <errno.h>
#include <ctype.h>
+#include <regex.h>
#include <inttypes.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
@@ -842,33 +843,20 @@ static void analyze_firmware(const char *filename)
static bool check_unitid_fmt(const char* unit_id)
{
- const char *p = unit_id;
- bool must_digit = true;
- uint8_t remain_slash = 2;
+ regex_t regexp;
+ int rc;
if (strlen(unit_id) < 5)
goto wrong_fmt;
- while (*p != '\0') {
- if (*p != '/' && !isdigit(*p))
- goto wrong_fmt;
- if (*p == '/' && must_digit)
- goto wrong_fmt;
- if (*p == '/') {
- must_digit = true;
- remain_slash--;
- if (remain_slash < 0)
- goto wrong_fmt;
- } else {
- must_digit = false;
- }
- p++;
- }
+ rc = regcomp(&regexp, "^[0-9]+/[0-9]+/[0-9]+$", REG_EXTENDED | REG_NOSUB);
+ OSMO_ASSERT(!rc);
- if (*(p-1) == '/')
- goto wrong_fmt;
+ rc = regexec(&regexp, unit_id, 0, NULL, 0);
+ regfree(&regexp);
- return true;
+ if (rc == 0)
+ return true;
wrong_fmt:
fprintf(stderr, "ERROR: unit-id wrong format. Must be '\\d+/\\d+/\\d+'\n");