mirror of
https://github.com/ipxe/ipxe
synced 2025-12-23 13:30:57 +03:00
[settings] Use hex_decode() to parse hex settings
Use hex_decode() to parse "hex" and "hexhyp" settings. Note that this parser is stricter than the old parser; it now requires exactly two hex digits for each byte. (The old parser was based upon strtoul() and so would allow leading whitespace and a leading plus or minus sign.) Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -32,6 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
#include <ipxe/dhcp.h>
|
||||
#include <ipxe/uuid.h>
|
||||
#include <ipxe/uri.h>
|
||||
#include <ipxe/base16.h>
|
||||
#include <ipxe/init.h>
|
||||
#include <ipxe/settings.h>
|
||||
|
||||
@@ -1685,37 +1686,6 @@ struct setting_type setting_type_uint32 __setting_type = {
|
||||
.format = format_uint_setting,
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse hex string setting value
|
||||
*
|
||||
* @v value Formatted setting value
|
||||
* @v buf Buffer to contain raw value
|
||||
* @v len Length of buffer
|
||||
* @ret len Length of raw value, or negative error
|
||||
*/
|
||||
static int parse_hex_setting ( const char *value, void *buf, size_t len ) {
|
||||
char *ptr = ( char * ) value;
|
||||
uint8_t *bytes = buf;
|
||||
unsigned int count = 0;
|
||||
uint8_t byte;
|
||||
|
||||
while ( 1 ) {
|
||||
byte = strtoul ( ptr, &ptr, 16 );
|
||||
if ( count++ < len )
|
||||
*bytes++ = byte;
|
||||
switch ( *ptr ) {
|
||||
case '\0' :
|
||||
return count;
|
||||
case ':' :
|
||||
case '-' :
|
||||
ptr++;
|
||||
break;
|
||||
default :
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format hex string setting value
|
||||
*
|
||||
@@ -1742,6 +1712,19 @@ static int format_hex_setting ( const void *raw, size_t raw_len, char *buf,
|
||||
return used;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse hex string setting value (using colon delimiter)
|
||||
*
|
||||
* @v value Formatted setting value
|
||||
* @v buf Buffer to contain raw value
|
||||
* @v len Length of buffer
|
||||
* @v size Integer size, in bytes
|
||||
* @ret len Length of raw value, or negative error
|
||||
*/
|
||||
static int parse_hex_setting ( const char *value, void *buf, size_t len ) {
|
||||
return hex_decode ( value, ':', buf, len );
|
||||
}
|
||||
|
||||
/**
|
||||
* Format hex string setting value (using colon delimiter)
|
||||
*
|
||||
@@ -1756,6 +1739,20 @@ static int format_hex_colon_setting ( const void *raw, size_t raw_len,
|
||||
return format_hex_setting ( raw, raw_len, buf, len, ":" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse hex string setting value (using hyphen delimiter)
|
||||
*
|
||||
* @v value Formatted setting value
|
||||
* @v buf Buffer to contain raw value
|
||||
* @v len Length of buffer
|
||||
* @v size Integer size, in bytes
|
||||
* @ret len Length of raw value, or negative error
|
||||
*/
|
||||
static int parse_hex_hyphen_setting ( const char *value, void *buf,
|
||||
size_t len ) {
|
||||
return hex_decode ( value, '-', buf, len );
|
||||
}
|
||||
|
||||
/**
|
||||
* Format hex string setting value (using hyphen delimiter)
|
||||
*
|
||||
@@ -1780,7 +1777,7 @@ struct setting_type setting_type_hex __setting_type = {
|
||||
/** A hex-string setting (hyphen-delimited) */
|
||||
struct setting_type setting_type_hexhyp __setting_type = {
|
||||
.name = "hexhyp",
|
||||
.parse = parse_hex_setting,
|
||||
.parse = parse_hex_hyphen_setting,
|
||||
.format = format_hex_hyphen_setting,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user