https://github.com/python/cpython/commit/1ffe913c2017b44804aca18befd45689df06c069
commit: 1ffe913c2017b44804aca18befd45689df06c069
branch: main
author: Duane Griffin <[email protected]>
committer: colesbury <[email protected]>
date: 2025-06-03T13:28:58-04:00
summary:
gh-127081: use `getlogin_r` if available (gh-132751)
The `getlogin` function is not thread-safe: replace with `getlogin_r` where
available.
files:
A Misc/NEWS.d/next/Library/2025-04-21-01-03-15.gh-issue-127081.WXRliX.rst
M Modules/posixmodule.c
M configure
M configure.ac
M pyconfig.h.in
diff --git
a/Misc/NEWS.d/next/Library/2025-04-21-01-03-15.gh-issue-127081.WXRliX.rst
b/Misc/NEWS.d/next/Library/2025-04-21-01-03-15.gh-issue-127081.WXRliX.rst
new file mode 100644
index 00000000000000..63fed60ced03c5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-04-21-01-03-15.gh-issue-127081.WXRliX.rst
@@ -0,0 +1,2 @@
+Fix libc thread safety issues with :mod:`os` by replacing ``getlogin`` with
+``getlogin_r`` re-entrant version.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 588894adeac811..07ab5499cd4fa1 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -9562,6 +9562,24 @@ os_getlogin_impl(PyObject *module)
}
else
result = PyErr_SetFromWindowsErr(GetLastError());
+#elif defined (HAVE_GETLOGIN_R)
+# if defined (HAVE_MAXLOGNAME)
+ char name[MAXLOGNAME + 1];
+# elif defined (HAVE_UT_NAMESIZE)
+ char name[UT_NAMESIZE + 1];
+# else
+ char name[256];
+# endif
+ int err = getlogin_r(name, sizeof(name));
+ if (err) {
+ int old_errno = errno;
+ errno = -err;
+ posix_error();
+ errno = old_errno;
+ }
+ else {
+ result = PyUnicode_DecodeFSDefault(name);
+ }
#else
char *name;
int old_errno = errno;
diff --git a/configure b/configure
index b0dc18d5cea749..029bf527da4e3d 100755
--- a/configure
+++ b/configure
@@ -19458,6 +19458,12 @@ if test "x$ac_cv_func_getlogin" = xyes
then :
printf "%s\n" "#define HAVE_GETLOGIN 1" >>confdefs.h
+fi
+ac_fn_c_check_func "$LINENO" "getlogin_r" "ac_cv_func_getlogin_r"
+if test "x$ac_cv_func_getlogin_r" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETLOGIN_R 1" >>confdefs.h
+
fi
ac_fn_c_check_func "$LINENO" "getpeername" "ac_cv_func_getpeername"
if test "x$ac_cv_func_getpeername" = xyes
@@ -23843,6 +23849,33 @@ fi
+ac_fn_check_decl "$LINENO" "MAXLOGNAME" "ac_cv_have_decl_MAXLOGNAME" "#include
<sys/params.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_MAXLOGNAME" = xyes
+then :
+
+printf "%s\n" "#define HAVE_MAXLOGNAME 1" >>confdefs.h
+
+fi
+
+ac_fn_check_decl "$LINENO" "UT_NAMESIZE" "ac_cv_have_decl_UT_NAMESIZE"
"#include <utmp.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_UT_NAMESIZE" = xyes
+then :
+ ac_have_decl=1
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
+fi
+printf "%s\n" "#define HAVE_DECL_UT_NAMESIZE $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+
+printf "%s\n" "#define HAVE_UT_NAMESIZE 1" >>confdefs.h
+
+fi
+
+
# check for openpty, login_tty, and forkpty
diff --git a/configure.ac b/configure.ac
index 70ad6da86719c6..371b2e8ed73525 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5219,7 +5219,7 @@ AC_CHECK_FUNCS([ \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
gai_strerror getegid geteuid getgid getgrent getgrgid getgrgid_r \
- getgrnam_r getgrouplist gethostname getitimer getloadavg getlogin \
+ getgrnam_r getgrouplist gethostname getitimer getloadavg getlogin getlogin_r
\
getpeername getpgid getpid getppid getpriority _getpty \
getpwent getpwnam_r getpwuid getpwuid_r getresgid getresuid getrusage getsid
getspent \
getspnam getuid getwd grantpt if_nameindex initgroups kill killpg lchown
linkat \
@@ -5538,6 +5538,18 @@ PY_CHECK_FUNC([setgroups], [
#endif
])
+AC_CHECK_DECL([MAXLOGNAME],
+ [AC_DEFINE([HAVE_MAXLOGNAME], [1],
+ [Define if you have the 'MAXLOGNAME' constant.])],
+ [],
+ [@%:@include <sys/params.h>])
+
+AC_CHECK_DECLS([UT_NAMESIZE],
+ [AC_DEFINE([HAVE_UT_NAMESIZE], [1],
+ [Define if you have the 'HAVE_UT_NAMESIZE'
constant.])],
+ [],
+ [@%:@include <utmp.h>])
+
# check for openpty, login_tty, and forkpty
AC_CHECK_FUNCS([openpty], [],
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 3dbbda157df70e..65a2c55217c258 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -267,6 +267,10 @@
*/
#undef HAVE_DECL_TZNAME
+/* Define to 1 if you have the declaration of 'UT_NAMESIZE', and to 0 if you
+ don't. */
+#undef HAVE_DECL_UT_NAMESIZE
+
/* Define to 1 if you have the device macros. */
#undef HAVE_DEVICE_MACROS
@@ -539,6 +543,9 @@
/* Define to 1 if you have the 'getlogin' function. */
#undef HAVE_GETLOGIN
+/* Define to 1 if you have the 'getlogin_r' function. */
+#undef HAVE_GETLOGIN_R
+
/* Define to 1 if you have the 'getnameinfo' function. */
#undef HAVE_GETNAMEINFO
@@ -807,6 +814,9 @@
/* Define this if you have the makedev macro. */
#undef HAVE_MAKEDEV
+/* Define if you have the 'MAXLOGNAME' constant. */
+#undef HAVE_MAXLOGNAME
+
/* Define to 1 if you have the 'mbrtowc' function. */
#undef HAVE_MBRTOWC
@@ -1575,6 +1585,9 @@
/* Define to 1 if you have the <utmp.h> header file. */
#undef HAVE_UTMP_H
+/* Define if you have the 'HAVE_UT_NAMESIZE' constant. */
+#undef HAVE_UT_NAMESIZE
+
/* Define to 1 if you have the 'uuid_create' function. */
#undef HAVE_UUID_CREATE
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]