summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-10-05 12:21:03 (GMT)
committerGitHub <noreply@github.com>2023-10-05 12:21:03 (GMT)
commit7bfcfcf6565dcf609854a82a7976faa7f7446fea (patch)
tree8d4b52de8b831030c2e8f18037b61e7d105ce7ca /Modules
parent4da8c1b61e654b9f2c66e8133f5bf7994e8e59b2 (diff)
downloadcpython-7bfcfcf6565dcf609854a82a7976faa7f7446fea.zip
cpython-7bfcfcf6565dcf609854a82a7976faa7f7446fea.tar.gz
cpython-7bfcfcf6565dcf609854a82a7976faa7f7446fea.tar.bz2
[3.12] gh-110365: Fix error overwrite in `termios.tcsetattr` (GH-110366) (#110389)
(cherry picked from commit 2bbbab212fb10b3aeaded188fb5d6c001fb4bf74) Co-authored-by: Nikita Sobolev <mail@sobolevn.me> Co-authored-by: Erlend E. Aasland <erlend@python.org>
Diffstat (limited to 'Modules')
-rw-r--r--Modules/termios.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/Modules/termios.c b/Modules/termios.c
index 6dc8200..c3d96cc 100644
--- a/Modules/termios.c
+++ b/Modules/termios.c
@@ -183,17 +183,25 @@ termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term)
return PyErr_SetFromErrno(state->TermiosError);
}
- 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;
- }
-
+ speed_t ispeed, ospeed;
+#define SET_FROM_LIST(TYPE, VAR, LIST, N) do { \
+ PyObject *item = PyList_GET_ITEM(LIST, N); \
+ long num = PyLong_AsLong(item); \
+ if (num == -1 && PyErr_Occurred()) { \
+ return NULL; \
+ } \
+ VAR = (TYPE)num; \
+} while (0)
+
+ SET_FROM_LIST(tcflag_t, mode.c_iflag, term, 0);
+ SET_FROM_LIST(tcflag_t, mode.c_oflag, term, 1);
+ SET_FROM_LIST(tcflag_t, mode.c_cflag, term, 2);
+ SET_FROM_LIST(tcflag_t, mode.c_lflag, term, 3);
+ SET_FROM_LIST(speed_t, ispeed, term, 4);
+ SET_FROM_LIST(speed_t, ospeed, term, 5);
+#undef SET_FROM_LIST
+
+ PyObject *cc = PyList_GET_ITEM(term, 6);
if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
PyErr_Format(PyExc_TypeError,
"tcsetattr: attributes[6] must be %d element list",
@@ -208,8 +216,13 @@ termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term)
if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
- else if (PyLong_Check(v))
- mode.c_cc[i] = (cc_t) PyLong_AsLong(v);
+ else if (PyLong_Check(v)) {
+ long num = PyLong_AsLong(v);
+ if (num == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ mode.c_cc[i] = (cc_t)num;
+ }
else {
PyErr_SetString(PyExc_TypeError,
"tcsetattr: elements of attributes must be characters or integers");