mirror of
https://github.com/ipxe/ipxe
synced 2026-02-07 19:38:57 +03:00
[image] Check delimiters when parsing command-line key-value arguments
The Linux kernel bzImage image format and the CPIO archive constructor will parse the image command line for certain arguments of the form "key=value". This parsing is currently implemented using strstr() in a way that can cause a false positive suffix match. For example, a command line containing "highmem=<n>" would erroneously be treated as containing a value for "mem=<n>". Fix by centralising the logic used for parsing such arguments, and including a check that the argument immediately follows a whitespace delimiter (or is at the start of the string). Reported-by: Filippo Giunchedi <filippo@esaurito.net> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <libgen.h>
|
||||
@@ -569,3 +570,33 @@ struct image * image_memory ( const char *name, userptr_t data, size_t len ) {
|
||||
err_alloc_image:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find argument within image command line
|
||||
*
|
||||
* @v image Image
|
||||
* @v key Argument search key (including trailing delimiter)
|
||||
* @ret value Argument value, or NULL if not found
|
||||
*/
|
||||
const char * image_argument ( struct image *image, const char *key ) {
|
||||
const char *cmdline = image->cmdline;
|
||||
const char *search;
|
||||
const char *match;
|
||||
const char *next;
|
||||
|
||||
/* Find argument */
|
||||
for ( search = cmdline ; search ; search = next ) {
|
||||
|
||||
/* Find next occurrence, if any */
|
||||
match = strstr ( search, key );
|
||||
if ( ! match )
|
||||
break;
|
||||
next = ( match + strlen ( key ) );
|
||||
|
||||
/* Check preceding delimiter, if any */
|
||||
if ( ( match == cmdline ) || isspace ( match[-1] ) )
|
||||
return next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user