diff options
author | Markus Armbruster <armbru@redhat.com> | 2011-01-28 11:21:46 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-01-31 11:59:24 +0100 |
commit | 319ae529b8d55ea60b1036809aaab2130048d0e1 (patch) | |
tree | 3740e9a82f9de67de48abb76a8c35bd855f818b5 /blockdev.h | |
parent | 5645b0f4f2185437d8df03810ce9c102cc4c90db (diff) | |
download | qemu-319ae529b8d55ea60b1036809aaab2130048d0e1.tar.gz qemu-319ae529b8d55ea60b1036809aaab2130048d0e1.tar.bz2 qemu-319ae529b8d55ea60b1036809aaab2130048d0e1.zip |
blockdev: Fix drive_add for drives without media
Watch this:
(qemu) drive_add 0 if=none
(qemu) info block
none0: type=hd removable=0 [not inserted]
(qemu) drive_del none0
Segmentation fault (core dumped)
add_init_drive() is confused about drive_init()'s failure modes, and
cleans up when it shouldn't. This leaves the DriveInfo with member
opts dangling. drive_del attempts to free it, and dies.
drive_init() behaves as follows:
* If it created a drive with media, it returns its DriveInfo.
* If it created a drive without media, it clears *fatal_error and
returns NULL.
* If it couldn't create a drive, it sets *fatal_error and returns
NULL.
Of its three callers:
* drive_init_func() is correct.
* usb_msd_init() assumes drive_init() failed when it returns NULL.
This is correct only because it always passes option "file", and
"drive without media" can't happen then.
* add_init_drive() assumes drive_init() failed when it returns NULL.
This is incorrect.
Clean up drive_init() to return NULL on failure and only on failure.
Drop its parameter fatal_error.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.h')
-rw-r--r-- | blockdev.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/blockdev.h b/blockdev.h index e5d8c56bfb..84e462ab3f 100644 --- a/blockdev.h +++ b/blockdev.h @@ -48,7 +48,7 @@ DriveInfo *drive_get_by_blockdev(BlockDriverState *bs); QemuOpts *drive_def(const char *optstr); QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file, const char *optstr); -DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi, int *fatal_error); +DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi); /* device-hotplug */ |