glibc/sysdeps/mach
Sergey Bugaev 8fb923ddc3 hurd: Make getrandom cache the server port
Previously, getrandom would, each time it's called, traverse the file
system to find /dev/urandom, fetch some random data from it, then throw
away that port. This is quite slow, while calls to getrandom are
genrally expected to be fast.

Additionally, this means that getrandom can not work when /dev/urandom
is unavailable, such as inside a chroot that lacks one. User programs
expect calls to getrandom to work inside a chroot if they first call
getrandom outside of the chroot.

In particular, this is known to break the OpenSSH server, and in that
case the issue is exacerbated by the API of arc4random, which prevents
it from properly reporting errors, forcing glibc to abort on failure.
This causes sshd to just die once it tries to generate a random number.

Caching the random server port, in a manner similar to how socket
server ports are cached, both improves the performance and works around
the chroot issue.

Tested on i686-gnu with the following program:

pthread_barrier_t barrier;

void *worker(void*) {
    pthread_barrier_wait(&barrier);
    uint32_t sum = 0;
    for (int i = 0; i < 10000; i++) {
        sum += arc4random();
    }
    return (void *)(uintptr_t) sum;
}

int main() {
    pthread_t threads[THREAD_COUNT];

    pthread_barrier_init(&barrier, NULL, THREAD_COUNT);

    for (int i = 0; i < THREAD_COUNT; i++) {
        pthread_create(&threads[i], NULL, worker, NULL);
    }
    for (int i = 0; i < THREAD_COUNT; i++) {
        void *retval;
        pthread_join(threads[i], &retval);
        printf("Thread %i: %lu\n", i, (unsigned long)(uintptr_t) retval);
    }

In my totally unscientific benchmark, with this patch, this completes
in about 7 seconds, whereas previously it took about 50 seconds. This
program was also used to test that getrandom () doesn't explode if the
random server dies, but instead reopens the /dev/urandom anew. I have
also verified that with this patch, OpenSSH can once again accept
connections properly.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20221202135558.23781-1-bugaevc@gmail.com>
2022-12-02 22:33:49 +01:00
..
htl htl: Fix cleaning the reply port 2022-01-22 02:17:19 +01:00
hurd hurd: Make getrandom cache the server port 2022-12-02 22:33:49 +01:00
i386 Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
include hurd: break relocation loop between libc.so and lib{mach,hurd}user.so 2020-11-14 00:52:52 +01:00
sys Installed-header hygiene (BZ#20366): obsolete BSD u_* types. 2016-09-23 08:43:56 -04:00
_strerror.c mach: Fix incoherency between perror and strerror 2022-08-27 14:36:18 +02:00
adjtime.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
clock_gettime.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
clock_nanosleep.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
configure configure: Replaced obsolete AC_TRY_COMPILE 2021-06-04 10:16:00 -03:00
configure.ac configure: Replaced obsolete AC_TRY_COMPILE 2021-06-04 10:16:00 -03:00
getloadavg.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
getpagesize.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
getsysstats.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
libc-lock.h Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
libmachuser.abilist hurd: add base abilist files 2018-01-28 17:26:35 +01:00
Makefile Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
mprotect.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
msync.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
munmap.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
pagecopy.h Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
readonly-area.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
sched_yield.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
sleep.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
strerror_l.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
Subdirs * Makefile (subdir-target-args): New variable. 2006-02-28 07:11:04 +00:00
sysdep.h Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
thread_state.h Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
usleep.c Update copyright dates with scripts/update-copyrights 2022-01-01 11:40:24 -08:00
xpg-strerror.c mach: Make xpg_strerror_r set a message on error 2022-08-27 14:56:35 +02:00