From 745193e10c88f2bc2176c3b585caf2088d09af01 Mon Sep 17 00:00:00 2001 From: Love Hornquist Astrand Date: Thu, 26 Nov 2009 10:06:22 -0800 Subject: [PATCH] Remove fd caching since we don't have unload (deconstructor) support basiclly this is reverting 164c99a4b414b614e5185a96ef8287331e9134eb the problem is when an application is using PAM loaded and unloaded and over again, the file descriptior never get closed on unload of the pam module. If main app already uses Heimdal, Heimdal doesn't get unloaded, but in some scenarios this happen more often. Since we now use fortuna for our internal random generator, this is not that bad. Bug found by Victor Guerra. --- lib/hcrypto/rand-unix.c | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/lib/hcrypto/rand-unix.c b/lib/hcrypto/rand-unix.c index fcad39f1d..4c1f33da5 100644 --- a/lib/hcrypto/rand-unix.c +++ b/lib/hcrypto/rand-unix.c @@ -42,9 +42,6 @@ #include "randi.h" -static int random_fd = -1; -static HEIMDAL_MUTEX random_mutex = HEIMDAL_MUTEX_INITIALIZER; - /* * Unix /dev/random */ @@ -93,44 +90,29 @@ static int unix_bytes(unsigned char *outdata, int size) { ssize_t count; - int once = 0; + int fd; if (size < 0) return 0; else if (size == 0) return 1; - HEIMDAL_MUTEX_lock(&random_mutex); - if (random_fd == -1) { - retry: - random_fd = get_device_fd(O_RDONLY); - if (random_fd < 0) { - HEIMDAL_MUTEX_unlock(&random_mutex); - return 0; - } - } + fd = get_device_fd(O_RDONLY); + if (fd < 0) + return 0; while (size > 0) { - HEIMDAL_MUTEX_unlock(&random_mutex); - count = read (random_fd, outdata, size); - HEIMDAL_MUTEX_lock(&random_mutex); - if (random_fd < 0) { - if (errno == EINTR) - continue; - else if (errno == EBADF && once++ == 0) { - close(random_fd); - random_fd = -1; - goto retry; - } - return 0; - } else if (count <= 0) { - HEIMDAL_MUTEX_unlock(&random_mutex); + count = read(fd, outdata, size); + if (count < 0 && errno == EINTR) + continue; + else if (count <= 0) { + close(fd); return 0; } outdata += count; size -= count; } - HEIMDAL_MUTEX_unlock(&random_mutex); + close(fd); return 1; } -- 2.11.4.GIT