diff options
author | Namhyung Kim <namhyung@kernel.org> | 2016-10-19 10:23:40 +0900 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2016-11-15 16:34:31 -0800 |
commit | e9e360b08a44098ec6f31de8e5a29a3ffaada828 (patch) | |
tree | 547a1aeec67bf4b76b7cc43d2cc4bf479f511926 /fs/pstore | |
parent | 7a0032f50472c740e35e849366572c124087a346 (diff) | |
download | op-kernel-dev-e9e360b08a44098ec6f31de8e5a29a3ffaada828.zip op-kernel-dev-e9e360b08a44098ec6f31de8e5a29a3ffaada828.tar.gz |
pstore: Protect unlink with read_mutex
When update_ms is set, pstore_get_records() will be called when there's
a new entry. But unlink can be called at the same time and might
contend with the open-read-close loop. Depending on the implementation
of platform driver, it may be safe or not. But I think it'd be better
to protect those race in the first place.
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'fs/pstore')
-rw-r--r-- | fs/pstore/inode.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 0d6bbcf..57c0646 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -199,11 +199,14 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry) if (err) return err; - if (p->psi->erase) + if (p->psi->erase) { + mutex_lock(&p->psi->read_mutex); p->psi->erase(p->type, p->id, p->count, d_inode(dentry)->i_ctime, p->psi); - else + mutex_unlock(&p->psi->read_mutex); + } else { return -EPERM; + } return simple_unlink(dir, dentry); } |