grub-devel
[Top][All Lists]
Advanced

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

[PATCH] Fix using freed memory for long option arguments


From: Pavel Roskin
Subject: [PATCH] Fix using freed memory for long option arguments
Date: Mon, 06 Jul 2009 19:43:31 -0400
User-agent: StGIT/0.14.3

ChangeLog:

        * lib/arg.c (find_long_option): Remove.
        (find_long): Add `len' argument, make `s' const char *.
        (grub_arg_parse): Parse long options in place, not in a
        temporary buffer.
---

 lib/arg.c |   37 ++++++++++---------------------------
 1 files changed, 10 insertions(+), 27 deletions(-)

diff --git a/lib/arg.c b/lib/arg.c
index e614048..5f649d0 100644
--- a/lib/arg.c
+++ b/lib/arg.c
@@ -76,21 +76,8 @@ find_short (const struct grub_arg_option *options, char c)
   return found;
 }
 
-static char *
-find_long_option (char *s)
-{
-  char *argpos = grub_strchr (s, '=');
-
-  if (argpos)
-    {
-      *argpos = '\0';
-      return ++argpos;
-    }
-  return 0;
-}
-
 static struct grub_arg_option *
-find_long (const struct grub_arg_option *options, char *s)
+find_long (const struct grub_arg_option *options, const char *s, int len)
 {
   struct grub_arg_option *found = 0;
   auto struct grub_arg_option *fnd_long (const struct grub_arg_option *opt);
@@ -99,7 +86,7 @@ find_long (const struct grub_arg_option *options, char *s)
     {
       while (opt->doc)
        {
-         if (opt->longarg && ! grub_strcmp (opt->longarg, s))
+         if (opt->longarg && ! grub_strncmp (opt->longarg, s, len))
            return (struct grub_arg_option *) opt;
          opt++;
        }
@@ -244,7 +231,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
                struct grub_arg_list *usr, char ***args, int *argnum)
 {
   int curarg;
-  char *longarg = 0;
+  int arglen;
   int complete = 0;
   char **argl = 0;
   int num = 0;
@@ -328,14 +315,14 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
              break;
            }
 
-         longarg = (char *) grub_strdup (arg);
-         if (! longarg)
-           goto fail;
+         option = grub_strchr (arg, '=');
+         if (option) {
+           arglen = option - arg - 2;
+           option++;
+         } else
+           arglen = grub_strlen (arg) - 2;
 
-         option = find_long_option (longarg);
-         arg = longarg;
-
-         opt = find_long (cmd->options, arg + 2);
+         opt = find_long (cmd->options, arg + 2, arglen);
          if (! opt)
            {
              grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown argument `%s'\n", 
arg);
@@ -402,8 +389,6 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
          if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
            goto fail;
        }
-      grub_free (longarg);
-      longarg = 0;
     }
 
   complete = 1;
@@ -412,7 +397,5 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
   *argnum = num;
 
  fail:
-  grub_free (longarg);
-
   return complete;
 }




reply via email to

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