On Mon, Apr 25, 2011 at 6:54 PM, Sassan Panahinejad <sas...@sassan.me.uk> wrote:
Thanks for finding and fixing this. Please see this wiki page on contributing patches to QEMU: http://wiki.qemu.org/Contribute/SubmitAPatch > v9fs_fsync and possibly others break when asked to operate on a directory. > It does not check fid_type to see if it is operating on a directory and > therefore accesses the wrong element of the fs union. > This error can result in guest applications failing (in my case it was dpkg). > This patch fixes the issue, although there may be other, similar bugs in > virtio-9p. > --- > hw/virtio-9p.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) Missing Signed-off-by:. > diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c > index 7e29535..09fb5da 100644 > --- a/hw/virtio-9p.c > +++ b/hw/virtio-9p.c > @@ -1875,7 +1875,10 @@ static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu) > v9fs_post_do_fsync(s, pdu, err); > return; > } > - err = v9fs_do_fsync(s, fidp->fs.fd, datasync); > + if (fidp->fid_type == P9_FID_DIR) > + err = v9fs_do_fsync(s, dirfd(fidp->fs.dir), datasync); > + else > + err = v9fs_do_fsync(s, fidp->fs.fd, datasync); Please follow QEMU coding style and always use {} with if ... else. Stefan