xref: /OK3568_Linux_fs/buildroot/boot/grub2/0128-kern-parser-Introduce-process_char-helper.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunFrom b1c9e9e889e4273fb15712051c887e6078511448 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Chris Coulson <chris.coulson@canonical.com>
3*4882a593SmuzhiyunDate: Tue, 5 Jan 2021 22:17:28 +0000
4*4882a593SmuzhiyunSubject: [PATCH] kern/parser: Introduce process_char() helper
5*4882a593Smuzhiyun
6*4882a593Smuzhiyungrub_parser_split_cmdline() iterates over each command line character.
7*4882a593SmuzhiyunIn order to add error checking and to simplify the subsequent error
8*4882a593Smuzhiyunhandling, split the character processing in to a separate function.
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 | 74 ++++++++++++++++++++++++++++++-------------------
15*4882a593Smuzhiyun 1 file changed, 46 insertions(+), 28 deletions(-)
16*4882a593Smuzhiyun
17*4882a593Smuzhiyundiff --git a/grub-core/kern/parser.c b/grub-core/kern/parser.c
18*4882a593Smuzhiyunindex 39e4df6..0d3582b 100644
19*4882a593Smuzhiyun--- a/grub-core/kern/parser.c
20*4882a593Smuzhiyun+++ b/grub-core/kern/parser.c
21*4882a593Smuzhiyun@@ -1,7 +1,7 @@
22*4882a593Smuzhiyun /* parser.c - the part of the parser that can return partial tokens */
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun  *  GRUB  --  GRand Unified Bootloader
25*4882a593Smuzhiyun- *  Copyright (C) 2005,2007,2009  Free Software Foundation, Inc.
26*4882a593Smuzhiyun+ *  Copyright (C) 2005,2007,2009,2021  Free Software Foundation, Inc.
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  *  GRUB is free software: you can redistribute it and/or modify
29*4882a593Smuzhiyun  *  it under the terms of the GNU General Public License as published by
30*4882a593Smuzhiyun@@ -129,6 +129,46 @@ add_var (char *varname, char **bp, char **vp,
31*4882a593Smuzhiyun     *((*bp)++) = *val;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun+static grub_err_t
35*4882a593Smuzhiyun+process_char (char c, char *buffer, char **bp, char *varname, char **vp,
36*4882a593Smuzhiyun+	      grub_parser_state_t state, int *argc,
37*4882a593Smuzhiyun+	      grub_parser_state_t *newstate)
38*4882a593Smuzhiyun+{
39*4882a593Smuzhiyun+  char use;
40*4882a593Smuzhiyun+
41*4882a593Smuzhiyun+  *newstate = grub_parser_cmdline_state (state, c, &use);
42*4882a593Smuzhiyun+
43*4882a593Smuzhiyun+  /*
44*4882a593Smuzhiyun+   * If a variable was being processed and this character does
45*4882a593Smuzhiyun+   * not describe the variable anymore, write the variable to
46*4882a593Smuzhiyun+   * the buffer.
47*4882a593Smuzhiyun+   */
48*4882a593Smuzhiyun+  add_var (varname, bp, vp, state, *newstate);
49*4882a593Smuzhiyun+
50*4882a593Smuzhiyun+  if (check_varstate (*newstate))
51*4882a593Smuzhiyun+    {
52*4882a593Smuzhiyun+      if (use)
53*4882a593Smuzhiyun+	*((*vp)++) = use;
54*4882a593Smuzhiyun+    }
55*4882a593Smuzhiyun+  else if (*newstate == GRUB_PARSER_STATE_TEXT &&
56*4882a593Smuzhiyun+	   state != GRUB_PARSER_STATE_ESC && grub_isspace (use))
57*4882a593Smuzhiyun+    {
58*4882a593Smuzhiyun+      /*
59*4882a593Smuzhiyun+       * Don't add more than one argument if multiple
60*4882a593Smuzhiyun+       * spaces are used.
61*4882a593Smuzhiyun+       */
62*4882a593Smuzhiyun+      if (*bp != buffer && *((*bp) - 1) != '\0')
63*4882a593Smuzhiyun+	{
64*4882a593Smuzhiyun+	  *((*bp)++) = '\0';
65*4882a593Smuzhiyun+	  (*argc)++;
66*4882a593Smuzhiyun+	}
67*4882a593Smuzhiyun+    }
68*4882a593Smuzhiyun+  else if (use)
69*4882a593Smuzhiyun+    *((*bp)++) = use;
70*4882a593Smuzhiyun+
71*4882a593Smuzhiyun+  return GRUB_ERR_NONE;
72*4882a593Smuzhiyun+}
73*4882a593Smuzhiyun+
74*4882a593Smuzhiyun grub_err_t
75*4882a593Smuzhiyun grub_parser_split_cmdline (const char *cmdline,
76*4882a593Smuzhiyun 			   grub_reader_getline_t getline, void *getline_data,
77*4882a593Smuzhiyun@@ -172,35 +212,13 @@ grub_parser_split_cmdline (const char *cmdline,
78*4882a593Smuzhiyun       for (; *rp != '\0'; rp++)
79*4882a593Smuzhiyun 	{
80*4882a593Smuzhiyun 	  grub_parser_state_t newstate;
81*4882a593Smuzhiyun-	  char use;
82*4882a593Smuzhiyun-
83*4882a593Smuzhiyun-	  newstate = grub_parser_cmdline_state (state, *rp, &use);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun-	  /* If a variable was being processed and this character does
86*4882a593Smuzhiyun-	     not describe the variable anymore, write the variable to
87*4882a593Smuzhiyun-	     the buffer.  */
88*4882a593Smuzhiyun-	  add_var (varname, &bp, &vp, state, newstate);
89*4882a593Smuzhiyun-
90*4882a593Smuzhiyun-	  if (check_varstate (newstate))
91*4882a593Smuzhiyun-	    {
92*4882a593Smuzhiyun-	      if (use)
93*4882a593Smuzhiyun-		*(vp++) = use;
94*4882a593Smuzhiyun-	    }
95*4882a593Smuzhiyun-	  else
96*4882a593Smuzhiyun+	  if (process_char (*rp, buffer, &bp, varname, &vp, state, argc,
97*4882a593Smuzhiyun+			    &newstate) != GRUB_ERR_NONE)
98*4882a593Smuzhiyun 	    {
99*4882a593Smuzhiyun-	      if (newstate == GRUB_PARSER_STATE_TEXT
100*4882a593Smuzhiyun-		  && state != GRUB_PARSER_STATE_ESC && grub_isspace (use))
101*4882a593Smuzhiyun-		{
102*4882a593Smuzhiyun-		  /* Don't add more than one argument if multiple
103*4882a593Smuzhiyun-		     spaces are used.  */
104*4882a593Smuzhiyun-		  if (bp != buffer && *(bp - 1))
105*4882a593Smuzhiyun-		    {
106*4882a593Smuzhiyun-		      *(bp++) = '\0';
107*4882a593Smuzhiyun-		      (*argc)++;
108*4882a593Smuzhiyun-		    }
109*4882a593Smuzhiyun-		}
110*4882a593Smuzhiyun-	      else if (use)
111*4882a593Smuzhiyun-		*(bp++) = use;
112*4882a593Smuzhiyun+	      if (rd != cmdline)
113*4882a593Smuzhiyun+		grub_free (rd);
114*4882a593Smuzhiyun+	      return grub_errno;
115*4882a593Smuzhiyun 	    }
116*4882a593Smuzhiyun 	  state = newstate;
117*4882a593Smuzhiyun 	}
118*4882a593Smuzhiyun--
119*4882a593Smuzhiyun2.14.2
120*4882a593Smuzhiyun
121