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: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
9d9b4b640f
commit
bfe1a14c18
@ -1615,10 +1615,11 @@ static void send_qmp_error_event(BlockBackend *blk,
|
|||||||
bool is_read, int error)
|
bool is_read, int error)
|
||||||
{
|
{
|
||||||
IoOperationType optype;
|
IoOperationType optype;
|
||||||
|
BlockDriverState *bs = blk_bs(blk);
|
||||||
|
|
||||||
optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
|
optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
|
||||||
qapi_event_send_block_io_error(blk_name(blk),
|
qapi_event_send_block_io_error(blk_name(blk), !!bs,
|
||||||
bdrv_get_node_name(blk_bs(blk)), optype,
|
bs ? bdrv_get_node_name(bs) : NULL, optype,
|
||||||
action, blk_iostatus_is_enabled(blk),
|
action, blk_iostatus_is_enabled(blk),
|
||||||
error == ENOSPC, strerror(error),
|
error == ENOSPC, strerror(error),
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
@ -3676,7 +3676,8 @@
|
|||||||
#
|
#
|
||||||
# @node-name: node name. Note that errors may be reported for the root node
|
# @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
|
# 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
|
# @operation: I/O operation
|
||||||
#
|
#
|
||||||
@ -3707,7 +3708,8 @@
|
|||||||
#
|
#
|
||||||
##
|
##
|
||||||
{ 'event': 'BLOCK_IO_ERROR',
|
{ 'event': 'BLOCK_IO_ERROR',
|
||||||
'data': { 'device': 'str', 'node-name': 'str', 'operation': 'IoOperationType',
|
'data': { 'device': 'str', '*node-name': 'str',
|
||||||
|
'operation': 'IoOperationType',
|
||||||
'action': 'BlockErrorAction', '*nospace': 'bool',
|
'action': 'BlockErrorAction', '*nospace': 'bool',
|
||||||
'reason': 'str' } }
|
'reason': 'str' } }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user