mirror of
https://github.com/ipxe/ipxe
synced 2025-12-23 21:41:43 +03:00
[settings] Allow numeric_setting_value() to handle long setting values
Allow numeric_setting_value() to handle e.g. the byte sequence 00:00:00:00:12:34:56:78 by returning -ERANGE only if the value actually overflows the return type. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -862,18 +862,18 @@ static int numeric_setting_value ( int is_signed, const void *raw, size_t len,
|
||||
const int8_t *signed_bytes = raw;
|
||||
int is_negative;
|
||||
unsigned int i;
|
||||
uint8_t pad;
|
||||
uint8_t byte;
|
||||
|
||||
/* Range check */
|
||||
if ( len > sizeof ( long ) )
|
||||
return -ERANGE;
|
||||
|
||||
/* Convert to host-ordered longs */
|
||||
is_negative = ( len && ( signed_bytes[0] < 0 ) );
|
||||
*value = ( ( is_signed && is_negative ) ? -1L : 0 );
|
||||
pad = *value;
|
||||
for ( i = 0 ; i < len ; i++ ) {
|
||||
byte = unsigned_bytes[i];
|
||||
*value = ( ( *value << 8 ) | byte );
|
||||
if ( ( ( i + sizeof ( *value ) ) < len ) && ( byte != pad ) )
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
return len;
|
||||
|
||||
Reference in New Issue
Block a user