[PATCH v2] arc4random: simplify design for better safety
Florian Weimer
fweimer@redhat.com
Tue Jul 26 11:06:31 GMT 2022
* Jason A. Donenfeld:
> Not in current kernels, where it always returns at least PAGE_SIZE bytes
> before checking for pending signals. In older kernels, if there was a
> signal pending at the top, it would do no work and return -ERESTARTSYS,
> which I believe should then get restarted by glibc's syscaller?
glibc does not handle ERESTARTSYS, it's a kernel-internal error code
that's not exported in UAPI headers and must not leak to userspace
(except perhaps via ptrace). I believe restarts are handled in the
kernel signal code, by tweaking the program counter. Looking at that,
ERESTARTSYS gets translated to EINTR for !SA_RESTART system calls:
/* Are we from a system call? */
if (syscall_get_nr(current, regs) != -1) {
/* If so, check system call restarting.. */
switch (syscall_get_error(current, regs)) {
case -ERESTART_RESTARTBLOCK:
case -ERESTARTNOHAND:
regs->ax = -EINTR;
break;
case -ERESTARTSYS:
if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
regs->ax = -EINTR;
break;
}
fallthrough;
case -ERESTARTNOINTR:
regs->ax = regs->orig_ax;
regs->ip -= 2;
break;
}
}
(arch/x86/kernel/signal.c)
Thanks,
Florian
More information about the Libc-alpha
mailing list