mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-03 10:43:28 +00:00
pc-dimm: fix error handling in pc_dimm_check_memdev_is_busy()
If host_memory_backend_get_memory() were to return error and NULL MemoryRegion, pc_dimm_check_memdev_is_busy() would crash dereferencing NULL pointer in memory_region_is_mapped(). But if error is set and non NULL MemoryRegion is returned then error_setg() will fail with "error already set" assertion in error_setv() To avoid above issues use typical error handling pattern for property setters: Error *local_error = NULL; ... error_propagate(errp, local_err); Reported-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
fff4e48ed5
commit
c9f4b77ad5
@ -364,15 +364,22 @@ static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name,
|
|||||||
Object *val, Error **errp)
|
Object *val, Error **errp)
|
||||||
{
|
{
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
mr = host_memory_backend_get_memory(MEMORY_BACKEND(val), errp);
|
mr = host_memory_backend_get_memory(MEMORY_BACKEND(val), &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
if (memory_region_is_mapped(mr)) {
|
if (memory_region_is_mapped(mr)) {
|
||||||
char *path = object_get_canonical_path_component(val);
|
char *path = object_get_canonical_path_component(val);
|
||||||
error_setg(errp, "can't use already busy memdev: %s", path);
|
error_setg(&local_err, "can't use already busy memdev: %s", path);
|
||||||
g_free(path);
|
g_free(path);
|
||||||
} else {
|
} else {
|
||||||
qdev_prop_allow_set_link_before_realize(obj, name, val, errp);
|
qdev_prop_allow_set_link_before_realize(obj, name, val, &local_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
error_propagate(errp, local_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pc_dimm_init(Object *obj)
|
static void pc_dimm_init(Object *obj)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user