aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSripathi Kodi <sripathik@in.ibm.com>2010-09-20 23:24:29 +0530
committerAnthony Liguori <aliguori@us.ibm.com>2010-10-20 12:10:58 -0500
commitab03b63d7a9c7978d51e56c191f0b86888d121dc (patch)
treecac6eeb4fe977ef75a62a34a31379ca501e4e572
parenta12c668f0a44bbbb7b9bc2b852c62f6864c8b92d (diff)
downloadqemu-ab03b63d7a9c7978d51e56c191f0b86888d121dc.zip
qemu-ab03b63d7a9c7978d51e56c191f0b86888d121dc.tar.gz
qemu-ab03b63d7a9c7978d51e56c191f0b86888d121dc.tar.bz2
[virtio-9p] open should not return EBADF
When 9P server fails to create a file due to permission problems it should return EPERM. However the current 9P2000.L code returns EBADF. EBADF is NOT a valid return value from open() call. The problem is because we do not preserve the errno variable properly. If the file open had failed, the call to close() on the fd in v9fs_post_lcreate() fails and sets errno to EBADF. We should preserve the errno that we got from open() and we should call close() only if we had a valid fd. Signed-off-by: Sripathi Kodi <sripathik@in.ibm.com> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
-rw-r--r--hw/virtio-9p.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
index 3b2d49c..3379a30 100644
--- a/hw/virtio-9p.c
+++ b/hw/virtio-9p.c
@@ -1760,8 +1760,10 @@ static void v9fs_post_lcreate(V9fsState *s, V9fsLcreateState *vs, int err)
err = vs->offset;
} else {
vs->fidp->fid_type = P9_FID_NONE;
- close(vs->fidp->fs.fd);
err = -errno;
+ if (vs->fidp->fs.fd > 0) {
+ close(vs->fidp->fs.fd);
+ }
}
complete_pdu(s, vs->pdu, err);