Blame SOURCES/autofs-5.1.0-add-a-prefix-to-program-map-stdvars.patch

304803
autofs-5.1.0 - add a prefix to program map stdvars
304803
304803
From: Ian Kent <ikent@redhat.com>
304803
304803
When a program map uses an interpreted languages like python it's
304803
possible to load and execute arbitray code from a user home directory.
304803
This is because the standard environment variables are used to locate
304803
and load modules when using these languages.
304803
304803
To avoid that we need to add a prefix to these environment names so
304803
they aren't used for this purpose. The prefix used is "AUTOFS_" and
304803
is not configurable.
304803
---
304803
 CHANGELOG                |    1 
304803
 include/mounts.h         |    4 +-
304803
 lib/mounts.c             |   84 +++++++++++++++++++++++++++++++++++++++--------
304803
 modules/lookup_program.c |    2 -
304803
 modules/parse_sun.c      |    8 ++--
304803
 5 files changed, 78 insertions(+), 21 deletions(-)
304803
304803
--- autofs-5.0.7.orig/CHANGELOG
304803
+++ autofs-5.0.7/CHANGELOG
304803
@@ -162,6 +162,7 @@
304803
 - make negative cache update consistent for all lookup modules.
304803
 - ensure negative cache isn't updated on remount.
304803
 - dont add wildcard to negative cache.
304803
+- add a prefix to program map stdvars.
304803
 
304803
 25/07/2012 autofs-5.0.7
304803
 =======================
304803
--- autofs-5.0.7.orig/include/mounts.h
304803
+++ autofs-5.0.7/include/mounts.h
304803
@@ -87,8 +87,8 @@ extern unsigned int nfs_mount_uses_strin
304803
 
304803
 struct amd_entry;
304803
 
304803
-struct substvar *addstdenv(struct substvar *sv);
304803
-struct substvar *removestdenv(struct substvar *sv);
304803
+struct substvar *addstdenv(struct substvar *sv, const char *prefix);
304803
+struct substvar *removestdenv(struct substvar *sv, const char *prefix);
304803
 void add_std_amd_vars(struct substvar *sv);
304803
 void remove_std_amd_vars(void);
304803
 struct amd_entry *new_amd_entry(const struct substvar *sv);
304803
--- autofs-5.0.7.orig/lib/mounts.c
304803
+++ autofs-5.0.7/lib/mounts.c
304803
@@ -32,6 +32,7 @@
304803
 
304803
 #define MAX_OPTIONS_LEN		80
304803
 #define MAX_MNT_NAME_LEN	30
304803
+#define MAX_ENV_NAME		15
304803
 
304803
 #define EBUFSIZ 1024
304803
 
304803
@@ -328,7 +329,61 @@ int check_nfs_mount_version(struct nfs_m
304803
 }
304803
 #endif
304803
 
304803
-struct substvar *addstdenv(struct substvar *sv)
304803
+static char *set_env_name(const char *prefix, const char *name, char *buf)
304803
+{
304803
+	size_t len;
304803
+
304803
+	len = strlen(name);
304803
+	if (prefix)
304803
+		len += strlen(prefix);
304803
+	len++;
304803
+
304803
+	if (len > MAX_ENV_NAME)
304803
+		return NULL;
304803
+
304803
+	if (!prefix)
304803
+		strcpy(buf, name);
304803
+	else {
304803
+		strcpy(buf, prefix);
304803
+		strcat(buf, name);
304803
+	}
304803
+	return buf;
304803
+}
304803
+
304803
+static struct substvar *do_macro_addvar(struct substvar *list,
304803
+					const char *prefix,
304803
+					const char *name,
304803
+					const char *val)
304803
+{
304803
+	char buf[MAX_ENV_NAME + 1];
304803
+	char *new;
304803
+	size_t len;
304803
+
304803
+	new = set_env_name(prefix, name, buf);
304803
+	if (new) {
304803
+		len = strlen(new);
304803
+		list = macro_addvar(list, new, len, val);
304803
+	}
304803
+	return list;
304803
+}
304803
+
304803
+static struct substvar *do_macro_removevar(struct substvar *list,
304803
+					   const char *prefix,
304803
+					   const char *name)
304803
+{
304803
+	char buf[MAX_ENV_NAME + 1];
304803
+	char *new;
304803
+	size_t len;
304803
+
304803
+	new = set_env_name(prefix, name, buf);
304803
+	if (new) {
304803
+		len = strlen(new);
304803
+		list = macro_removevar(list, new, len);
304803
+	}
304803
+	return list;
304803
+}
304803
+
304803
+struct substvar *addstdenv(struct substvar *sv, const char *prefix)
304803
 {
304803
 	struct substvar *list = sv;
304803
 	struct thread_stdenv_vars *tsv;
304803
@@ -343,14 +398,14 @@ struct substvar *addstdenv(struct substv
304803
 		num = (long) tsv->uid;
304803
 		ret = sprintf(numbuf, "%ld", num);
304803
 		if (ret > 0)
304803
-			list = macro_addvar(list, "UID", 3, numbuf);
304803
+			list = do_macro_addvar(list, prefix, "UID", numbuf);
304803
 		num = (long) tsv->gid;
304803
 		ret = sprintf(numbuf, "%ld", num);
304803
 		if (ret > 0)
304803
-			list = macro_addvar(list, "GID", 3, numbuf);
304803
-		list = macro_addvar(list, "USER", 4, tsv->user);
304803
-		list = macro_addvar(list, "GROUP", 5, tsv->group);
304803
-		list = macro_addvar(list, "HOME", 4, tsv->home);
304803
+			list = do_macro_addvar(list, prefix, "GID", numbuf);
304803
+		list = do_macro_addvar(list, prefix, "USER", tsv->user);
304803
+		list = do_macro_addvar(list, prefix, "GROUP", tsv->group);
304803
+		list = do_macro_addvar(list, prefix, "HOME", tsv->home);
304803
 		mv = macro_findvar(list, "HOST", 4);
304803
 		if (mv) {
304803
 			char *shost = strdup(mv->val);
304803
@@ -358,7 +413,8 @@ struct substvar *addstdenv(struct substv
304803
 				char *dot = strchr(shost, '.');
304803
 				if (dot)
304803
 					*dot = '\0';
304803
-				list = macro_addvar(list, "SHOST", 5, shost);
304803
+				list = do_macro_addvar(list,
304803
+						       prefix, "SHOST", shost);
304803
 				free(shost);
304803
 			}
304803
 		}
304803
@@ -366,16 +422,16 @@ struct substvar *addstdenv(struct substv
304803
 	return list;
304803
 }
304803
 
304803
-struct substvar *removestdenv(struct substvar *sv)
304803
+struct substvar *removestdenv(struct substvar *sv, const char *prefix)
304803
 {
304803
 	struct substvar *list = sv;
304803
 
304803
-	list = macro_removevar(list, "UID", 3);
304803
-	list = macro_removevar(list, "USER", 4);
304803
-	list = macro_removevar(list, "HOME", 4);
304803
-	list = macro_removevar(list, "GID", 3);
304803
-	list = macro_removevar(list, "GROUP", 5);
304803
-	list = macro_removevar(list, "SHOST", 5);
304803
+	list = do_macro_removevar(list, prefix, "UID");
304803
+	list = do_macro_removevar(list, prefix, "USER");
304803
+	list = do_macro_removevar(list, prefix, "HOME");
304803
+	list = do_macro_removevar(list, prefix, "GID");
304803
+	list = do_macro_removevar(list, prefix, "GROUP");
304803
+	list = do_macro_removevar(list, prefix, "SHOST");
304803
 	return list;
304803
 }
304803
 
304803
--- autofs-5.0.7.orig/modules/lookup_program.c
304803
+++ autofs-5.0.7/modules/lookup_program.c
304803
@@ -181,7 +181,7 @@ static char *lookup_one(struct autofs_po
304803
 		if (ctxt->mapfmt && strcmp(ctxt->mapfmt, "MAPFMT_DEFAULT")) {
304803
 			struct parse_context *pctxt = (struct parse_context *) ctxt->parse->context;
304803
 			/* Add standard environment as seen by sun map parser */
304803
-			pctxt->subst = addstdenv(pctxt->subst);
304803
+			pctxt->subst = addstdenv(pctxt->subst, "AUTOFS_");
304803
 			macro_setenv(pctxt->subst);
304803
 		}
304803
 		execl(ctxt->mapname, ctxt->mapname, name, NULL);
304803
--- autofs-5.0.7.orig/modules/parse_sun.c
304803
+++ autofs-5.0.7/modules/parse_sun.c
304803
@@ -1214,12 +1214,12 @@ int parse_mount(struct autofs_point *ap,
304803
 	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
304803
 	macro_lock();
304803
 
304803
-	ctxt->subst = addstdenv(ctxt->subst);
304803
+	ctxt->subst = addstdenv(ctxt->subst, NULL);
304803
 
304803
 	mapent_len = expandsunent(mapent, NULL, name, ctxt->subst, slashify);
304803
 	if (mapent_len == 0) {
304803
 		error(ap->logopt, MODPREFIX "failed to expand map entry");
304803
-		ctxt->subst = removestdenv(ctxt->subst);
304803
+		ctxt->subst = removestdenv(ctxt->subst, NULL);
304803
 		macro_unlock();
304803
 		pthread_setcancelstate(cur_state, NULL);
304803
 		return 1;
304803
@@ -1229,7 +1229,7 @@ int parse_mount(struct autofs_point *ap,
304803
 	if (!pmapent) {	
304803
 		char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
304803
 		logerr(MODPREFIX "alloca: %s", estr);
304803
-		ctxt->subst = removestdenv(ctxt->subst);
304803
+		ctxt->subst = removestdenv(ctxt->subst, NULL);
304803
 		macro_unlock();
304803
 		pthread_setcancelstate(cur_state, NULL);
304803
 		return 1;
304803
@@ -1237,7 +1237,7 @@ int parse_mount(struct autofs_point *ap,
304803
 	pmapent[mapent_len] = '\0';
304803
 
304803
 	expandsunent(mapent, pmapent, name, ctxt->subst, slashify);
304803
-	ctxt->subst = removestdenv(ctxt->subst);
304803
+	ctxt->subst = removestdenv(ctxt->subst, NULL);
304803
 
304803
 	macro_unlock();
304803
 	pthread_setcancelstate(cur_state, NULL);