gh-127081: use getlogin_r if available (gh-132751)

The `getlogin` function is not thread-safe: replace with `getlogin_r` where
available.
This commit is contained in:
Duane Griffin 2025-06-04 05:28:58 +12:00 committed by GitHub
parent 54ca55978e
commit 1ffe913c20
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 79 additions and 1 deletions

View File

@ -0,0 +1,2 @@
Fix libc thread safety issues with :mod:`os` by replacing ``getlogin`` with
``getlogin_r`` re-entrant version.

View File

@ -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;

33
configure generated vendored
View File

@ -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

View File

@ -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], [],

View File

@ -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