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

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