Fix segfault when failing to read random numbers.
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 21 Sep 2020 21:22:18 +0000 (23:22 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 21 Sep 2020 21:22:18 +0000 (23:22 +0200)
Because the result of read() was incorrectly stored in an unsigned
variable, an error reading from the random number generator device would
result in an infinite loop that would start writing out of bounds and
eventually corrupt the stack.

src/nolegacy/crypto.c
src/openssl/crypto.c

index b013f1f..d6e2ce1 100644 (file)
@@ -46,10 +46,10 @@ void randomize(void *vout, size_t outlen) {
        char *out = vout;
 
        while(outlen) {
        char *out = vout;
 
        while(outlen) {
-               size_t len = read(random_fd, out, outlen);
+               ssize_t len = read(random_fd, out, outlen);
 
                if(len <= 0) {
 
                if(len <= 0) {
-                       if(errno == EAGAIN || errno == EINTR) {
+                       if(len == -1 && (errno == EAGAIN || errno == EINTR)) {
                                continue;
                        }
 
                                continue;
                        }
 
index e594e73..072bf7a 100644 (file)
@@ -50,10 +50,10 @@ void randomize(void *vout, size_t outlen) {
        char *out = vout;
 
        while(outlen) {
        char *out = vout;
 
        while(outlen) {
-               size_t len = read(random_fd, out, outlen);
+               ssize_t len = read(random_fd, out, outlen);
 
                if(len <= 0) {
 
                if(len <= 0) {
-                       if(errno == EAGAIN || errno == EINTR) {
+                       if(len == -1 && (errno == EAGAIN || errno == EINTR)) {
                                continue;
                        }
 
                                continue;
                        }