Thread (10 messages) 10 messages, 5 authors, 2016-07-31

Re: getrandom waits for a long time when /dev/random is insufficiently read from

From: Nikos Mavrogiannopoulos <hidden>
Date: 2016-07-29 10:25:07

On Fri, Jul 29, 2016 at 7:40 AM, Stephan Mueller [off-list ref] wrote:
And finally, you have a coding error that is very very common but fatal when
reading from /dev/random: you do not account for short reads which implies
that your loop continues even in the case of short reads.

Fix your code with something like the following:
int read_random(char *buf, size_t buflen)
{
        int fd = 0;
        ssize_t ret = 0;
        size_t len = 0;

        fd = open("/dev/random", O_RDONLY|O_CLOEXEC);
        if(0 > fd)
                return fd;
        do {
                ret = read(fd, (buf + len), (buflen - len));
                if (0 < ret)
                        len += ret;
        } while ((0 < ret || EINTR == errno || ERESTART == errno)
                 && buflen > len);
Unless there is a documentation error, the same is required when using
getrandom(). It can also return short as well as to be interrupted.

regards,
Nikos
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help