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:
parent
54ca55978e
commit
1ffe913c20
@ -0,0 +1,2 @@
|
|||||||
|
Fix libc thread safety issues with :mod:`os` by replacing ``getlogin`` with
|
||||||
|
``getlogin_r`` re-entrant version.
|
@ -9562,6 +9562,24 @@ os_getlogin_impl(PyObject *module)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
result = PyErr_SetFromWindowsErr(GetLastError());
|
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
|
#else
|
||||||
char *name;
|
char *name;
|
||||||
int old_errno = errno;
|
int old_errno = errno;
|
||||||
|
33
configure
generated
vendored
33
configure
generated
vendored
@ -19458,6 +19458,12 @@ if test "x$ac_cv_func_getlogin" = xyes
|
|||||||
then :
|
then :
|
||||||
printf "%s\n" "#define HAVE_GETLOGIN 1" >>confdefs.h
|
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
|
fi
|
||||||
ac_fn_c_check_func "$LINENO" "getpeername" "ac_cv_func_getpeername"
|
ac_fn_c_check_func "$LINENO" "getpeername" "ac_cv_func_getpeername"
|
||||||
if test "x$ac_cv_func_getpeername" = xyes
|
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
|
# check for openpty, login_tty, and forkpty
|
||||||
|
|
||||||
|
|
||||||
|
14
configure.ac
14
configure.ac
@ -5219,7 +5219,7 @@ AC_CHECK_FUNCS([ \
|
|||||||
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
|
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
|
||||||
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
|
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
|
||||||
gai_strerror getegid geteuid getgid getgrent getgrgid getgrgid_r \
|
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 \
|
getpeername getpgid getpid getppid getpriority _getpty \
|
||||||
getpwent getpwnam_r getpwuid getpwuid_r getresgid getresuid getrusage getsid getspent \
|
getpwent getpwnam_r getpwuid getpwuid_r getresgid getresuid getrusage getsid getspent \
|
||||||
getspnam getuid getwd grantpt if_nameindex initgroups kill killpg lchown linkat \
|
getspnam getuid getwd grantpt if_nameindex initgroups kill killpg lchown linkat \
|
||||||
@ -5538,6 +5538,18 @@ PY_CHECK_FUNC([setgroups], [
|
|||||||
#endif
|
#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
|
# check for openpty, login_tty, and forkpty
|
||||||
|
|
||||||
AC_CHECK_FUNCS([openpty], [],
|
AC_CHECK_FUNCS([openpty], [],
|
||||||
|
@ -267,6 +267,10 @@
|
|||||||
*/
|
*/
|
||||||
#undef HAVE_DECL_TZNAME
|
#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. */
|
/* Define to 1 if you have the device macros. */
|
||||||
#undef HAVE_DEVICE_MACROS
|
#undef HAVE_DEVICE_MACROS
|
||||||
|
|
||||||
@ -539,6 +543,9 @@
|
|||||||
/* Define to 1 if you have the 'getlogin' function. */
|
/* Define to 1 if you have the 'getlogin' function. */
|
||||||
#undef HAVE_GETLOGIN
|
#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. */
|
/* Define to 1 if you have the 'getnameinfo' function. */
|
||||||
#undef HAVE_GETNAMEINFO
|
#undef HAVE_GETNAMEINFO
|
||||||
|
|
||||||
@ -807,6 +814,9 @@
|
|||||||
/* Define this if you have the makedev macro. */
|
/* Define this if you have the makedev macro. */
|
||||||
#undef HAVE_MAKEDEV
|
#undef HAVE_MAKEDEV
|
||||||
|
|
||||||
|
/* Define if you have the 'MAXLOGNAME' constant. */
|
||||||
|
#undef HAVE_MAXLOGNAME
|
||||||
|
|
||||||
/* Define to 1 if you have the 'mbrtowc' function. */
|
/* Define to 1 if you have the 'mbrtowc' function. */
|
||||||
#undef HAVE_MBRTOWC
|
#undef HAVE_MBRTOWC
|
||||||
|
|
||||||
@ -1575,6 +1585,9 @@
|
|||||||
/* Define to 1 if you have the <utmp.h> header file. */
|
/* Define to 1 if you have the <utmp.h> header file. */
|
||||||
#undef HAVE_UTMP_H
|
#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. */
|
/* Define to 1 if you have the 'uuid_create' function. */
|
||||||
#undef HAVE_UUID_CREATE
|
#undef HAVE_UUID_CREATE
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user