Commit bfe1a14c authored by Kevin Wolf's avatar Kevin Wolf
Browse files

block: Fix NULL dereference on empty drive error



blk_error_action() sends a BLOCK_IO_ERROR QMP event which includes the
node name of its root node. If the BlockBackend represents an empty
drive, there is no root node, so we should not try to access its node
name. Make the field optional in the event and include it only when
the BlockBackend isn't empty.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
parent 9d9b4b64
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1615,10 +1615,11 @@ static void send_qmp_error_event(BlockBackend *blk,
                                 bool is_read, int error)
{
    IoOperationType optype;
    BlockDriverState *bs = blk_bs(blk);

    optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
    qapi_event_send_block_io_error(blk_name(blk),
                                   bdrv_get_node_name(blk_bs(blk)), optype,
    qapi_event_send_block_io_error(blk_name(blk), !!bs,
                                   bs ? bdrv_get_node_name(bs) : NULL, optype,
                                   action, blk_iostatus_is_enabled(blk),
                                   error == ENOSPC, strerror(error),
                                   &error_abort);
+4 −2
Original line number Diff line number Diff line
@@ -3676,7 +3676,8 @@
#
# @node-name: node name. Note that errors may be reported for the root node
#             that is directly attached to a guest device rather than for the
#             node where the error occurred. (Since: 2.8)
#             node where the error occurred. The node name is not present if
#             the drive is empty. (Since: 2.8)
#
# @operation: I/O operation
#
@@ -3707,7 +3708,8 @@
#
##
{ 'event': 'BLOCK_IO_ERROR',
  'data': { 'device': 'str', 'node-name': 'str', 'operation': 'IoOperationType',
  'data': { 'device': 'str', '*node-name': 'str',
            'operation': 'IoOperationType',
            'action': 'BlockErrorAction', '*nospace': 'bool',
            'reason': 'str' } }