Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a673c6b authored by Domen Puncer's avatar Domen Puncer Committed by Linus Torvalds
Browse files

[PATCH] devpts: use lib/parser.c for parsing mount options



Item from "2.6 should fix" list.

Signed-off-by: default avatarDomen Puncer <domen@coderock.org>
Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ee25e96f
Loading
Loading
Loading
Loading
+49 −27
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/mount.h>
#include <linux/mount.h>
#include <linux/tty.h>
#include <linux/tty.h>
#include <linux/devpts_fs.h>
#include <linux/devpts_fs.h>
#include <linux/parser.h>


#define DEVPTS_SUPER_MAGIC 0x1cd1
#define DEVPTS_SUPER_MAGIC 0x1cd1


@@ -32,39 +33,60 @@ static struct {
	umode_t mode;
	umode_t mode;
} config = {.mode = 0600};
} config = {.mode = 0600};


enum {
	Opt_uid, Opt_gid, Opt_mode,
	Opt_err
};

static match_table_t tokens = {
	{Opt_uid, "uid=%u"},
	{Opt_gid, "gid=%u"},
	{Opt_mode, "mode=%o"},
	{Opt_err, NULL}
};

static int devpts_remount(struct super_block *sb, int *flags, char *data)
static int devpts_remount(struct super_block *sb, int *flags, char *data)
{
{
	int setuid = 0;
	char *p;
	int setgid = 0;

	uid_t uid = 0;
	config.setuid  = 0;
	gid_t gid = 0;
	config.setgid  = 0;
	umode_t mode = 0600;
	config.uid     = 0;
	char *this_char;
	config.gid     = 0;

	config.mode    = 0600;
	this_char = NULL;

	while ((this_char = strsep(&data, ",")) != NULL) {
	while ((p = strsep(&data, ",")) != NULL) {
		int n;
		substring_t args[MAX_OPT_ARGS];
		char dummy;
		int token;
		if (!*this_char)
		int option;

		if (!*p)
			continue;
			continue;
		if (sscanf(this_char, "uid=%i%c", &n, &dummy) == 1) {

			setuid = 1;
		token = match_token(p, tokens, args);
			uid = n;
		switch (token) {
		} else if (sscanf(this_char, "gid=%i%c", &n, &dummy) == 1) {
		case Opt_uid:
			setgid = 1;
			if (match_int(&args[0], &option))
			gid = n;
				return -EINVAL;
		} else if (sscanf(this_char, "mode=%o%c", &n, &dummy) == 1)
			config.uid = option;
			mode = n & ~S_IFMT;
			config.setuid = 1;
		else {
			break;
			printk("devpts: called with bogus options\n");
		case Opt_gid:
			if (match_int(&args[0], &option))
				return -EINVAL;
			config.gid = option;
			config.setgid = 1;
			break;
		case Opt_mode:
			if (match_octal(&args[0], &option))
				return -EINVAL;
			config.mode = option & ~S_IFMT;
			break;
		default:
			printk(KERN_ERR "devpts: called with bogus options\n");
			return -EINVAL;
			return -EINVAL;
		}
		}
	}
	}
	config.setuid  = setuid;
	config.setgid  = setgid;
	config.uid     = uid;
	config.gid     = gid;
	config.mode    = mode;


	return 0;
	return 0;
}
}