1*4882a593SmuzhiyunFrom 8bc817014ce3d7a498db44eae33c8b90e2430926 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Chris Coulson <chris.coulson@canonical.com>
3*4882a593SmuzhiyunDate: Wed, 6 Jan 2021 13:54:26 +0000
4*4882a593SmuzhiyunSubject: [PATCH] kern/parser: Refactor grub_parser_split_cmdline() cleanup
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunIntroduce a common function epilogue used for cleaning up on all
7*4882a593Smuzhiyunreturn paths, which will simplify additional error handling to be
8*4882a593Smuzhiyunintroduced in a subsequent commit.
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunSigned-off-by: Chris Coulson <chris.coulson@canonical.com>
11*4882a593SmuzhiyunReviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
12*4882a593SmuzhiyunSigned-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
13*4882a593Smuzhiyun---
14*4882a593Smuzhiyun grub-core/kern/parser.c | 35 ++++++++++++++++++++---------------
15*4882a593Smuzhiyun 1 file changed, 20 insertions(+), 15 deletions(-)
16*4882a593Smuzhiyun
17*4882a593Smuzhiyundiff --git a/grub-core/kern/parser.c b/grub-core/kern/parser.c
18*4882a593Smuzhiyunindex 572c670..e010eaa 100644
19*4882a593Smuzhiyun--- a/grub-core/kern/parser.c
20*4882a593Smuzhiyun+++ b/grub-core/kern/parser.c
21*4882a593Smuzhiyun@@ -221,19 +221,13 @@ grub_parser_split_cmdline (const char *cmdline,
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun 	  if (process_char (*rp, buffer, &bp, varname, &vp, state, argc,
24*4882a593Smuzhiyun 			    &newstate) != GRUB_ERR_NONE)
25*4882a593Smuzhiyun-	    {
26*4882a593Smuzhiyun-	      if (rd != cmdline)
27*4882a593Smuzhiyun-		grub_free (rd);
28*4882a593Smuzhiyun-	      return grub_errno;
29*4882a593Smuzhiyun-	    }
30*4882a593Smuzhiyun+	    goto fail;
31*4882a593Smuzhiyun+
32*4882a593Smuzhiyun 	  state = newstate;
33*4882a593Smuzhiyun 	}
34*4882a593Smuzhiyun     }
35*4882a593Smuzhiyun   while (state != GRUB_PARSER_STATE_TEXT && !check_varstate (state));
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun-  if (rd != cmdline)
38*4882a593Smuzhiyun-    grub_free (rd);
39*4882a593Smuzhiyun-
40*4882a593Smuzhiyun   /* A special case for when the last character was part of a
41*4882a593Smuzhiyun      variable.  */
42*4882a593Smuzhiyun   add_var (varname, &bp, &vp, state, GRUB_PARSER_STATE_TEXT);
43*4882a593Smuzhiyun@@ -243,20 +237,20 @@ grub_parser_split_cmdline (const char *cmdline,
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun   /* If there are no args, then we're done. */
46*4882a593Smuzhiyun   if (!*argc)
47*4882a593Smuzhiyun-    return 0;
48*4882a593Smuzhiyun+    {
49*4882a593Smuzhiyun+      grub_errno = GRUB_ERR_NONE;
50*4882a593Smuzhiyun+      goto out;
51*4882a593Smuzhiyun+    }
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun   /* Reserve memory for the return values.  */
54*4882a593Smuzhiyun   args = grub_malloc (bp - buffer);
55*4882a593Smuzhiyun   if (!args)
56*4882a593Smuzhiyun-    return grub_errno;
57*4882a593Smuzhiyun+    goto fail;
58*4882a593Smuzhiyun   grub_memcpy (args, buffer, bp - buffer);
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun   *argv = grub_calloc (*argc + 1, sizeof (char *));
61*4882a593Smuzhiyun   if (!*argv)
62*4882a593Smuzhiyun-    {
63*4882a593Smuzhiyun-      grub_free (args);
64*4882a593Smuzhiyun-      return grub_errno;
65*4882a593Smuzhiyun-    }
66*4882a593Smuzhiyun+    goto fail;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun   /* The arguments are separated with 0's, setup argv so it points to
69*4882a593Smuzhiyun      the right values.  */
70*4882a593Smuzhiyun@@ -269,7 +263,18 @@ grub_parser_split_cmdline (const char *cmdline,
71*4882a593Smuzhiyun       bp++;
72*4882a593Smuzhiyun     }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun-  return 0;
75*4882a593Smuzhiyun+  grub_errno = GRUB_ERR_NONE;
76*4882a593Smuzhiyun+
77*4882a593Smuzhiyun+ out:
78*4882a593Smuzhiyun+  if (rd != cmdline)
79*4882a593Smuzhiyun+    grub_free (rd);
80*4882a593Smuzhiyun+
81*4882a593Smuzhiyun+  return grub_errno;
82*4882a593Smuzhiyun+
83*4882a593Smuzhiyun+ fail:
84*4882a593Smuzhiyun+  grub_free (*argv);
85*4882a593Smuzhiyun+  grub_free (args);
86*4882a593Smuzhiyun+  goto out;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /* Helper for grub_parser_execute.  */
90*4882a593Smuzhiyun--
91*4882a593Smuzhiyun2.14.2
92*4882a593Smuzhiyun
93