|
@@ -21,12 +21,16 @@ static inline int myisspace(u8 c)
|
|
|
* @option: option string to look for
|
|
|
*
|
|
|
* Returns the position of that @option (starts counting with 1)
|
|
|
- * or 0 on not found.
|
|
|
+ * or 0 on not found. @option will only be found if it is found
|
|
|
+ * as an entire word in @cmdline. For instance, if @option="car"
|
|
|
+ * then a cmdline which contains "cart" will not match.
|
|
|
*/
|
|
|
-int cmdline_find_option_bool(const char *cmdline, const char *option)
|
|
|
+static int
|
|
|
+__cmdline_find_option_bool(const char *cmdline, int max_cmdline_size,
|
|
|
+ const char *option)
|
|
|
{
|
|
|
char c;
|
|
|
- int len, pos = 0, wstart = 0;
|
|
|
+ int pos = 0, wstart = 0;
|
|
|
const char *opptr = NULL;
|
|
|
enum {
|
|
|
st_wordstart = 0, /* Start of word/after whitespace */
|
|
@@ -37,11 +41,11 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
|
|
if (!cmdline)
|
|
|
return -1; /* No command line */
|
|
|
|
|
|
- len = min_t(int, strlen(cmdline), COMMAND_LINE_SIZE);
|
|
|
- if (!len)
|
|
|
- return 0;
|
|
|
-
|
|
|
- while (len--) {
|
|
|
+ /*
|
|
|
+ * This 'pos' check ensures we do not overrun
|
|
|
+ * a non-NULL-terminated 'cmdline'
|
|
|
+ */
|
|
|
+ while (pos < max_cmdline_size) {
|
|
|
c = *(char *)cmdline++;
|
|
|
pos++;
|
|
|
|
|
@@ -58,18 +62,35 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
|
|
/* fall through */
|
|
|
|
|
|
case st_wordcmp:
|
|
|
- if (!*opptr)
|
|
|
+ if (!*opptr) {
|
|
|
+ /*
|
|
|
+ * We matched all the way to the end of the
|
|
|
+ * option we were looking for. If the
|
|
|
+ * command-line has a space _or_ ends, then
|
|
|
+ * we matched!
|
|
|
+ */
|
|
|
if (!c || myisspace(c))
|
|
|
return wstart;
|
|
|
- else
|
|
|
- state = st_wordskip;
|
|
|
- else if (!c)
|
|
|
+ /*
|
|
|
+ * 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 (!len) /* last word and is matching */
|
|
|
- return wstart;
|
|
|
- break;
|
|
|
+ } else if (c == *opptr++) {
|
|
|
+ /*
|
|
|
+ * We are currently matching, so continue
|
|
|
+ * to the next character on the cmdline.
|
|
|
+ */
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ state = st_wordskip;
|
|
|
+ /* fall through */
|
|
|
|
|
|
case st_wordskip:
|
|
|
if (!c)
|
|
@@ -82,3 +103,8 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
|
|
|
|
|
return 0; /* Buffer overrun */
|
|
|
}
|
|
|
+
|
|
|
+int cmdline_find_option_bool(const char *cmdline, const char *option)
|
|
|
+{
|
|
|
+ return __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
|
|
|
+}
|