https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219464

            Bug ID: 219464
           Summary: [PATCH] linux_getrandom always returns 0
           Product: Base System
           Version: CURRENT
          Hardware: Any
                OS: Any
            Status: New
          Keywords: patch
          Severity: Affects Some People
          Priority: ---
         Component: kern
          Assignee: freebsd-bugs@FreeBSD.org
          Reporter: mac...@pasternacki.net

Created attachment 182818
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=182818&action=edit
linux_getrandom.patch

In a Linux-based jail, running Ubuntu 16.04, `lsb_release` command (which is
widely used in various scripts and during Factorio startup) hangs. `top` shows
it forks a `python3.5` process which uses 100% CPU. `truss` shows this process
repeatedly calls `linux_getrandom(…)`, which always returns 0.

`man 2 getrandom` on Ubuntu 16.04 specifies that this syscall should return
number of random bytes written
(http://man7.org/linux/man-pages/man2/getrandom.2.html). A short test program
shows that this it returns positive value on Linux, and returns 0 on FreeBSD
despite the fact that random bytes have been written to the buffer:

> $ cat test_getrandom.c
> #define _GNU_SOURCE
> #include <unistd.h>
> #include <sys/syscall.h>
> #include <stdio.h>
> #include <linux/random.h>
> 
> int main(void) {
>         int rv;
>         int buf = 0;
>         rv = syscall(SYS_getrandom, &buf, sizeof(buf), GRND_NONBLOCK);
>         printf("getrandom(&buf, %d, 0) => %d buf=%d\n", (int)sizeof(buf), rv, 
> buf);
>         return 0;
> }

When this program runs natively on Linux, `getrandom(2)` returns size of
buffer:

> $ ./test_getrandom
> getrandom(&buf, 4, 0) => 4 buf=-707083248

On FreeBSD 12-CURRENT (possibly also on 11-STABLE, r315505 which introduces
this implementation is marked for MFC after 1 month), the syscall always
returns 0:

> $ ./test_getrandom
> getrandom(&buf, 4, 0) => 0 buf=-1643413282

After applying attached patch, return value reported from the test program is
the same as on native Linux, and `lsb_release` no longer hangs:

> $ ./test_getrandom
> getrandom(&buf, 4, 0) => 4 buf=-943351330
> $ lsb_release -a
> No LSB modules are available.
> Distributor ID:       Ubuntu
> Description:  Ubuntu 16.04.2 LTS
> Release:      16.04
> Codename:     xenial

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
freebsd-bugs@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to