Message ID | CAHOaf96qxm6_qigD+DuoJ5GpS9rOqXe4Gv=2UnujiiwcfN0HHQ@mail.gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | qom: fix objects with improper parent type | expand |
On Tue, 29 Sep 2020 16:47:14 -0700 Sergey Nizovtsev <snizovtsev@gmail.com> wrote: > Some objects accidentally inherit ObjectClass instead of Object. > They compile silently but may crash after downcasting. > > In this patch, we introduce a coccinelle script to find broken > declarations and fix them manually with proper base type. > > Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> nice catch, Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > scripts/coccinelle/qobject-parent-type.cocci | 26 ++++++++++++++++++++ > include/hw/acpi/vmgenid.h | 2 +- > include/hw/misc/vmcoreinfo.h | 2 +- > include/net/can_host.h | 2 +- > MAINTAINERS | 1 + > 5 files changed, 30 insertions(+), 3 deletions(-) > create mode 100644 scripts/coccinelle/qobject-parent-type.cocci > > diff --git a/scripts/coccinelle/qobject-parent-type.cocci > b/scripts/coccinelle/qobject-parent-type.cocci > new file mode 100644 > index 0000000000..9afb3edd97 > --- /dev/null > +++ b/scripts/coccinelle/qobject-parent-type.cocci > @@ -0,0 +1,26 @@ > +// Highlight object declarations that don't look like object class but > +// accidentally inherit from it. > + > +@match@ > +identifier obj_t, fld; > +type parent_t =~ ".*Class$"; > +@@ > +struct obj_t { > + parent_t fld; > + ... > +}; > + > +@script:python filter depends on match@ > +obj_t << match.obj_t; > +@@ > +is_class_obj = obj_t.endswith('Class') > +cocci.include_match(not is_class_obj) > + > +@replacement depends on filter@ > +identifier match.obj_t, match.fld; > +type match.parent_t; > +@@ > +struct obj_t { > +* parent_t fld; > + ... > +}; > diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h > index d50fbacb8e..cb4ad37fc5 100644 > --- a/include/hw/acpi/vmgenid.h > +++ b/include/hw/acpi/vmgenid.h > @@ -19,7 +19,7 @@ > OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) > > struct VmGenIdState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > QemuUUID guid; /* The 128-bit GUID seen by the guest */ > uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */ > }; > diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h > index ebada6617a..0b7b55d400 100644 > --- a/include/hw/misc/vmcoreinfo.h > +++ b/include/hw/misc/vmcoreinfo.h > @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO, > typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; > > struct VMCoreInfoState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > > bool has_vmcoreinfo; > FWCfgVMCoreInfo vmcoreinfo; > diff --git a/include/net/can_host.h b/include/net/can_host.h > index 4e3ce3f954..caab71bdda 100644 > --- a/include/net/can_host.h > +++ b/include/net/can_host.h > @@ -35,7 +35,7 @@ > OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) > > struct CanHostState { > - ObjectClass oc; > + Object oc; > > CanBusState *bus; > CanBusClientState bus_client; > diff --git a/MAINTAINERS b/MAINTAINERS > index 5eed1e692b..2160b8196a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -2402,6 +2402,7 @@ F: qobject/ > F: include/qapi/qmp/ > X: include/qapi/qmp/dispatch.h > F: scripts/coccinelle/qobject.cocci > +F: scripts/coccinelle/qobject-parent-type.cocci > F: tests/check-qdict.c > F: tests/check-qjson.c > F: tests/check-qlist.c
On Wed, Sep 30, 2020 at 3:47 AM Sergey Nizovtsev <snizovtsev@gmail.com> wrote: > > Some objects accidentally inherit ObjectClass instead of Object. > They compile silently but may crash after downcasting. > > In this patch, we introduce a coccinelle script to find broken > declarations and fix them manually with proper base type. > > Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> thanks!! Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > scripts/coccinelle/qobject-parent-type.cocci | 26 ++++++++++++++++++++ > include/hw/acpi/vmgenid.h | 2 +- > include/hw/misc/vmcoreinfo.h | 2 +- > include/net/can_host.h | 2 +- > MAINTAINERS | 1 + > 5 files changed, 30 insertions(+), 3 deletions(-) > create mode 100644 scripts/coccinelle/qobject-parent-type.cocci > > diff --git a/scripts/coccinelle/qobject-parent-type.cocci > b/scripts/coccinelle/qobject-parent-type.cocci > new file mode 100644 > index 0000000000..9afb3edd97 > --- /dev/null > +++ b/scripts/coccinelle/qobject-parent-type.cocci > @@ -0,0 +1,26 @@ > +// Highlight object declarations that don't look like object class but > +// accidentally inherit from it. > + > +@match@ > +identifier obj_t, fld; > +type parent_t =~ ".*Class$"; > +@@ > +struct obj_t { > + parent_t fld; > + ... > +}; > + > +@script:python filter depends on match@ > +obj_t << match.obj_t; > +@@ > +is_class_obj = obj_t.endswith('Class') > +cocci.include_match(not is_class_obj) > + > +@replacement depends on filter@ > +identifier match.obj_t, match.fld; > +type match.parent_t; > +@@ > +struct obj_t { > +* parent_t fld; > + ... > +}; > diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h > index d50fbacb8e..cb4ad37fc5 100644 > --- a/include/hw/acpi/vmgenid.h > +++ b/include/hw/acpi/vmgenid.h > @@ -19,7 +19,7 @@ > OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) > > struct VmGenIdState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > QemuUUID guid; /* The 128-bit GUID seen by the guest */ > uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */ > }; > diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h > index ebada6617a..0b7b55d400 100644 > --- a/include/hw/misc/vmcoreinfo.h > +++ b/include/hw/misc/vmcoreinfo.h > @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO, > typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; > > struct VMCoreInfoState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > > bool has_vmcoreinfo; > FWCfgVMCoreInfo vmcoreinfo; > diff --git a/include/net/can_host.h b/include/net/can_host.h > index 4e3ce3f954..caab71bdda 100644 > --- a/include/net/can_host.h > +++ b/include/net/can_host.h > @@ -35,7 +35,7 @@ > OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) > > struct CanHostState { > - ObjectClass oc; > + Object oc; > > CanBusState *bus; > CanBusClientState bus_client; > diff --git a/MAINTAINERS b/MAINTAINERS > index 5eed1e692b..2160b8196a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -2402,6 +2402,7 @@ F: qobject/ > F: include/qapi/qmp/ > X: include/qapi/qmp/dispatch.h > F: scripts/coccinelle/qobject.cocci > +F: scripts/coccinelle/qobject-parent-type.cocci > F: tests/check-qdict.c > F: tests/check-qjson.c > F: tests/check-qlist.c > -- > 2.28.0 >
On Tue, Sep 29, 2020 at 04:47:14PM -0700, Sergey Nizovtsev wrote: > Some objects accidentally inherit ObjectClass instead of Object. > They compile silently but may crash after downcasting. > > In this patch, we introduce a coccinelle script to find broken > declarations and fix them manually with proper base type. > > Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> which tree should this go in through? > --- > scripts/coccinelle/qobject-parent-type.cocci | 26 ++++++++++++++++++++ > include/hw/acpi/vmgenid.h | 2 +- > include/hw/misc/vmcoreinfo.h | 2 +- > include/net/can_host.h | 2 +- > MAINTAINERS | 1 + > 5 files changed, 30 insertions(+), 3 deletions(-) > create mode 100644 scripts/coccinelle/qobject-parent-type.cocci > > diff --git a/scripts/coccinelle/qobject-parent-type.cocci > b/scripts/coccinelle/qobject-parent-type.cocci > new file mode 100644 > index 0000000000..9afb3edd97 > --- /dev/null > +++ b/scripts/coccinelle/qobject-parent-type.cocci > @@ -0,0 +1,26 @@ > +// Highlight object declarations that don't look like object class but > +// accidentally inherit from it. > + > +@match@ > +identifier obj_t, fld; > +type parent_t =~ ".*Class$"; > +@@ > +struct obj_t { > + parent_t fld; > + ... > +}; > + > +@script:python filter depends on match@ > +obj_t << match.obj_t; > +@@ > +is_class_obj = obj_t.endswith('Class') > +cocci.include_match(not is_class_obj) > + > +@replacement depends on filter@ > +identifier match.obj_t, match.fld; > +type match.parent_t; > +@@ > +struct obj_t { > +* parent_t fld; > + ... > +}; > diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h > index d50fbacb8e..cb4ad37fc5 100644 > --- a/include/hw/acpi/vmgenid.h > +++ b/include/hw/acpi/vmgenid.h > @@ -19,7 +19,7 @@ > OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) > > struct VmGenIdState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > QemuUUID guid; /* The 128-bit GUID seen by the guest */ > uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */ > }; > diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h > index ebada6617a..0b7b55d400 100644 > --- a/include/hw/misc/vmcoreinfo.h > +++ b/include/hw/misc/vmcoreinfo.h > @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO, > typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; > > struct VMCoreInfoState { > - DeviceClass parent_obj; > + DeviceState parent_obj; > > bool has_vmcoreinfo; > FWCfgVMCoreInfo vmcoreinfo; > diff --git a/include/net/can_host.h b/include/net/can_host.h > index 4e3ce3f954..caab71bdda 100644 > --- a/include/net/can_host.h > +++ b/include/net/can_host.h > @@ -35,7 +35,7 @@ > OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) > > struct CanHostState { > - ObjectClass oc; > + Object oc; > > CanBusState *bus; > CanBusClientState bus_client; > diff --git a/MAINTAINERS b/MAINTAINERS > index 5eed1e692b..2160b8196a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -2402,6 +2402,7 @@ F: qobject/ > F: include/qapi/qmp/ > X: include/qapi/qmp/dispatch.h > F: scripts/coccinelle/qobject.cocci > +F: scripts/coccinelle/qobject-parent-type.cocci > F: tests/check-qdict.c > F: tests/check-qjson.c > F: tests/check-qlist.c > -- > 2.28.0
On Tue, 2020-10-06 at 01:55 -0400, Michael S. Tsirkin wrote: > On Tue, Sep 29, 2020 at 04:47:14PM -0700, Sergey Nizovtsev wrote: > > Some objects accidentally inherit ObjectClass instead of Object. > > They compile silently but may crash after downcasting. > > > > In this patch, we introduce a coccinelle script to find broken > > declarations and fix them manually with proper base type. > > > > Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> > > Reviewed-by: Michael S. Tsirkin <mst@redhat.com> > > which tree should this go in through? Well, since this may only affect some generic QOM walking code, i suggest it goes in QOM/QObject/QMP related tree. So, `scripts/get_maintainer.pl -f qom/object.c`: +CC Paolo Bonzini <pbonzini@redhat.com> -CC Ben Warren <ben@skyportsystems.com> On Tue, 2020-10-06 at 00:06 +0400, Marc-André Lureau wrote: > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> On Mon, 2020-10-05 at 18:47 +0200, Igor Mammedov wrote: > Reviewed-by: Igor Mammedov <imammedo@redhat.com> > > > --- > > scripts/coccinelle/qobject-parent-type.cocci | 26 > > ++++++++++++++++++++ > > include/hw/acpi/vmgenid.h | 2 +- > > include/hw/misc/vmcoreinfo.h | 2 +- > > include/net/can_host.h | 2 +- > > MAINTAINERS | 1 + > > 5 files changed, 30 insertions(+), 3 deletions(-) > > create mode 100644 scripts/coccinelle/qobject-parent-type.cocci > > > > diff --git a/scripts/coccinelle/qobject-parent-type.cocci > > b/scripts/coccinelle/qobject-parent-type.cocci > > new file mode 100644 > > index 0000000000..9afb3edd97 > > --- /dev/null > > +++ b/scripts/coccinelle/qobject-parent-type.cocci > > @@ -0,0 +1,26 @@ > > +// Highlight object declarations that don't look like object class > > but > > +// accidentally inherit from it. > > + > > +@match@ > > +identifier obj_t, fld; > > +type parent_t =~ ".*Class$"; > > +@@ > > +struct obj_t { > > + parent_t fld; > > + ... > > +}; > > + > > +@script:python filter depends on match@ > > +obj_t << match.obj_t; > > +@@ > > +is_class_obj = obj_t.endswith('Class') > > +cocci.include_match(not is_class_obj) > > + > > +@replacement depends on filter@ > > +identifier match.obj_t, match.fld; > > +type match.parent_t; > > +@@ > > +struct obj_t { > > +* parent_t fld; > > + ... > > +}; > > diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h > > index d50fbacb8e..cb4ad37fc5 100644 > > --- a/include/hw/acpi/vmgenid.h > > +++ b/include/hw/acpi/vmgenid.h > > @@ -19,7 +19,7 @@ > > OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) > > > > struct VmGenIdState { > > - DeviceClass parent_obj; > > + DeviceState parent_obj; > > QemuUUID guid; /* The 128-bit GUID seen by the > > guest */ > > uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little- > > endian) */ > > }; > > diff --git a/include/hw/misc/vmcoreinfo.h > > b/include/hw/misc/vmcoreinfo.h > > index ebada6617a..0b7b55d400 100644 > > --- a/include/hw/misc/vmcoreinfo.h > > +++ b/include/hw/misc/vmcoreinfo.h > > @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, > > VMCOREINFO, > > typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; > > > > struct VMCoreInfoState { > > - DeviceClass parent_obj; > > + DeviceState parent_obj; > > > > bool has_vmcoreinfo; > > FWCfgVMCoreInfo vmcoreinfo; > > diff --git a/include/net/can_host.h b/include/net/can_host.h > > index 4e3ce3f954..caab71bdda 100644 > > --- a/include/net/can_host.h > > +++ b/include/net/can_host.h > > @@ -35,7 +35,7 @@ > > OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) > > > > struct CanHostState { > > - ObjectClass oc; > > + Object oc; > > > > CanBusState *bus; > > CanBusClientState bus_client; > > diff --git a/MAINTAINERS b/MAINTAINERS > > index 5eed1e692b..2160b8196a 100644 > > --- a/MAINTAINERS > > +++ b/MAINTAINERS > > @@ -2402,6 +2402,7 @@ F: qobject/ > > F: include/qapi/qmp/ > > X: include/qapi/qmp/dispatch.h > > F: scripts/coccinelle/qobject.cocci > > +F: scripts/coccinelle/qobject-parent-type.cocci > > F: tests/check-qdict.c > > F: tests/check-qjson.c > > F: tests/check-qlist.c > > -- > > 2.28.0
On 06/10/20 21:20, snizovtsev@gmail.com wrote: > On Tue, 2020-10-06 at 01:55 -0400, Michael S. Tsirkin wrote: >> On Tue, Sep 29, 2020 at 04:47:14PM -0700, Sergey Nizovtsev wrote: >>> Some objects accidentally inherit ObjectClass instead of Object. >>> They compile silently but may crash after downcasting. >>> >>> In this patch, we introduce a coccinelle script to find broken >>> declarations and fix them manually with proper base type. >>> >>> Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> >> >> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> >> >> which tree should this go in through? > > Well, since this may only affect some generic QOM walking code, i > suggest it goes in QOM/QObject/QMP related tree. > > So, `scripts/get_maintainer.pl -f qom/object.c`: > > +CC Paolo Bonzini <pbonzini@redhat.com> > -CC Ben Warren <ben@skyportsystems.com> Queued, thanks. Paolo > On Tue, 2020-10-06 at 00:06 +0400, Marc-André Lureau wrote: >> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > > On Mon, 2020-10-05 at 18:47 +0200, Igor Mammedov wrote: >> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > >> >>> --- >>> scripts/coccinelle/qobject-parent-type.cocci | 26 >>> ++++++++++++++++++++ >>> include/hw/acpi/vmgenid.h | 2 +- >>> include/hw/misc/vmcoreinfo.h | 2 +- >>> include/net/can_host.h | 2 +- >>> MAINTAINERS | 1 + >>> 5 files changed, 30 insertions(+), 3 deletions(-) >>> create mode 100644 scripts/coccinelle/qobject-parent-type.cocci >>> >>> diff --git a/scripts/coccinelle/qobject-parent-type.cocci >>> b/scripts/coccinelle/qobject-parent-type.cocci >>> new file mode 100644 >>> index 0000000000..9afb3edd97 >>> --- /dev/null >>> +++ b/scripts/coccinelle/qobject-parent-type.cocci >>> @@ -0,0 +1,26 @@ >>> +// Highlight object declarations that don't look like object class >>> but >>> +// accidentally inherit from it. >>> + >>> +@match@ >>> +identifier obj_t, fld; >>> +type parent_t =~ ".*Class$"; >>> +@@ >>> +struct obj_t { >>> + parent_t fld; >>> + ... >>> +}; >>> + >>> +@script:python filter depends on match@ >>> +obj_t << match.obj_t; >>> +@@ >>> +is_class_obj = obj_t.endswith('Class') >>> +cocci.include_match(not is_class_obj) >>> + >>> +@replacement depends on filter@ >>> +identifier match.obj_t, match.fld; >>> +type match.parent_t; >>> +@@ >>> +struct obj_t { >>> +* parent_t fld; >>> + ... >>> +}; >>> diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h >>> index d50fbacb8e..cb4ad37fc5 100644 >>> --- a/include/hw/acpi/vmgenid.h >>> +++ b/include/hw/acpi/vmgenid.h >>> @@ -19,7 +19,7 @@ >>> OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) >>> >>> struct VmGenIdState { >>> - DeviceClass parent_obj; >>> + DeviceState parent_obj; >>> QemuUUID guid; /* The 128-bit GUID seen by the >>> guest */ >>> uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little- >>> endian) */ >>> }; >>> diff --git a/include/hw/misc/vmcoreinfo.h >>> b/include/hw/misc/vmcoreinfo.h >>> index ebada6617a..0b7b55d400 100644 >>> --- a/include/hw/misc/vmcoreinfo.h >>> +++ b/include/hw/misc/vmcoreinfo.h >>> @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, >>> VMCOREINFO, >>> typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; >>> >>> struct VMCoreInfoState { >>> - DeviceClass parent_obj; >>> + DeviceState parent_obj; >>> >>> bool has_vmcoreinfo; >>> FWCfgVMCoreInfo vmcoreinfo; >>> diff --git a/include/net/can_host.h b/include/net/can_host.h >>> index 4e3ce3f954..caab71bdda 100644 >>> --- a/include/net/can_host.h >>> +++ b/include/net/can_host.h >>> @@ -35,7 +35,7 @@ >>> OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) >>> >>> struct CanHostState { >>> - ObjectClass oc; >>> + Object oc; >>> >>> CanBusState *bus; >>> CanBusClientState bus_client; >>> diff --git a/MAINTAINERS b/MAINTAINERS >>> index 5eed1e692b..2160b8196a 100644 >>> --- a/MAINTAINERS >>> +++ b/MAINTAINERS >>> @@ -2402,6 +2402,7 @@ F: qobject/ >>> F: include/qapi/qmp/ >>> X: include/qapi/qmp/dispatch.h >>> F: scripts/coccinelle/qobject.cocci >>> +F: scripts/coccinelle/qobject-parent-type.cocci >>> F: tests/check-qdict.c >>> F: tests/check-qjson.c >>> F: tests/check-qlist.c >>> -- >>> 2.28.0 >
diff --git a/scripts/coccinelle/qobject-parent-type.cocci b/scripts/coccinelle/qobject-parent-type.cocci new file mode 100644 index 0000000000..9afb3edd97 --- /dev/null +++ b/scripts/coccinelle/qobject-parent-type.cocci @@ -0,0 +1,26 @@ +// Highlight object declarations that don't look like object class but +// accidentally inherit from it. + +@match@ +identifier obj_t, fld; +type parent_t =~ ".*Class$"; +@@ +struct obj_t { + parent_t fld; + ... +}; + +@script:python filter depends on match@ +obj_t << match.obj_t; +@@ +is_class_obj = obj_t.endswith('Class') +cocci.include_match(not is_class_obj) + +@replacement depends on filter@ +identifier match.obj_t, match.fld; +type match.parent_t; +@@ +struct obj_t { +* parent_t fld; + ... +}; diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h index d50fbacb8e..cb4ad37fc5 100644 --- a/include/hw/acpi/vmgenid.h +++ b/include/hw/acpi/vmgenid.h @@ -19,7 +19,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) struct VmGenIdState { - DeviceClass parent_obj; + DeviceState parent_obj; QemuUUID guid; /* The 128-bit GUID seen by the guest */ uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */ }; diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h index ebada6617a..0b7b55d400 100644 --- a/include/hw/misc/vmcoreinfo.h +++ b/include/hw/misc/vmcoreinfo.h @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO, typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; struct VMCoreInfoState { - DeviceClass parent_obj; + DeviceState parent_obj; bool has_vmcoreinfo; FWCfgVMCoreInfo vmcoreinfo; diff --git a/include/net/can_host.h b/include/net/can_host.h index 4e3ce3f954..caab71bdda 100644 --- a/include/net/can_host.h +++ b/include/net/can_host.h @@ -35,7 +35,7 @@ OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) struct CanHostState { - ObjectClass oc; + Object oc; CanBusState *bus; CanBusClientState bus_client; diff --git a/MAINTAINERS b/MAINTAINERS index 5eed1e692b..2160b8196a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2402,6 +2402,7 @@ F: qobject/ F: include/qapi/qmp/ X: include/qapi/qmp/dispatch.h F: scripts/coccinelle/qobject.cocci +F: scripts/coccinelle/qobject-parent-type.cocci F: tests/check-qdict.c F: tests/check-qjson.c F: tests/check-qlist.c
Some objects accidentally inherit ObjectClass instead of Object. They compile silently but may crash after downcasting. In this patch, we introduce a coccinelle script to find broken declarations and fix them manually with proper base type. Signed-off-by: Sergey Nizovtsev <snizovtsev@gmail.com> --- scripts/coccinelle/qobject-parent-type.cocci | 26 ++++++++++++++++++++ include/hw/acpi/vmgenid.h | 2 +- include/hw/misc/vmcoreinfo.h | 2 +- include/net/can_host.h | 2 +- MAINTAINERS | 1 + 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 scripts/coccinelle/qobject-parent-type.cocci