bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 2/6] procfs: keep old config values if the parsing fails


From: Justus Winter
Subject: [PATCH 2/6] procfs: keep old config values if the parsing fails
Date: Thu, 27 Jun 2013 14:31:24 +0200

Previously if strtol failed the previous configuration value would get
overwritten. Prevent this by storing the result in a temporary
variable and update the configuration if the argument was parsed
correctly and passed the sanity checks.

* procfs/main.c (argp_parser): Keep old configuration in case a
malformed value is encountered.
---
 procfs/main.c |   27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/procfs/main.c b/procfs/main.c
index e7f8574..f472f04 100644
--- a/procfs/main.c
+++ b/procfs/main.c
@@ -42,36 +42,45 @@ argp_parser (int key, char *arg, struct argp_state *state)
 {
   struct passwd *pw;
   char *endp;
+  long int v;
 
   switch (key)
   {
     case 'h':
-      opt_clk_tck = strtol (arg, &endp, 0);
-      if (*endp || ! *arg || opt_clk_tck <= 0)
+      v = strtol (arg, &endp, 0);
+      if (*endp || ! *arg || v <= 0)
        argp_error (state, "--clk-tck: HZ should be a positive integer");
+      else
+       opt_clk_tck = v;
       break;
 
     case 's':
-      opt_stat_mode = strtol (arg, &endp, 8);
-      if (*endp || ! *arg || opt_stat_mode & ~07777)
+      v = strtol (arg, &endp, 8);
+      if (*endp || ! *arg || (mode_t) v & ~07777)
        argp_error (state, "--stat-mode: MODE should be an octal mode");
+      else
+       opt_stat_mode = v;
       break;
 
     case 'S':
       if (arg)
         {
-         opt_fake_self = strtol (arg, &endp, 0);
+         v = strtol (arg, &endp, 0);
          if (*endp || ! *arg)
            argp_error (state, "--fake-self: PID must be an integer");
+         else
+           opt_fake_self = v;
        }
       else
        opt_fake_self = 1;
       break;
 
     case 'k':
-      opt_kernel_pid = strtol (arg, &endp, 0);
+      v = strtol (arg, &endp, 0);
       if (*endp || ! *arg || (signed) opt_kernel_pid < 0)
        argp_error (state, "--kernel-process: PID must be a positive integer");
+      else
+       opt_kernel_pid = v;
       break;
 
     case 'c':
@@ -88,10 +97,12 @@ argp_parser (int key, char *arg, struct argp_state *state)
          break;
        }
 
-      opt_anon_owner = strtol (arg, &endp, 0);
-      if (*endp || ! *arg || (signed) opt_anon_owner < 0)
+      v = strtol (arg, &endp, 0);
+      if (*endp || ! *arg || v < 0)
        argp_error (state, "--anonymous-owner: USER should be the "
                    "a user name or a numeric UID.");
+      else
+       opt_anon_owner = v;
       break;
   }
 
-- 
1.7.10.4




reply via email to

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