Blame SOURCES/autofs-5.1.8-fix-use-after-free-in-tree_mapent_delete_offset_tree.patch

f3080c
autofs-5.1.8 - fix use after free in tree_mapent_delete_offset_tree()
f3080c
f3080c
From: Ian Kent <raven@themaw.net>
f3080c
f3080c
The key field of the map entry of the root of the map entry tree to be
f3080c
deleted can't be used for the key parameter, fix it.
f3080c
f3080c
Signed-off-by: Ian Kent <raven@themaw.net>
f3080c
---
f3080c
 CHANGELOG    |    1 +
f3080c
 lib/mounts.c |   16 +++++++++++++---
f3080c
 2 files changed, 14 insertions(+), 3 deletions(-)
f3080c
f3080c
--- autofs-5.1.4.orig/CHANGELOG
f3080c
+++ autofs-5.1.4/CHANGELOG
f3080c
@@ -88,6 +88,7 @@
f3080c
 - dont fail on duplicate offset entry tree add.
f3080c
 - fix loop under run in cache_get_offset_parent().
f3080c
 - simplify cache_add() a little.
f3080c
+- fix use after free in tree_mapent_delete_offset_tree().
f3080c
 
f3080c
 xx/xx/2018 autofs-5.1.5
f3080c
 - fix flag file permission.
f3080c
--- autofs-5.1.4.orig/lib/mounts.c
f3080c
+++ autofs-5.1.4/lib/mounts.c
f3080c
@@ -1666,16 +1666,26 @@ static int tree_mapent_delete_offset_tre
f3080c
 	 */
f3080c
 	if (MAPENT_ROOT(me) != MAPENT_NODE(me)) {
f3080c
 		struct tree_node *root = MAPENT_ROOT(me);
f3080c
+		char *key;
f3080c
 
f3080c
-		debug(logopt, "deleting offset key %s", me->key);
f3080c
+		key = strdup(me->key);
f3080c
+		if (!key) {
f3080c
+			char buf[MAX_ERR_BUF];
f3080c
+			char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
f3080c
+			error(logopt, "strdup: %s", estr);
f3080c
+			return 0;
f3080c
+		}
f3080c
+
f3080c
+		debug(logopt, "deleting offset key %s", key);
f3080c
 
f3080c
 		/* cache_delete won't delete an active offset */
f3080c
 		MAPENT_SET_ROOT(me, NULL);
f3080c
-		ret = cache_delete(me->mc, me->key);
f3080c
+		ret = cache_delete(me->mc, key);
f3080c
 		if (ret != CHE_OK) {
f3080c
 			MAPENT_SET_ROOT(me, root);
f3080c
-			warn(logopt, "failed to delete offset %s", me->key);
f3080c
+			warn(logopt, "failed to delete offset %s", key);
f3080c
 		}
f3080c
+		free(key);
f3080c
 	} else {
f3080c
 		MAPENT_SET_ROOT(me, NULL);
f3080c
 		MAPENT_SET_PARENT(me, NULL);