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
174 lines
4.4 KiB
7 years ago
|
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;
|
||
|
|