bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] pci-arbiter: Fix bug on option parsing.


From: Joan Lledó
Subject: [PATCH] pci-arbiter: Fix bug on option parsing.
Date: Sat, 11 Apr 2020 13:37:19 +0200 (CEST)

From: Joan Lledó <jlledom@member.fsf.org>

A misuse of strtol() caused wrong parameters to be interpreted as '0'

* pci-arbiter/options.c:
        * New function parse_number() to handle wrong input
        * Call parse_number() from all places where strtol was being called
---
 pci-arbiter/options.c | 58 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 48 insertions(+), 10 deletions(-)

diff --git a/pci-arbiter/options.c b/pci-arbiter/options.c
index 2023fd9e..5767ad27 100644
--- a/pci-arbiter/options.c
+++ b/pci-arbiter/options.c
@@ -89,6 +89,24 @@ check_options_validity (struct parse_hook *h)
   return 0;
 }
 
+static long int
+parse_number (const char *s)
+{
+  long int val;
+  char *endptr;
+
+  errno = 0;
+  val = strtol (s, &endptr, 16);
+
+  if (*endptr != '\0' || errno)
+    {
+      val = -1;
+      errno = EINVAL;
+    }
+
+  return val;
+}
+
 /* Option parser */
 static error_t
 parse_opt (int opt, char *arg, struct argp_state *state)
@@ -126,25 +144,37 @@ parse_opt (int opt, char *arg, struct argp_state *state)
   switch (opt)
     {
     case 'C':
-      h->curset->d_class = strtol (arg, 0, 16);
+      h->curset->d_class = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid class");
       break;
     case 'c':
-      h->curset->d_subclass = strtol (arg, 0, 16);
+      h->curset->d_subclass = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid subclass");
       break;
     case 'd':
-      h->curset->domain = strtol (arg, 0, 16);
+      h->curset->domain = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid domain");
       break;
     case 'b':
       if (h->curset->domain < 0)
        h->curset->domain = 0;
 
-      h->curset->bus = strtol (arg, 0, 16);
+      h->curset->bus = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid bus");
       break;
     case 's':
-      h->curset->dev = strtol (arg, 0, 16);
+      h->curset->dev = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid slot");
       break;
     case 'f':
-      h->curset->func = strtol (arg, 0, 16);
+      h->curset->func = parse_number (arg);
+      if (errno)
+       PERR (errno, "Invalid function");
       break;
     case 'D':
       err =
@@ -163,25 +193,33 @@ parse_opt (int opt, char *arg, struct argp_state *state)
              strncpy (regex_group_val, "0000", 5);
            }
 
-         h->curset->domain = strtol (regex_group_val, 0, 16);
+         h->curset->domain = parse_number (regex_group_val);
+         if (errno)
+           PERR (errno, "Invalid domain");
 
          // Bus
          strncpy (regex_group_val, arg + slot_regex_groups[3].rm_so, 2);
          regex_group_val[2] = 0;
 
-         h->curset->bus = strtol (regex_group_val, 0, 16);
+         h->curset->bus = parse_number (regex_group_val);
+         if (errno)
+           PERR (errno, "Invalid bus");
 
          // Dev
          strncpy (regex_group_val, arg + slot_regex_groups[4].rm_so, 2);
          regex_group_val[2] = 0;
 
-         h->curset->dev = strtol (regex_group_val, 0, 16);
+         h->curset->dev = parse_number (regex_group_val);
+         if (errno)
+           PERR (errno, "Invalid slot");
 
          // Func
          regex_group_val[0] = arg[slot_regex_groups[5].rm_so];
          regex_group_val[1] = 0;
 
-         h->curset->func = strtol (regex_group_val, 0, 16);
+         h->curset->func = parse_number (regex_group_val);
+         if (errno)
+           PERR (errno, "Invalid func");
        }
       else
        {
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]