diff options
author | Tomas Mraz <tmraz@fedoraproject.org> | 2011-06-15 18:48:12 +0200 |
---|---|---|
committer | Tomas Mraz <tmraz@fedoraproject.org> | 2011-06-15 18:48:12 +0200 |
commit | 62748f7df90225dc0635944ef59e6e4754c302c0 (patch) | |
tree | bb9f0018ffcd0eb1108eceb891e1aa5bfcab6f62 /modules/pam_sepermit/pam_sepermit.c | |
parent | 3299b9a05f3928b5a535512fcae1bf2769ea2f22 (diff) | |
download | pam-62748f7df90225dc0635944ef59e6e4754c302c0.tar.gz pam-62748f7df90225dc0635944ef59e6e4754c302c0.tar.bz2 pam-62748f7df90225dc0635944ef59e6e4754c302c0.zip |
Avoid leaking memory and dir handle on realloc failure.
Diffstat (limited to 'modules/pam_sepermit/pam_sepermit.c')
-rw-r--r-- | modules/pam_sepermit/pam_sepermit.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/modules/pam_sepermit/pam_sepermit.c b/modules/pam_sepermit/pam_sepermit.c index 8b2360b5..4879b685 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); } |