Skip to content

Commit a82c13d

Browse files
committed
Merge patch series "cachefiles: some bugfixes and cleanups for ondemand requests"
[email protected] <[email protected]> says: We've been testing ondemand mode for cachefiles since January, and we're almost done. We hit a lot of issues during the testing period, and this patch set fixes some of the issues related to ondemand requests. The patches have passed internal testing without regression. The following is a brief overview of the patches, see the patches for more details. Patch 1-5: Holding reference counts of reqs and objects on read requests to avoid malicious restore leading to use-after-free. Patch 6-10: Add some consistency checks to copen/cread/get_fd to avoid malicious copen/cread/close fd injections causing use-after-free or hung. Patch 11: When cache is marked as CACHEFILES_DEAD, flush all requests, otherwise the kernel may be hung. since this state is irreversible, the daemon can read open requests but cannot copen. Patch 12: Allow interrupting a read request being processed by killing the read process as a way of avoiding hung in some special cases. fs/cachefiles/daemon.c | 3 +- fs/cachefiles/internal.h | 5 + fs/cachefiles/ondemand.c | 217 ++++++++++++++++++++++-------- include/trace/events/cachefiles.h | 8 +- 4 files changed, 176 insertions(+), 57 deletions(-) * patches from https://lore.kernel.org/r/[email protected]: cachefiles: make on-demand read killable cachefiles: flush all requests after setting CACHEFILES_DEAD cachefiles: Set object to close if ondemand_id < 0 in copen cachefiles: defer exposing anon_fd until after copy_to_user() succeeds cachefiles: never get a new anonymous fd if ondemand_id is valid cachefiles: add spin_lock for cachefiles_ondemand_info cachefiles: add consistency check for copen/cread cachefiles: remove err_put_fd label in cachefiles_ondemand_daemon_read() cachefiles: fix slab-use-after-free in cachefiles_ondemand_daemon_read() cachefiles: fix slab-use-after-free in cachefiles_ondemand_get_fd() cachefiles: remove requests from xarray during flushing requests cachefiles: add output string to cachefiles_obj_[get|put]_ondemand_fd Signed-off-by: Christian Brauner <[email protected]>
2 parents ed7ee6a + bc9dde6 commit a82c13d

File tree

4 files changed

+176
-57
lines changed

4 files changed

+176
-57
lines changed

fs/cachefiles/daemon.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ static int cachefiles_daemon_open(struct inode *inode, struct file *file)
133133
return 0;
134134
}
135135

136-
static void cachefiles_flush_reqs(struct cachefiles_cache *cache)
136+
void cachefiles_flush_reqs(struct cachefiles_cache *cache)
137137
{
138138
struct xarray *xa = &cache->reqs;
139139
struct cachefiles_req *req;
@@ -159,6 +159,7 @@ static void cachefiles_flush_reqs(struct cachefiles_cache *cache)
159159
xa_for_each(xa, index, req) {
160160
req->error = -EIO;
161161
complete(&req->done);
162+
__xa_erase(xa, index);
162163
}
163164
xa_unlock(xa);
164165

fs/cachefiles/internal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct cachefiles_ondemand_info {
5555
int ondemand_id;
5656
enum cachefiles_object_state state;
5757
struct cachefiles_object *object;
58+
spinlock_t lock;
5859
};
5960

6061
/*
@@ -138,6 +139,7 @@ static inline bool cachefiles_in_ondemand_mode(struct cachefiles_cache *cache)
138139
struct cachefiles_req {
139140
struct cachefiles_object *object;
140141
struct completion done;
142+
refcount_t ref;
141143
int error;
142144
struct cachefiles_msg msg;
143145
};
@@ -186,6 +188,7 @@ extern int cachefiles_has_space(struct cachefiles_cache *cache,
186188
* daemon.c
187189
*/
188190
extern const struct file_operations cachefiles_daemon_fops;
191+
extern void cachefiles_flush_reqs(struct cachefiles_cache *cache);
189192
extern void cachefiles_get_unbind_pincount(struct cachefiles_cache *cache);
190193
extern void cachefiles_put_unbind_pincount(struct cachefiles_cache *cache);
191194

@@ -424,6 +427,8 @@ do { \
424427
pr_err("I/O Error: " FMT"\n", ##__VA_ARGS__); \
425428
fscache_io_error((___cache)->cache); \
426429
set_bit(CACHEFILES_DEAD, &(___cache)->flags); \
430+
if (cachefiles_in_ondemand_mode(___cache)) \
431+
cachefiles_flush_reqs(___cache); \
427432
} while (0)
428433

429434
#define cachefiles_io_error_obj(object, FMT, ...) \

0 commit comments

Comments
 (0)