All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Hansen <dave@sr71.net>
To: x86@kernel.org
Cc: linux-kernel@vger.kernel.org, Dave Hansen <dave@sr71.net>,
	dave.hansen@linux.intel.com, bp@suse.de, hpa@zytor.com,
	fenghua.yu@intel.com, yu-cheng.yu@intel.com
Subject: [PATCH 2/5] x86: fix early command-line parsing, when partial word match
Date: Tue, 22 Dec 2015 14:52:39 -0800	[thread overview]
Message-ID: <20151222225239.8E1DCA58@viggo.jf.intel.com> (raw)
In-Reply-To: <20151222225237.08CDE5F1@viggo.jf.intel.com>


From: Dave Hansen <dave.hansen@linux.intel.com>

cmdline_find_option_bool() keeps track of position in two strings:
1. the command-line
2. the option we are searchign for in the command-line

We plow through each character in the command-line one at a time,
always moving forward.  We move forward in the option ('opptr')
when we match characters in 'cmdline'.  We reset the 'opptr' only
when we go in to the 'st_wordstart' state.

But, if we fail to match an option because we see a space (
state=st_wordcmp, *opptr='\0',c=' '), we set state='st_wordskip'
and 'break', moving to the next character.  But, that move to
the next character is the one *after* the ' '.  This means that
we will miss a 'st_wordstart' state.

For instance, if we have

	cmdline = "foo fool";

and are searching for "fool", we have:

	"fool"
opptr = ----^

	"foo fool"
c = --------^

We see that 'l' != ' ', set state=st_wordskip, break, and then
move 'c', so:

	"foo fool"
c = ---------^

and are still in state=st_wordskip.  We will stay in wordskip
until we have skipped "fool", thus missing the option we were
looking for.  This *only* happens when you have a partially-
matching word followed by a matching one.

To fix this, we always fall *into* the 'st_wordskip' state when
we set it.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: linux-kernel@vger.kernel.org
Cc: fenghua.yu@intel.com
Cc: yu-cheng.yu@intel.com
---

 b/arch/x86/lib/cmdline.c |   18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff -puN arch/x86/lib/cmdline.c~x86-mid-option-match-command-line-parsing arch/x86/lib/cmdline.c
--- a/arch/x86/lib/cmdline.c~x86-mid-option-match-command-line-parsing	2015-12-22 11:56:59.047167827 -0800
+++ b/arch/x86/lib/cmdline.c	2015-12-22 11:56:59.050167962 -0800
@@ -72,18 +72,26 @@ int cmdline_find_option_bool(const char
 				 */
 				if (!c || myisspace(c))
 					return wstart;
-				else
-					state = st_wordskip;
+				/*
+				 * We hit the end of the option, but _not_
+				 * the end of a word on the cmdline.  Not
+				 * a match.
+				 */
 			} else if (!c) {
 				/*
 				 * Hit the NULL terminator on the end of
 				 * cmdline.
 				 */
 				return 0;
-			} else if (c != *opptr++) {
-				state = st_wordskip;
+			} else if (c == *opptr++) {
+				/*
+				 * We are currently matching, so continue
+				 * to the next character on the cmdline.
+				 */
+				break;
 			}
-			break;
+			state = st_wordskip;
+			/* fall through */
 
 		case st_wordskip:
 			if (!c)
_

  parent reply	other threads:[~2015-12-22 22:53 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-22 22:52 [PATCH 0/5] x86: early command-line parsing fixes / tests (v2) Dave Hansen
2015-12-22 22:52 ` [PATCH 1/5] x86: fix early command-line parsing when matching at end Dave Hansen
2016-01-05 18:35   ` Borislav Petkov
2016-01-05 18:51     ` Dave Hansen
2016-01-06 17:10   ` Borislav Petkov
2016-01-06 17:57   ` Dave Hansen
2016-01-06 18:14     ` Borislav Petkov
2016-02-03 11:34   ` [tip:x86/boot] x86/boot: Fix " tip-bot for Dave Hansen
2015-12-22 22:52 ` Dave Hansen [this message]
2016-02-03 11:35   ` [tip:x86/boot] x86/boot: Fix early command-line parsing when partial word matches tip-bot for Dave Hansen
2015-12-22 22:52 ` [PATCH 3/5] x86: simplify early command line parsing Dave Hansen
2016-01-06 17:10   ` Borislav Petkov
2016-01-06 17:35     ` Dave Hansen
2016-01-06 17:37     ` Dave Hansen
2016-01-06 17:48       ` Borislav Petkov
2016-02-03 11:35   ` [tip:x86/boot] x86/boot: Simplify " tip-bot for Dave Hansen
2015-12-22 22:52 ` [PATCH 4/5] x86: pass in size to early cmdline parsing Dave Hansen
2016-02-03 11:36   ` [tip:x86/boot] x86/boot: Pass " tip-bot for Dave Hansen
2015-12-22 22:52 ` [PATCH 5/5] x86: test early command-line code Dave Hansen
2016-01-27 12:28   ` Borislav Petkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151222225239.8E1DCA58@viggo.jf.intel.com \
    --to=dave@sr71.net \
    --cc=bp@suse.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=fenghua.yu@intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=x86@kernel.org \
    --cc=yu-cheng.yu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.