mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-26 23:34:55 +02:00
Don't trust closefrom() on Linux.
glibc's closefrom implementation does not work in a chroot when the kernel does not have close_range. It tries to read from /proc/self/fd and when that fails dies with an assertion of sorts. Instead, call close_range ourselves from our compat code and fall back if that fails. bz#3349, with william.wilson at canonical.com and fweimer at redhat.com.
This commit is contained in:
parent
eb1f63195a
commit
10b899a15c
@ -839,6 +839,7 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
|
|||||||
dnl Target SUSv3/POSIX.1-2001 plus BSD specifics.
|
dnl Target SUSv3/POSIX.1-2001 plus BSD specifics.
|
||||||
dnl _DEFAULT_SOURCE is the new name for _BSD_SOURCE
|
dnl _DEFAULT_SOURCE is the new name for _BSD_SOURCE
|
||||||
CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE"
|
CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE"
|
||||||
|
AC_DEFINE([BROKEN_CLOSEFROM], [1], [broken in chroots on older kernels])
|
||||||
AC_DEFINE([PAM_TTY_KLUDGE], [1],
|
AC_DEFINE([PAM_TTY_KLUDGE], [1],
|
||||||
[Work around problematic Linux PAM modules handling of PAM_TTY])
|
[Work around problematic Linux PAM modules handling of PAM_TTY])
|
||||||
AC_DEFINE([LOCKED_PASSWD_PREFIX], ["!"],
|
AC_DEFINE([LOCKED_PASSWD_PREFIX], ["!"],
|
||||||
@ -1820,6 +1821,7 @@ AC_CHECK_FUNCS([ \
|
|||||||
cap_rights_limit \
|
cap_rights_limit \
|
||||||
clock \
|
clock \
|
||||||
closefrom \
|
closefrom \
|
||||||
|
close_range \
|
||||||
dirfd \
|
dirfd \
|
||||||
endgrent \
|
endgrent \
|
||||||
err \
|
err \
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
|
||||||
#ifndef HAVE_CLOSEFROM
|
#if !defined(HAVE_CLOSEFROM) || defined(BROKEN_CLOSEFROM)
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -130,6 +130,11 @@ closefrom(int lowfd)
|
|||||||
DIR *dirp;
|
DIR *dirp;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
#ifdef HAVE_CLOSE_RANGE
|
||||||
|
if (close_range(lowfd, INT_MAX, 0) == 0)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check for a /proc/$$/fd directory. */
|
/* Check for a /proc/$$/fd directory. */
|
||||||
len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
|
len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
|
||||||
if (len > 0 && (size_t)len < sizeof(fdpath) && (dirp = opendir(fdpath))) {
|
if (len > 0 && (size_t)len < sizeof(fdpath) && (dirp = opendir(fdpath))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user