You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
4.4 KiB

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