Commit b274279a authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'tomoyo-pr-20201012' of git://git.osdn.net/gitroot/tomoyo/tomoyo-test1

Pull tomoyo fix from Tetsuo HandaL
 "One patch to make it possible to execute usermode-driver's path"

* tag 'tomoyo-pr-20201012' of git://git.osdn.net/gitroot/tomoyo/tomoyo-test1:
  tomoyo: Loosen pathname/domainname validation.
parents d594d8f4 a2075167
Loading
Loading
Loading
Loading
+23 −6
Original line number Diff line number Diff line
@@ -143,6 +143,8 @@ char *tomoyo_read_token(struct tomoyo_acl_param *param)
	return pos;
}

static bool tomoyo_correct_path2(const char *filename, const size_t len);

/**
 * tomoyo_get_domainname - Read a domainname from a line.
 *
@@ -157,10 +159,10 @@ const struct tomoyo_path_info *tomoyo_get_domainname
	char *pos = start;

	while (*pos) {
		if (*pos++ != ' ' || *pos++ == '/')
		if (*pos++ != ' ' ||
		    tomoyo_correct_path2(pos, strchrnul(pos, ' ') - pos))
			continue;
		pos -= 2;
		*pos++ = '\0';
		*(pos - 1) = '\0';
		break;
	}
	param->data = pos;
@@ -513,6 +515,22 @@ bool tomoyo_correct_word(const char *string)
	return tomoyo_correct_word2(string, strlen(string));
}

/**
 * tomoyo_correct_path2 - Check whether the given pathname follows the naming rules.
 *
 * @filename: The pathname to check.
 * @len:      Length of @filename.
 *
 * Returns true if @filename follows the naming rules, false otherwise.
 */
static bool tomoyo_correct_path2(const char *filename, const size_t len)
{
	const char *cp1 = memchr(filename, '/', len);
	const char *cp2 = memchr(filename, '.', len);

	return cp1 && (!cp2 || (cp1 < cp2)) && tomoyo_correct_word2(filename, len);
}

/**
 * tomoyo_correct_path - Validate a pathname.
 *
@@ -523,7 +541,7 @@ bool tomoyo_correct_word(const char *string)
 */
bool tomoyo_correct_path(const char *filename)
{
	return *filename == '/' && tomoyo_correct_word(filename);
	return tomoyo_correct_path2(filename, strlen(filename));
}

/**
@@ -545,8 +563,7 @@ bool tomoyo_correct_domain(const unsigned char *domainname)

		if (!cp)
			break;
		if (*domainname != '/' ||
		    !tomoyo_correct_word2(domainname, cp - domainname))
		if (!tomoyo_correct_path2(domainname, cp - domainname))
			return false;
		domainname = cp + 1;
	}