mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
[3.13] gh-127081: use getlogin_r
if available (gh-132751) (#135098)
The `getlogin` function is not thread-safe: replace with `getlogin_r` where
available.
(cherry picked from commit 1ffe913c20
)
Co-authored-by: Duane Griffin <duaneg@dghda.com>
This commit is contained in:
parent
aa9eb5f757
commit
b21d15fa95
5 changed files with 78 additions and 1 deletions
|
@ -0,0 +1,2 @@
|
|||
Fix libc thread safety issues with :mod:`os` by replacing ``getlogin`` with
|
||||
``getlogin_r`` re-entrant version.
|
|
@ -9464,6 +9464,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;
|
||||
|
|
32
configure
generated
vendored
32
configure
generated
vendored
|
@ -18180,6 +18180,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
|
||||
|
@ -21887,6 +21893,32 @@ 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 $as_nop
|
||||
ac_have_decl=0
|
||||
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
|
||||
|
||||
|
||||
|
|
14
configure.ac
14
configure.ac
|
@ -5116,7 +5116,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 \
|
||||
|
@ -5400,6 +5400,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], [],
|
||||
|
|
|
@ -258,6 +258,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
|
||||
|
||||
|
@ -521,6 +525,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
|
||||
|
||||
|
@ -786,6 +793,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
|
||||
|
||||
|
@ -1539,6 +1549,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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue