Blame SOURCES/autofs-5.0.9-amd-lookup-check-for-required-options-for-mounts.patch

4d476f
autofs-5.0.9 - amd lookup check for required options for mounts
4d476f
4d476f
From: Ian Kent <raven@themaw.net>
4d476f
4d476f
4d476f
---
4d476f
 modules/parse_amd.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++++++-
4d476f
 1 file changed, 101 insertions(+), 2 deletions(-)
4d476f
4d476f
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
4d476f
index 2056ed9..bc53b1d 100644
4d476f
--- a/modules/parse_amd.c
4d476f
+++ b/modules/parse_amd.c
4d476f
@@ -1070,7 +1070,7 @@ static int do_nfsl_mount(struct autofs_point *ap, const char *name,
4d476f
 
4d476f
 static int wait_for_expire(struct autofs_point *ap)
4d476f
 {
4d476f
-	int ret = 1;
4d476f
+	int ret = 0;
4d476f
 
4d476f
 	st_wait_task(ap, ST_EXPIRE, 0);
4d476f
 
4d476f
@@ -1078,7 +1078,7 @@ static int wait_for_expire(struct autofs_point *ap)
4d476f
 	if (ap->state != ST_SHUTDOWN &&
4d476f
 	    ap->state != ST_SHUTDOWN_PENDING &&
4d476f
 	    ap->state != ST_SHUTDOWN_FORCE) {
4d476f
-		ret = 0;
4d476f
+		ret = 1;
4d476f
 	}
4d476f
 	st_mutex_unlock();
4d476f
 
4d476f
@@ -1181,6 +1181,88 @@ out:
4d476f
 	return ret;
4d476f
 }
4d476f
 
4d476f
+static unsigned int validate_auto_options(unsigned int logopt,
4d476f
+					  struct amd_entry *entry)
4d476f
+{
4d476f
+	/*
4d476f
+	 * The amd manual implies all the mount type auto options
4d476f
+	 * are optional but I don't think there's much point if
4d476f
+	 * no map is given.
4d476f
+	 */
4d476f
+	if (!entry->fs) {
4d476f
+		error(logopt, MODPREFIX
4d476f
+		      "%s: file system not given", entry->type);
4d476f
+		return 0;
4d476f
+	}
4d476f
+	return 1;
4d476f
+}
4d476f
+
4d476f
+static unsigned int validate_link_options(unsigned int logopt,
4d476f
+					  struct amd_entry *entry)
4d476f
+{
4d476f
+	/* fs is the destimation of the link */
4d476f
+	return validate_auto_options(logopt, entry);
4d476f
+}
4d476f
+
4d476f
+static unsigned int validate_nfs_options(unsigned int logopt,
4d476f
+					 struct amd_entry *entry)
4d476f
+{
4d476f
+	/*
4d476f
+	 * Required option rhost will always have a value.
4d476f
+	 * It is set from ${host} if it is found to be NULL
4d476f
+	 * earlier in the parsing process.
4d476f
+	 */
4d476f
+	if (!entry->rfs) {
4d476f
+		if (entry->fs)
4d476f
+			entry->rfs = strdup(entry->fs);
4d476f
+		if (!entry->rfs) {
4d476f
+			error(logopt, MODPREFIX
4d476f
+			      "%s: remote file system not given", entry->type);
4d476f
+			return 0;
4d476f
+		}
4d476f
+	}
4d476f
+	return 1;
4d476f
+}
4d476f
+
4d476f
+static unsigned int validate_generic_options(unsigned int logopt,
4d476f
+					     unsigned long fstype,
4d476f
+					     struct amd_entry *entry)
4d476f
+{
4d476f
+	if (fstype != AMD_MOUNT_TYPE_LOFS) {
4d476f
+		if (!entry->dev) {
4d476f
+			error(logopt, MODPREFIX
4d476f
+			      "%s: mount device not given", entry->type);
4d476f
+			return 0;
4d476f
+		}
4d476f
+	} else {
4d476f
+		if (!entry->rfs) {
4d476f
+			/*
4d476f
+			 * Can't use entry->type as the mount type to reprot
4d476f
+			 * the error since entry->type == "bind" not "lofs".
4d476f
+			 */
4d476f
+			error(logopt, "lofs: mount device not given");
4d476f
+			return 0;
4d476f
+		}
4d476f
+	}
4d476f
+	return 1;
4d476f
+}
4d476f
+
4d476f
+static unsigned int validate_host_options(unsigned int logopt,
4d476f
+					  struct amd_entry *entry)
4d476f
+{
4d476f
+	/*
4d476f
+	 * Not really that useful since rhost is always non-null
4d476f
+	 * because it will have the the value of the host name if
4d476f
+	 * it isn't set in the map entry.
4d476f
+	 */
4d476f
+	if (!entry->rhost) {
4d476f
+		error(logopt, MODPREFIX
4d476f
+		      "%s: remote host name not given", entry->type);
4d476f
+		return 0;
4d476f
+	}
4d476f
+	return 1;
4d476f
+}
4d476f
+
4d476f
 static int amd_mount(struct autofs_point *ap, const char *name,
4d476f
 		     struct amd_entry *entry, struct map_source *source,
4d476f
 		     struct substvar *sv, unsigned int flags,
4d476f
@@ -1191,35 +1273,52 @@ static int amd_mount(struct autofs_point *ap, const char *name,
4d476f
 
4d476f
 	switch (fstype) {
4d476f
 	case AMD_MOUNT_TYPE_AUTO:
4d476f
+		if (!validate_auto_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_auto_mount(ap, name, entry, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_LOFS:
4d476f
+		if (!validate_generic_options(ap->logopt, fstype, entry))
4d476f
+			return 1;
4d476f
 		ret = do_generic_mount(ap, name, entry, entry->rfs, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_EXT:
4d476f
 	case AMD_MOUNT_TYPE_XFS:
4d476f
+		if (!validate_generic_options(ap->logopt, fstype, entry))
4d476f
+			return 1;
4d476f
 		ret = do_generic_mount(ap, name, entry, entry->dev, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_NFS:
4d476f
+		if (!validate_nfs_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_nfs_mount(ap, name, entry, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_NFSL:
4d476f
+		if (!validate_nfs_options(ap->logopt, entry) ||
4d476f
+		    !validate_link_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_nfsl_mount(ap, name, entry, sv, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_LINK:
4d476f
+		if (!validate_link_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_link_mount(ap, name, entry, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_LINKX:
4d476f
+		if (!validate_link_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_linkx_mount(ap, name, entry, flags);
4d476f
 		break;
4d476f
 
4d476f
 	case AMD_MOUNT_TYPE_HOST:
4d476f
+		if (!validate_host_options(ap->logopt, entry))
4d476f
+			return 1;
4d476f
 		ret = do_host_mount(ap, name, entry, source, flags);
4d476f
 		break;
4d476f