Commit 1f50012d authored by Ian Kent's avatar Ian Kent Committed by Christian Brauner
Browse files

autofs: validate protocol version



Move the protocol parameter validation into a seperate function.

Signed-off-by: default avatarIan Kent <raven@themaw.net>
Reviewed-by: default avatarBill O'Donnell <bodonnel@redhat.com>
Message-Id: <20230922041215.13675-7-raven@themaw.net>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 9b273166
Loading
Loading
Loading
Loading
+23 −15
Original line number Diff line number Diff line
@@ -287,6 +287,28 @@ static struct autofs_sb_info *autofs_alloc_sbi(void)
	return sbi;
}

static int autofs_validate_protocol(struct autofs_sb_info *sbi)
{
	/* Test versions first */
	if (sbi->max_proto < AUTOFS_MIN_PROTO_VERSION ||
	    sbi->min_proto > AUTOFS_MAX_PROTO_VERSION) {
		pr_err("kernel does not match daemon version "
		       "daemon (%d, %d) kernel (%d, %d)\n",
		       sbi->min_proto, sbi->max_proto,
		       AUTOFS_MIN_PROTO_VERSION, AUTOFS_MAX_PROTO_VERSION);
		return -EINVAL;
	}

	/* Establish highest kernel protocol version */
	if (sbi->max_proto > AUTOFS_MAX_PROTO_VERSION)
		sbi->version = AUTOFS_MAX_PROTO_VERSION;
	else
		sbi->version = sbi->max_proto;
	sbi->sub_version = AUTOFS_PROTO_SUBVERSION;

	return 0;
}

int autofs_fill_super(struct super_block *s, void *data, int silent)
{
	struct inode *root_inode;
@@ -335,22 +357,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
		goto fail_dput;
	}

	/* Test versions first */
	if (sbi->max_proto < AUTOFS_MIN_PROTO_VERSION ||
	    sbi->min_proto > AUTOFS_MAX_PROTO_VERSION) {
		pr_err("kernel does not match daemon version "
		       "daemon (%d, %d) kernel (%d, %d)\n",
		       sbi->min_proto, sbi->max_proto,
		       AUTOFS_MIN_PROTO_VERSION, AUTOFS_MAX_PROTO_VERSION);
	if (autofs_validate_protocol(sbi))
		goto fail_dput;
	}

	/* Establish highest kernel protocol version */
	if (sbi->max_proto > AUTOFS_MAX_PROTO_VERSION)
		sbi->version = AUTOFS_MAX_PROTO_VERSION;
	else
		sbi->version = sbi->max_proto;
	sbi->sub_version = AUTOFS_PROTO_SUBVERSION;

	if (pgrp_set) {
		sbi->oz_pgrp = find_get_pid(pgrp);