[apparmor] [PATCH] fixup! libapparmor: Use directory file descriptor in _aa_dirat_for_each()

Tyler Hicks tyhicks at canonical.com
Fri Mar 27 00:26:28 UTC 2015


Fix memory leak due to not freeing each dirent pointer in the namelist
array.

Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
---
 libraries/libapparmor/src/private.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/libraries/libapparmor/src/private.c b/libraries/libapparmor/src/private.c
index f164ccb..4769f34 100644
--- a/libraries/libapparmor/src/private.c
+++ b/libraries/libapparmor/src/private.c
@@ -207,7 +207,7 @@ int _aa_dirat_for_each(int dirfd, const char *name, void *data,
 {
 	autofree struct dirent **namelist = NULL;
 	autoclose int cb_dirfd = -1;
-	int i, ret;
+	int i, num_dirs, rc;
 
 	if (!cb || !name) {
 		errno = EINVAL;
@@ -220,27 +220,34 @@ int _aa_dirat_for_each(int dirfd, const char *name, void *data,
 		return -1;
 	}
 
-	ret = scandirat(cb_dirfd, ".", &namelist, dot_or_dot_dot_filter, NULL);
-	if (ret == -1) {
+	num_dirs = scandirat(cb_dirfd, ".", &namelist,
+			     dot_or_dot_dot_filter, NULL);
+	if (num_dirs == -1) {
 		PDEBUG("scandirat of directory '%s' failed: %m\n", name);
 		return -1;
 	}
 
-	for (i = 0; i < ret; i++) {
+	for (rc = 0, i = 0; i < num_dirs; i++) {
+		/* Must cycle through all dirs so that each one is autofreed */
+		autofree struct dirent *dir = namelist[i];
 		struct stat my_stat;
 
-		if (fstatat(cb_dirfd, namelist[i]->d_name, &my_stat, 0)) {
-			PDEBUG("stat failed for '%s': %m\n",
-			       namelist[i]->d_name);
-			return -1;
+		if (rc)
+			continue;
+
+		if (fstatat(cb_dirfd, dir->d_name, &my_stat, 0)) {
+			PDEBUG("stat failed for '%s': %m\n", dir->d_name);
+			rc = -1;
+			continue;
 		}
 
-		if (cb(cb_dirfd, namelist[i]->d_name, &my_stat, data)) {
+		if (cb(cb_dirfd, dir->d_name, &my_stat, data)) {
 			PDEBUG("dir_for_each callback failed for '%s'\n",
-			       namelist[i]->d_name);
-			return -1;
+			       dir->d_name);
+			rc = -1;
+			continue;
 		}
 	}
 
-	return 0;
+	return rc;
 }
-- 
2.1.4




More information about the AppArmor mailing list