diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2016-06-30 16:31:01 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2016-07-05 15:12:05 -0500 |
commit | d49d37624a1931c2f3b5d0cbe95bd5181cbdc279 (patch) | |
tree | f81e4129a5a393df64b6b674ed9aae83a404f707 /fs/quota/dquot.c | |
parent | 036d523641c66bef713042894a17f4335f199e49 (diff) | |
download | op-kernel-dev-d49d37624a1931c2f3b5d0cbe95bd5181cbdc279.zip op-kernel-dev-d49d37624a1931c2f3b5d0cbe95bd5181cbdc279.tar.gz |
quota: Ensure qids map to the filesystem
Introduce the helper qid_has_mapping and use it to ensure that the
quota system only considers qids that map to the filesystems
s_user_ns.
In practice for quota supporting filesystems today this is the exact
same check as qid_valid. As only 0xffffffff aka (qid_t)-1 does not
map into init_user_ns.
Replace the qid_valid calls with qid_has_mapping as values come in
from userspace. This is harmless today and it prepares the quota
system to work on filesystems with quotas but mounted by unprivileged
users.
Call qid_has_mapping from dqget. This ensures the passed in qid has a
prepresentation on the underlying filesystem. Previously this was
unnecessary as filesystesm never had qids that could not map. With
the introduction of filesystems outside of s_user_ns this will not
remain true.
All of this ensures the quota code never has to deal with qids that
don't map to the underlying filesystem.
Cc: Jan Kara <jack@suse.cz>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'fs/quota/dquot.c')
-rw-r--r-- | fs/quota/dquot.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index ff21980..74706b6 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -841,6 +841,9 @@ struct dquot *dqget(struct super_block *sb, struct kqid qid) unsigned int hashent = hashfn(sb, qid); struct dquot *dquot, *empty = NULL; + if (!qid_has_mapping(sb->s_user_ns, qid)) + return ERR_PTR(-EINVAL); + if (!sb_has_quota_active(sb, qid.type)) return ERR_PTR(-ESRCH); we_slept: |