Skip to content

termios.tpsetattr does rewrite errors #110365

Closed
@sobolevn

Description

@sobolevn

Bug report

This code is problematic:

cpython/Modules/termios.c

Lines 215 to 224 in bf4bc36

mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0));
mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1));
mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2));
mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3));
speed_t ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4));
speed_t ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5));
PyObject *cc = PyList_GetItem(term, 6);
if (PyErr_Occurred()) {
return NULL;
}

It does rewrite errors that happened before. Showing the last error, not the first one.
This goes against Python's semantics.

Here's the reproducer:

>>> import termios

>>> termios.tcsetattr(0, 0, [0, 1, 2, '3', 4, 5, 6])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer

>>> termios.tcsetattr(0, 0, [object(), 1, 2, '3', 4, 5, 6])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer

The second error should say:

>>> termios.tcsetattr(0, 0, [object(), 1, 2, '3', 4, 5, 6])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'object' object cannot be interpreted as an integer

And while we are there we can also change PyList_GetItem to PyList_GET_ITEM, because:

  • term is known to be a list
  • the size of term is known to be 7
    See check

    cpython/Modules/termios.c

    Lines 197 to 201 in bf4bc36

    if (!PyList_Check(term) || PyList_Size(term) != 7) {
    PyErr_SetString(PyExc_TypeError,
    "tcsetattr, arg 3: must be 7 element list");
    return NULL;
    }
    before these lines.

The only problem is tests. I think that termios is not tested that much in our suite. We don't even have test_termios.py file. Should I add one?

Refs #110260

Linked PRs

Metadata

Metadata

Assignees

Labels

extension-modulesC modules in the Modules dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions