block: Fix missing ERRP_GUARD() for error_prepend()
As the comment in qapi/error, passing @errp to error_prepend() requires ERRP_GUARD(): * = Why, when and how to use ERRP_GUARD() = * * Without ERRP_GUARD(), use of the @errp parameter is restricted: ... * - It should not be passed to error_prepend(), error_vprepend() or * error_append_hint(), because that doesn't work with &error_fatal. * ERRP_GUARD() lifts these restrictions. * * To use ERRP_GUARD(), add it right at the beginning of the function. * @errp can then be used without worrying about the argument being * NULL or &error_fatal. ERRP_GUARD() could avoid the case when @errp is &error_fatal, the user can't see this additional information, because exit() happens in error_setg earlier than information is added [1]. In block.c, there are 4 functions passing @errp to error_prepend() without ERRP_GUARD(): - bdrv_co_create_opts_simple() - parse_json_filename() - bdrv_open_backing_file() - bdrv_append_temp_snapshot() bdrv_co_create_opts_simple(), is an implementation of BlockDriver.bdrv_co_create_opts(). There are too many possible callers to check the impact of this defect; it may or may not be harmless. Thus it is necessary to protect @errp with ERRP_GUARD(). Though the @errp parameters passed to parse_json_filename(), bdrv_open_backing_file() and bdrv_append_temp_snapshot() points to their callers' local_err, to follow the requirement of @errp, also add missing ERRP_GUARD() at their beginning. [1]: Issue description in the commit message of commit ae7c80a7bd73 ("error: New macro ERRP_GUARD()"). Cc: Kevin Wolf <kwolf@redhat.com> Cc: Hanna Reitz <hreitz@redhat.com> Cc: qemu-block@nongnu.org Signed-off-by: Zhao Liu <zhao1.liu@intel.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-ID: <20240311033822.3142585-4-zhao1.liu@linux.intel.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
c1cccad865
commit
7b22e05582
4
block.c
4
block.c
@ -633,6 +633,7 @@ int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
|||||||
QemuOpts *opts,
|
QemuOpts *opts,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
QDict *options;
|
QDict *options;
|
||||||
int64_t size = 0;
|
int64_t size = 0;
|
||||||
@ -1998,6 +1999,7 @@ fail_opts:
|
|||||||
|
|
||||||
static QDict *parse_json_filename(const char *filename, Error **errp)
|
static QDict *parse_json_filename(const char *filename, Error **errp)
|
||||||
{
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
QObject *options_obj;
|
QObject *options_obj;
|
||||||
QDict *options;
|
QDict *options;
|
||||||
int ret;
|
int ret;
|
||||||
@ -3585,6 +3587,7 @@ int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
|
|||||||
int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
||||||
const char *bdref_key, Error **errp)
|
const char *bdref_key, Error **errp)
|
||||||
{
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
char *backing_filename = NULL;
|
char *backing_filename = NULL;
|
||||||
char *bdref_key_dot;
|
char *bdref_key_dot;
|
||||||
const char *reference = NULL;
|
const char *reference = NULL;
|
||||||
@ -3851,6 +3854,7 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
|
|||||||
QDict *snapshot_options,
|
QDict *snapshot_options,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
g_autofree char *tmp_filename = NULL;
|
g_autofree char *tmp_filename = NULL;
|
||||||
int64_t total_size;
|
int64_t total_size;
|
||||||
QemuOpts *opts = NULL;
|
QemuOpts *opts = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user