diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-12-06 10:24:02 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-12-19 13:25:45 -0300 |
commit | f94446c38fb3f4ad26183984c490a9590cd05282 (patch) | |
tree | 6e9ef3cea607f8bf54757a4b051ba0f79f3de6bb /elf/dl-misc.c | |
parent | 2a969b53c0b02fed7e43473a92f219d737fd217a (diff) | |
download | glibc-f94446c38fb3f4ad26183984c490a9590cd05282.tar.gz glibc-f94446c38fb3f4ad26183984c490a9590cd05282.tar.xz glibc-f94446c38fb3f4ad26183984c490a9590cd05282.zip |
elf: Do not set invalid tunables values
The loader now warns for invalid and out-of-range tunable values. The patch also fixes the parsing of size_t maximum values, where _dl_strtoul was failing for large values close to SIZE_MAX. Checked on x86_64-linux-gnu. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Diffstat (limited to 'elf/dl-misc.c')
-rw-r--r-- | elf/dl-misc.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/elf/dl-misc.c b/elf/dl-misc.c index 5b84adc2f4..859d3e26f0 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -174,6 +174,9 @@ _dl_strtoul (const char *nptr, char **endptr) return 0UL; } + uint64_t cutoff = (UINT64_MAX * 2UL + 1UL) / 10; + uint64_t cutlim = (UINT64_MAX * 2UL + 1UL) % 10; + int base = 10; max_digit = 9; if (*nptr == '0') @@ -182,11 +185,15 @@ _dl_strtoul (const char *nptr, char **endptr) { base = 16; nptr += 2; + cutoff = (UINT64_MAX * 2UL + 1UL) / 16; + cutlim = (UINT64_MAX * 2UL + 1UL) % 16; } else { base = 8; max_digit = 7; + cutoff = (UINT64_MAX * 2UL + 1UL) / 8; + cutlim = (UINT64_MAX * 2UL + 1UL) % 8; } } @@ -207,7 +214,7 @@ _dl_strtoul (const char *nptr, char **endptr) else break; - if (result >= (UINT64_MAX - digval) / base) + if (result > cutoff || (result == cutoff && digval > cutlim)) { if (endptr != NULL) *endptr = (char *) nptr; |