[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-pam-commits
Subject:    [linux-pam] Avoid leaking memory and dir handle on realloc failure.
From:       tmraz () fedoraproject ! org (=?utf-8?b?VG9tw6HFoSBNcsOheg==?=)
Date:       2011-06-15 19:00:15
Message-ID: 20110615190015.7A6361205C6 () lists ! fedorahosted ! org
[Download RAW message or body]

commit 62748f7df90225dc0635944ef59e6e4754c302c0
Author: Tomas Mraz <tmraz at 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 at 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 at 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);
 }
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic