]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: getauxval(AT_RANDOM) is apparently not necessarily aligned 2463/head
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2016 16:00:38 +0000 (17:00 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2016 16:00:38 +0000 (17:00 +0100)
Let's make sure we read it in a way compatible with non-aligned memory.

Fixes: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=812928
src/basic/random-util.c

index e1543da5a37ca198bee23e6b720255571aab42c3..2f468db770d6d24fd8fa838dc8aa5a195f34d5b1 100644 (file)
@@ -95,17 +95,18 @@ void initialize_srand(void) {
         if (srand_called)
                 return;
 
-        x = 0;
-
 #ifdef HAVE_SYS_AUXV_H
-        /* The kernel provides us with a bit of entropy in auxv, so
-         * let's try to make use of that to seed the pseudo-random
-         * generator. It's better than nothing... */
+        /* The kernel provides us with 16 bytes of entropy in auxv, so let's try to make use of that to seed the
+         * pseudo-random generator. It's better than nothing... */
 
         auxv = (void*) getauxval(AT_RANDOM);
-        if (auxv)
-                x ^= *(unsigned*) auxv;
+        if (auxv) {
+                assert_cc(sizeof(x) < 16);
+                memcpy(&x, auxv, sizeof(x));
+        } else
 #endif
+                x = 0;
+
 
         x ^= (unsigned) now(CLOCK_REALTIME);
         x ^= (unsigned) gettid();