commit 62748f7df90225dc0635944ef59e6e4754c302c0 Author: Tomas Mraz tmraz@fedoraproject.org Date: Wed Jun 15 18:48:12 2011 +0200
Avoid leaking memory and dir handle on realloc failure.
ChangeLog | 6 ++++++ modules/pam_sepermit/pam_sepermit.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) --- diff --git a/ChangeLog b/ChangeLog index d8c954d..7642831 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-06-15 Tomas Mraz tm@t8m.info + + * modules/pam_sepermit/pam_sepermit.c (check_running): Avoid + leaking memory and dir handle on realloc failure. + (sepermit_unlock) Cast fcntl() and close() calls to void. + 2011-06-14 Thorsten Kukuk kukuk@thkukuk.de
* configure.in: Check for libtirpc by default. diff --git a/modules/pam_sepermit/pam_sepermit.c b/modules/pam_sepermit/pam_sepermit.c index 8b2360b..4879b68 100644 --- a/modules/pam_sepermit/pam_sepermit.c +++ b/modules/pam_sepermit/pam_sepermit.c @@ -117,6 +117,7 @@ check_running (pam_handle_t *pamh, uid_t uid, int killall, int debug) max_pids = 256; pid_table = malloc(max_pids * sizeof (pid_t)); if (!pid_table) { + (void)closedir(dir); pam_syslog(pamh, LOG_CRIT, "Memory allocation error"); return -1; } @@ -126,10 +127,15 @@ check_running (pam_handle_t *pamh, uid_t uid, int killall, int debug) continue;
if (pids == max_pids) { - if (!(pid_table = realloc(pid_table, 2*pids*sizeof(pid_t)))) { + pid_t *npt; + + if (!(npt = realloc(pid_table, 2*pids*sizeof(pid_t)))) { + free(pid_table); + (void)closedir(dir); pam_syslog(pamh, LOG_CRIT, "Memory allocation error"); return -1; } + pid_table = npt; max_pids *= 2; } pid_table[pids++] = pid; @@ -175,8 +181,8 @@ sepermit_unlock(pam_handle_t *pamh, void *plockfd, int error_status UNUSED) while(check_running(pamh, lockfd->uid, 1, lockfd->debug) > 0) continue;
- fcntl(lockfd->fd, F_SETLK, &fl); - close(lockfd->fd); + (void)fcntl(lockfd->fd, F_SETLK, &fl); + (void)close(lockfd->fd); free(lockfd); }
linux-pam-commits@lists.fedorahosted.org