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

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