diff options
| author | Jeff Epler <jepler@gmail.com> | 2025-08-15 08:47:39 -0500 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2025-08-28 11:31:03 +1000 |
| commit | 1671977ca4be609679db36abc5594f1d76a71e23 (patch) | |
| tree | 4198bdda9dfbfa15fe34607729f419f5e0ad51da /py/parsenum.c | |
| parent | f4f7fbf3dc8164ead907cb418773eef9bbba5644 (diff) | |
py/parsenum: Fix parsing LLONG_MIN in longlong configuration.
Re-organize `mp_parse_num_integer()` (for longlong) slightly so that the
most negative 64-bit integer can be parsed.
Fixes issue #17932.
Signed-off-by: Jeff Epler <jepler@gmail.com>
Diffstat (limited to 'py/parsenum.c')
| -rw-r--r-- | py/parsenum.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/py/parsenum.c b/py/parsenum.c index e18002306..4239f2dcd 100644 --- a/py/parsenum.c +++ b/py/parsenum.c @@ -64,7 +64,7 @@ typedef mp_int_t parsed_int_t; typedef unsigned long long parsed_int_t; #define PARSED_INT_MUL_OVERFLOW mp_mul_ull_overflow -#define PARSED_INT_FITS(I) ((I) <= (unsigned long long)LLONG_MAX) +#define PARSED_INT_FITS(I) ((I) <= (unsigned long long)LLONG_MAX + 1) #endif mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, mp_lexer_t *lex) { @@ -135,8 +135,11 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m have_ret_val: #else // The PARSED_INT_FITS check above ensures parsed_val won't overflow signed long long - long long signed_val = parsed_val; - if (neg) { + long long signed_val = -parsed_val; + if (!neg) { + if (signed_val == LLONG_MIN) { + goto overflow; + } signed_val = -signed_val; } ret_val = mp_obj_new_int_from_ll(signed_val); // Could be large or small int |
