Skip to content

Commit

Permalink
fuse: avoid out-of-scope stack access
Browse files Browse the repository at this point in the history
The all pointers within fuse_req must point to valid memory once
fuse_force_forget() returns.

This bug appeared in "fuse: implement NFS-like readdirplus support"
and was never in any official Linux release.

I tested the fuse_force_forget() code path by injecting to fake -ENOMEM and
verified the FORGET operation was called properly in userspace.

Signed-off-by: Eric Wong <[email protected]>
Signed-off-by: Miklos Szeredi <[email protected]>
  • Loading branch information
Eric Wong authored and Miklos Szeredi committed Feb 4, 2013
1 parent 23c153e commit 6a4e922
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions fs/fuse/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,9 +440,8 @@ __acquires(fc->lock)
}
}

void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
{
req->isreply = 1;
spin_lock(&fc->lock);
if (!fc->connected)
req->out.h.error = -ENOTCONN;
Expand All @@ -459,6 +458,12 @@ void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
}
spin_unlock(&fc->lock);
}

void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
{
req->isreply = 1;
__fuse_request_send(fc, req);
}
EXPORT_SYMBOL_GPL(fuse_request_send);

static void fuse_request_send_nowait_locked(struct fuse_conn *fc,
Expand Down Expand Up @@ -541,7 +546,9 @@ void fuse_force_forget(struct file *file, u64 nodeid)
req->in.args[0].size = sizeof(inarg);
req->in.args[0].value = &inarg;
req->isreply = 0;
fuse_request_send_nowait(fc, req);
__fuse_request_send(fc, req);
/* ignore errors */
fuse_put_request(fc, req);
}

/*
Expand Down

0 comments on commit 6a4e922

Please sign in to comment.