-
-
Notifications
You must be signed in to change notification settings - Fork 33.4k
Description
According to the documentation, PyLong_FromString() sets *pend (if pend is not NULL) to the first character that could not be processed on error. But it does not do this in the following cases:
baseis invalid (not 0 or in range from 2 to 36).- Binary base number exceeds
sys.maxsizebits. - Decimal number exceeds the limit of digits
sys.get_int_max_str_digits(). - Other base numbers also have limits.
- Memory allocation error.
- User presses Ctrl-C when
_pylong.int_from_string()is used.
The workaround is to initialize the pointer to some known value, for example the start of the string or NULL before using PyLong_FromString(). If initialize it to NULL, we can distinguish ValueError raised for invalid base or exceeding the sys.get_int_max_str_digits() limit from ValueError raised for invalid string content.
We should either document this and require initialization of the end pointer, or always set it on error in PyLong_FromString(). The latter is a potentially breaking change, because it can override the sentinel value used in the user code. But the former looks like bad design.