summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Gutierrez <chibby0ne@gmail.com>2019-10-09 04:19:48 +0200
committerBenjamin Peterson <benjamin@python.org>2019-10-08 19:19:48 -0700
commit594e2edfb5e0d24e03469d035d8f39ff29a64d99 (patch)
treee40d0cc1fd6a74704b53922f7ec86637e8ebf245
parente8bedbddadaa86be6bd86dc32dbdbd53933a4988 (diff)
downloadcpython-git-594e2edfb5e0d24e03469d035d8f39ff29a64d99.tar.gz
closes bpo-36161: Use thread-safe ttyname_r instead of ttyname. (GH-14868)
Signed-off-by: Antonio Gutierrez <chibby0ne@gmail.com>
-rw-r--r--Misc/NEWS.d/next/Library/2019-07-20-01-17-43.bpo-36161.Fzf-f9.rst1
-rw-r--r--Modules/posixmodule.c19
2 files changed, 16 insertions, 4 deletions
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
index 0000000000..b31496c701
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-07-20-01-17-43.bpo-36161.Fzf-f9.rst
@@ -0,0 +1 @@
+In :mod:`posix`, use ``ttyname_r`` instead of ``ttyname`` for thread safety.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 5664027b2d..aeb0e9ddb1 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -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