From f0197c653e4601776128061d7624ded313c059fd Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 25 Feb 2012 17:34:21 +0000 Subject: [PATCH] * Backport a fix to qemu-kvm to prevent "qemu-img convert" from creating corrupt VirtualBox images. (https://bugs.launchpad.net/qemu/+bug/919242) svn path=/nixpkgs/trunk/; revision=32560 --- pkgs/os-specific/linux/qemu-kvm/default.nix | 2 +- .../qemu-kvm/qemu-img-fix-corrupt-vdi.patch | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/linux/qemu-kvm/qemu-img-fix-corrupt-vdi.patch diff --git a/pkgs/os-specific/linux/qemu-kvm/default.nix b/pkgs/os-specific/linux/qemu-kvm/default.nix index 821084c1b33..aa92b2f2d0d 100644 --- a/pkgs/os-specific/linux/qemu-kvm/default.nix +++ b/pkgs/os-specific/linux/qemu-kvm/default.nix @@ -11,7 +11,7 @@ stdenv.mkDerivation rec { sha256 = "0gkk96yid3nq8i4z8xbiarj0r9v7b2zavf5mnh0rc7kclzxa7mmf"; }; - patches = [ ./smb-tmpdir.patch ]; + patches = [ ./smb-tmpdir.patch ./qemu-img-fix-corrupt-vdi.patch ]; configureFlags = "--audio-drv-list=alsa"; diff --git a/pkgs/os-specific/linux/qemu-kvm/qemu-img-fix-corrupt-vdi.patch b/pkgs/os-specific/linux/qemu-kvm/qemu-img-fix-corrupt-vdi.patch new file mode 100644 index 00000000000..446a69a146b --- /dev/null +++ b/pkgs/os-specific/linux/qemu-kvm/qemu-img-fix-corrupt-vdi.patch @@ -0,0 +1,27 @@ +From http://patchwork.ozlabs.org/patch/137186/ + +diff -ru qemu-kvm-0.15.1-orig/block/vdi.c qemu-kvm-0.15.1/block/vdi.c +--- qemu-kvm-0.15.1-orig/block/vdi.c 2011-10-19 15:54:48.000000000 +0200 ++++ qemu-kvm-0.15.1/block/vdi.c 2012-02-25 18:15:36.114574574 +0100 +@@ -1,7 +1,7 @@ + /* + * Block driver for the Virtual Disk Image (VDI) format + * +- * Copyright (c) 2009 Stefan Weil ++ * Copyright (c) 2009, 2012 Stefan Weil + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -767,8 +767,12 @@ + acb->header_modified = 1; + } + acb->bmap_last = block_index; ++ /* Copy data to be written to new block and zero unused parts. */ ++ memset(block, 0, sector_in_block * SECTOR_SIZE); + memcpy(block + sector_in_block * SECTOR_SIZE, + acb->buf, n_sectors * SECTOR_SIZE); ++ memset(block + (sector_in_block + n_sectors) * SECTOR_SIZE, 0, ++ (s->block_sectors - n_sectors - sector_in_block) * SECTOR_SIZE); + acb->hd_iov.iov_base = (void *)block; + acb->hd_iov.iov_len = s->block_size; + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);