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