lib: deprecate fromHexString on dodgy inputs (#434218)

This commit is contained in:
Emily 2025-08-17 17:17:43 +01:00 committed by GitHub
commit 922b6476c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 27 deletions

View File

@ -392,35 +392,21 @@ runTests {
expected = 9223372036854775807;
};
testFromHexStringLeadingZeroes = {
expr = fromHexString "00ffffffffffffff";
expected = 72057594037927935;
};
testFromHexStringWithPrefix = {
expr = fromHexString "0Xf";
expr = fromHexString "0xf";
expected = 15;
};
# FIXME: This might be bad and should potentially be deprecated.
testFromHexStringQuestionableMixedCase = {
testFromHexStringMixedCase = {
expr = fromHexString "eEeEe";
expected = 978670;
};
# FIXME: This is probably bad and should potentially be deprecated.
testFromHexStringQuestionableUnderscore = {
expr = fromHexString "F_f";
expected = 255;
};
# FIXME: This is definitely bad and should be deprecated.
testFromHexStringBadComment = {
expr = fromHexString "0 # oops";
expected = 0;
};
# FIXME: Oh my god.
testFromHexStringAwfulInjection = {
expr = fromHexString "1\nwhoops = {}";
expected = 1;
};
testToBaseDigits = {
expr = toBaseDigits 2 6;
expected = [

View File

@ -1119,14 +1119,21 @@ in
```
*/
fromHexString =
value:
str:
let
noPrefix = lib.strings.removePrefix "0x" (lib.strings.toLower value);
match = builtins.match "(0x)?([0-7]?[0-9A-Fa-f]{1,15})" str;
in
let
parsed = builtins.fromTOML "v=0x${noPrefix}";
in
parsed.v;
if match != null then
(builtins.fromTOML "v=0x${builtins.elemAt match 1}").v
else
# TODO: Turn this into a `throw` in 26.05.
assert lib.warn "fromHexString: ${
lib.generators.toPretty { } str
} is not a valid input and will be rejected in 26.05" true;
let
noPrefix = lib.strings.removePrefix "0x" (lib.strings.toLower str);
in
(builtins.fromTOML "v=0x${noPrefix}").v;
/**
Convert the given positive integer to a string of its hexadecimal