spapr_drc: Handle visitor errors properly
Since prop_get_fdt() is only used with QmpOutputVisitor, errors shouldn't actually happen, so this is only a latent bug. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
4c65fed8bd
commit
c75304a139
@ -254,6 +254,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, void *opaque,
|
|||||||
const char *name, Error **errp)
|
const char *name, Error **errp)
|
||||||
{
|
{
|
||||||
sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
|
sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
|
||||||
|
Error *err = NULL;
|
||||||
int fdt_offset_next, fdt_offset, fdt_depth;
|
int fdt_offset_next, fdt_offset, fdt_depth;
|
||||||
void *fdt;
|
void *fdt;
|
||||||
|
|
||||||
@ -276,24 +277,43 @@ static void prop_get_fdt(Object *obj, Visitor *v, void *opaque,
|
|||||||
case FDT_BEGIN_NODE:
|
case FDT_BEGIN_NODE:
|
||||||
fdt_depth++;
|
fdt_depth++;
|
||||||
name = fdt_get_name(fdt, fdt_offset, &name_len);
|
name = fdt_get_name(fdt, fdt_offset, &name_len);
|
||||||
visit_start_struct(v, NULL, NULL, name, 0, NULL);
|
visit_start_struct(v, NULL, NULL, name, 0, &err);
|
||||||
|
if (err) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FDT_END_NODE:
|
case FDT_END_NODE:
|
||||||
/* shouldn't ever see an FDT_END_NODE before FDT_BEGIN_NODE */
|
/* shouldn't ever see an FDT_END_NODE before FDT_BEGIN_NODE */
|
||||||
g_assert(fdt_depth > 0);
|
g_assert(fdt_depth > 0);
|
||||||
visit_end_struct(v, NULL);
|
visit_end_struct(v, &err);
|
||||||
|
if (err) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
fdt_depth--;
|
fdt_depth--;
|
||||||
break;
|
break;
|
||||||
case FDT_PROP: {
|
case FDT_PROP: {
|
||||||
int i;
|
int i;
|
||||||
prop = fdt_get_property_by_offset(fdt, fdt_offset, &prop_len);
|
prop = fdt_get_property_by_offset(fdt, fdt_offset, &prop_len);
|
||||||
name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
|
name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
|
||||||
visit_start_list(v, name, NULL);
|
visit_start_list(v, name, &err);
|
||||||
for (i = 0; i < prop_len; i++) {
|
if (err) {
|
||||||
visit_type_uint8(v, (uint8_t *)&prop->data[i], NULL, NULL);
|
error_propagate(errp, err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i = 0; i < prop_len; i++) {
|
||||||
|
visit_type_uint8(v, (uint8_t *)&prop->data[i], NULL, &err);
|
||||||
|
if (err) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
visit_end_list(v, &err);
|
||||||
|
if (err) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
visit_end_list(v, NULL);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user