Reply with ENOMEM in case of failure to allocate request

Reply to request with ENOMEM in case of failure to allocate request
structure.  Otherwise the task issuing the request will just freeze up
until the filesystem daemon is killed.  Reported by Stephan Kulow
This commit is contained in:
Miklos Szeredi 2011-10-23 10:07:20 +02:00
parent 7728b36a83
commit 42d5c66b0b
2 changed files with 27 additions and 9 deletions

View File

@ -1,3 +1,10 @@
2011-10-13 Miklos Szeredi <miklos@szeredi.hu>
* Reply to request with ENOMEM in case of failure to allocate
request structure. Otherwise the task issuing the request will
just freeze up until the filesystem daemon is killed. Reported by
Stephan Kulow
2011-09-23 Miklos Szeredi <miklos@szeredi.hu>
* Replace daemon() function with fork(). Patch by Anatol Pomozov

View File

@ -2273,9 +2273,28 @@ static void fuse_ll_process_buf(void *data, const struct fuse_buf *buf,
in = buf->mem;
}
if (f->debug) {
fprintf(stderr,
"unique: %llu, opcode: %s (%i), nodeid: %lu, insize: %zu, pid: %u\n",
(unsigned long long) in->unique,
opname((enum fuse_opcode) in->opcode), in->opcode,
(unsigned long) in->nodeid, buf->size, in->pid);
}
req = fuse_ll_alloc_req(f);
if (req == NULL)
if (req == NULL) {
struct fuse_out_header out = {
.unique = in->unique,
.error = -ENOMEM,
};
struct iovec iov = {
.iov_base = &out,
.iov_len = sizeof(struct fuse_out_header),
};
fuse_send_msg(f, ch, &iov, 1);
goto clear_pipe;
}
req->unique = in->unique;
req->ctx.uid = in->uid;
@ -2283,14 +2302,6 @@ static void fuse_ll_process_buf(void *data, const struct fuse_buf *buf,
req->ctx.pid = in->pid;
req->ch = ch;
if (f->debug)
fprintf(stderr,
"unique: %llu, opcode: %s (%i), nodeid: %lu, insize: %zu, pid: %u\n",
(unsigned long long) in->unique,
opname((enum fuse_opcode) in->opcode), in->opcode,
(unsigned long) in->nodeid, buf->size, in->pid);
err = EIO;
if (!f->got_init) {
enum fuse_opcode expected;