]> granicus.if.org Git - python/commitdiff
closes bpo-36161: Use thread-safe ttyname_r instead of ttyname. (GH-14868)
authorAntonio Gutierrez <chibby0ne@gmail.com>
Wed, 9 Oct 2019 02:19:48 +0000 (04:19 +0200)
committerBenjamin Peterson <benjamin@python.org>
Wed, 9 Oct 2019 02:19:48 +0000 (19:19 -0700)
Signed-off-by: Antonio Gutierrez <chibby0ne@gmail.com>
Misc/NEWS.d/next/Library/2019-07-20-01-17-43.bpo-36161.Fzf-f9.rst [new file with mode: 0644]
Modules/posixmodule.c

diff --git a/Misc/NEWS.d/next/Library/2019-07-20-01-17-43.bpo-36161.Fzf-f9.rst b/Misc/NEWS.d/next/Library/2019-07-20-01-17-43.bpo-36161.Fzf-f9.rst
new file mode 100644 (file)
index 0000000..b31496c
--- /dev/null
@@ -0,0 +1 @@
+In :mod:`posix`, use ``ttyname_r`` instead of ``ttyname`` for thread safety.
index 5664027b2d3a3ef831742b43f3a7956245690995..aeb0e9ddb1953c72e87eb474980abfb22edd3cf8 100644 (file)
@@ -2774,13 +2774,24 @@ static PyObject *
 os_ttyname_impl(PyObject *module, int fd)
 /*[clinic end generated code: output=c424d2e9d1cd636a input=9ff5a58b08115c55]*/
 {
-    char *ret;
 
-    ret = ttyname(fd);
-    if (ret == NULL) {
+    long size = sysconf(_SC_TTY_NAME_MAX);
+    if (size == -1) {
+        return posix_error();
+    }
+    char *buffer = (char *)PyMem_RawMalloc(size);
+    if (buffer == NULL) {
+        return PyErr_NoMemory();
+    }
+    int ret = ttyname_r(fd, buffer, size);
+    if (ret != 0) {
+        PyMem_RawFree(buffer);
+        errno = ret;
         return posix_error();
     }
-    return PyUnicode_DecodeFSDefault(ret);
+    PyObject *res = PyUnicode_DecodeFSDefault(buffer);
+    PyMem_RawFree(buffer);
+    return res;
 }
 #endif