From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1MyQ2h-0004Ab-0q for mharc-grub-devel@gnu.org; Thu, 15 Oct 2009 09:06:55 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MyQ2e-0004A7-8T for grub-devel@gnu.org; Thu, 15 Oct 2009 09:06:52 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MyQ2Y-00049X-Fv for grub-devel@gnu.org; Thu, 15 Oct 2009 09:06:50 -0400 Received: from [199.232.76.173] (port=45164 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MyQ2Y-00049U-A1 for grub-devel@gnu.org; Thu, 15 Oct 2009 09:06:46 -0400 Received: from fg-out-1718.google.com ([72.14.220.156]:51546) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MyQ2X-0006rJ-AP for grub-devel@gnu.org; Thu, 15 Oct 2009 09:06:45 -0400 Received: by fg-out-1718.google.com with SMTP id e21so827507fga.12 for ; Thu, 15 Oct 2009 06:06:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:content-type; bh=T9o1rnGJDmGv/2KJ5HzBXeJgKtcFieltFPAlC6erKcI=; b=qCXevNtwffJ0wZmuOIjYG54hH/lu/usyOyVbgYLjKlXIoLtFCUycm10FF4CaZ0MlKm nno2fZUT/oiqwYceFwOBf1CZNVtAE2tdUouVlZ4/xk9kj+M+hT7Ybqpw7bHHhx7a9g9E wFNEsbeWgpFVkQleJ/pWhy3Nd5yobIXnufJrI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; b=RdgyImdreF7vFqWetftwgx9ysD29v0RImUBwUwVlBNs+SKaZX2QE4Jmns9dxB4Il5N KmOgido06K0TcM12ZH7fBqopGxgNwjC2iThtA+AVM1jEm+okQ6IYRBzk1ezMVEs/iQxx mmz6jG8/CRz4BZ5xqH+9TChWrxFZffo2wFXfc= Received: by 10.86.249.22 with SMTP id w22mr182708fgh.1.1255612004302; Thu, 15 Oct 2009 06:06:44 -0700 (PDT) Received: from debian.bg45.phnet (hpx-public-dock-127-dhcp.ethz.ch [82.130.83.127]) by mx.google.com with ESMTPS id l12sm2294223fgb.22.2009.10.15.06.06.43 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 15 Oct 2009 06:06:43 -0700 (PDT) Message-ID: <4AD71E62.1010102@gmail.com> Date: Thu, 15 Oct 2009 15:06:42 +0200 From: Vladimir 'phcoder' Serbinenko User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090701) MIME-Version: 1.0 To: The development of GRUB 2 Content-Type: multipart/mixed; boundary="------------030703040608020304070403" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [BUGFIX] Fix rescue parser X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Oct 2009 13:06:52 -0000 This is a multi-part message in MIME format. --------------030703040608020304070403 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit -- Regards Vladimir 'phcoder' Serbinenko Personal git repository: http://repo.or.cz/w/grub2/phcoder.git --------------030703040608020304070403 Content-Type: text/x-patch; name="parres.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="parres.diff" diff --git a/ChangeLog b/ChangeLog index b0864a9..55bdc92 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-10-15 Vladimir Serbinenko + * kern/parser.c (grub_parser_split_cmdline): Fix incorrect counting + of arguments. Return number of tokens and not arguments. All users + updated. + +2009-10-15 Vladimir Serbinenko + * loader/i386/pc/xnu.c (grub_xnu_set_video): Fix loading splash image. 2009-10-15 Vladimir Serbinenko diff --git a/kern/parser.c b/kern/parser.c index db59af0..006d67d 100644 --- a/kern/parser.c +++ b/kern/parser.c @@ -142,7 +142,7 @@ grub_parser_split_cmdline (const char *cmdline, grub_reader_getline_t getline, *(bp++) = *val; } - *argc = 1; + *argc = 0; do { if (! *rd) @@ -188,12 +188,16 @@ grub_parser_split_cmdline (const char *cmdline, grub_reader_getline_t getline, state = newstate; } } while (state != GRUB_PARSER_STATE_TEXT && !check_varstate (state)); - *(bp++) = '\0'; /* A special case for when the last character was part of a variable. */ add_var (GRUB_PARSER_STATE_TEXT); + if (bp != buffer && *(bp - 1)) + { + *(bp++) = '\0'; + (*argc)++; + } /* Reserve memory for the return values. */ args = grub_malloc (bp - buffer); @@ -219,8 +223,6 @@ grub_parser_split_cmdline (const char *cmdline, grub_reader_getline_t getline, bp++; } - (*argc)--; - return 0; } diff --git a/kern/rescue_parser.c b/kern/rescue_parser.c index 1e0841e..d3725e7 100644 --- a/kern/rescue_parser.c +++ b/kern/rescue_parser.c @@ -35,9 +35,12 @@ grub_rescue_parse_line (char *line, grub_reader_getline_t getline) if (grub_parser_split_cmdline (line, getline, &n, &args) || n < 0) return grub_errno; + if (n == 0) + return GRUB_ERR_NONE; + /* In case of an assignment set the environment accordingly instead of calling a function. */ - if (n == 0 && grub_strchr (line, '=')) + if (n == 1 && grub_strchr (line, '=')) { char *val = grub_strchr (args[0], '='); val[0] = 0; @@ -56,7 +59,7 @@ grub_rescue_parse_line (char *line, grub_reader_getline_t getline) cmd = grub_command_find (name); if (cmd) { - (cmd->func) (cmd, n, &args[1]); + (cmd->func) (cmd, n - 1, &args[1]); } else { diff --git a/normal/completion.c b/normal/completion.c index 4b38e33..d264028 100644 --- a/normal/completion.c +++ b/normal/completion.c @@ -409,13 +409,16 @@ grub_normal_do_completion (char *buf, int *restore, if (grub_parser_split_cmdline (buf, 0, &argc, &argv)) return 0; - current_word = argv[argc]; + if (argc == 0) + current_word = ""; + else + current_word = argv[argc - 1]; /* Determine the state the command line is in, depending on the state, it can be determined how to complete. */ cmdline_state = get_state (buf); - if (argc == 0) + if (argc == 1 || argc == 0) { /* Complete a command. */ if (grub_command_iterate (iterate_command)) @@ -485,13 +488,15 @@ grub_normal_do_completion (char *buf, int *restore, goto fail; } - grub_free (argv[0]); + if (argc != 0) + grub_free (argv[0]); grub_free (match); return ret; } fail: - grub_free (argv[0]); + if (argc != 0) + grub_free (argv[0]); grub_free (match); grub_errno = GRUB_ERR_NONE; --------------030703040608020304070403--