]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Patch from Brad Smith that syncs compat/getentropy_linux with
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 4 Mar 2015 07:18:09 +0000 (07:18 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 4 Mar 2015 07:18:09 +0000 (07:18 +0000)
  OpenBSD's version (2015-03-04).

git-svn-id: file:///svn/unbound/trunk@3345 be551aaa-1e26-0410-a405-d3ace91eadb9

compat/getentropy_linux.c
doc/Changelog

index d4adab2852d4ee1079de3fb0b7c21191cbca527c..41e4219cb35f5f7aa064576d2540541854ad0c68 100644 (file)
@@ -77,6 +77,9 @@ int   getentropy(void *buf, size_t len);
 extern int main(int, char *argv[]);
 #endif
 static int gotdata(char *buf, size_t len);
+#ifdef SYS_getrandom
+static int getentropy_getrandom(void *buf, size_t len);
+#endif
 static int getentropy_urandom(void *buf, size_t len);
 #ifdef SYS__sysctl
 static int getentropy_sysctl(void *buf, size_t len);
@@ -94,11 +97,15 @@ getentropy(void *buf, size_t len)
        }
 
 #ifdef SYS_getrandom
-       /* try to use getrandom syscall introduced with kernel 3.17 */
-       ret = syscall(SYS_getrandom, buf, len, 0);
+       /*
+        * Try descriptor-less getrandom()
+        */
+       ret = getentropy_getrandom(buf, len);
        if (ret != -1)
                return (ret);
-#endif /* SYS_getrandom */
+       if (errno != ENOSYS)
+               return (-1);
+#endif
 
        /*
         * Try to get entropy with /dev/urandom
@@ -185,6 +192,25 @@ gotdata(char *buf, size_t len)
        return 0;
 }
 
+#ifdef SYS_getrandom
+static int
+getentropy_getrandom(void *buf, size_t len)
+{
+       int pre_errno = errno;
+       int ret;
+       if (len > 256)
+               return (-1);
+       do {
+               ret = syscall(SYS_getrandom, buf, len, 0);
+       } while (ret == -1 && errno == EINTR);
+
+       if (ret != len)
+               return (-1);
+       errno = pre_errno;
+       return (0);
+}
+#endif
+
 static int
 getentropy_urandom(void *buf, size_t len)
 {
@@ -258,7 +284,7 @@ getentropy_sysctl(void *buf, size_t len)
                struct __sysctl_args args = {
                        .name = mib,
                        .nlen = 3,
-                       .oldval = buf + i,
+                       .oldval = (char *)buf + i,
                        .oldlenp = &chunk,
                };
                if (syscall(SYS__sysctl, &args) != 0)
index 8c920927d180252809de428ac00f6d744306d10e..100ffc61260a89ee48258a17ae8b38f778e5797d 100644 (file)
@@ -1,3 +1,7 @@
+4 March 2015: Wouter
+       - Patch from Brad Smith that syncs compat/getentropy_linux with
+         OpenBSD's version (2015-03-04).
+
 3 March 2015: Wouter
        - tag 1.5.3rc1