Skip to content

PyLong_FromString() does not always set *pend on error #110865

Open
@serhiy-storchaka

Description

@serhiy-storchaka

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:

  1. base is invalid (not 0 or in range from 2 to 36).
  2. Binary base number exceeds sys.maxsize bits.
  3. Decimal number exceeds the limit of digits sys.get_int_max_str_digits().
  4. Other base numbers also have limits.
  5. Memory allocation error.
  6. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)topic-C-APItype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions