[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v8 12/35] qapi: Don't cast Enum* to int*
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v8 12/35] qapi: Don't cast Enum* to int* |
Date: |
Mon, 21 Dec 2015 10:08:17 -0700 |
C compilers are allowed to represent enums as a smaller type
than int, if all enum values fit in the smaller type. There
are even compiler flags that force the use of this smaller
representation, and using them changes the ABI of a binary.
Therefore, our generated code for visit_type_ENUM() (for all
qapi enums) was wrong for casting Enum* to int* when calling
visit_type_enum().
It appears that no one has been doing this for qemu, because
if they had, we are potentially dereferencing beyond bounds
or even risking a SIGBUS on platforms where unaligned pointer
dereferencing is fatal. Better is to avoid the practice
entirely, and just use the correct types.
This matches the fix for alternate qapi types, done earlier in
"qapi: Simplify visiting of alternate types".
Signed-off-by: Eric Blake <address@hidden>
---
v8: no change
v7: rebase on typo fix
v6: new patch
---
scripts/qapi-visit.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 4a4f67d..6bd188b 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -178,12 +178,13 @@ out:
def gen_visit_enum(name):
- # FIXME cast from enum *obj to int * invalidly assumes enum is int
return mcgen('''
void visit_type_%(c_name)s(Visitor *v, %(c_name)s *obj, const char *name,
Error **errp)
{
- visit_type_enum(v, (int *)obj, %(c_name)s_lookup, "%(name)s", name, errp);
+ int tmp = *obj;
+ visit_type_enum(v, &tmp, %(c_name)s_lookup, "%(name)s", name, errp);
+ *obj = tmp;
}
''',
c_name=c_name(name), name=name)
--
2.4.3
- [Qemu-devel] [PATCH v8 00/35] qapi visitor cleanups (post-introspection cleanups subset E), Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 03/35] qapi: Drop dead dealloc visitor variable, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 05/35] vl: Improve use of qapi visitor, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 06/35] balloon: Improve use of qapi visitor, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 12/35] qapi: Don't cast Enum* to int*,
Eric Blake <=
- [Qemu-devel] [PATCH v8 08/35] qapi: Track all failures between visit_start/stop, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 04/35] hmp: Improve use of qapi visitor, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 02/35] qapi: Avoid use of misnamed DO_UPCAST(), Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 09/35] qapi: Prefer type_int64 over type_int in visitors, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 10/35] qapi: Make all visitors supply uint64 callbacks, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 11/35] qapi: Consolidate visitor small integer callbacks, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 07/35] qapi: Improve generated event use of qapi visitor, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 17/35] qapi: Drop unused 'kind' for struct/enum visit, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 13/35] qom: Use typedef for Visitor, Eric Blake, 2015/12/21
- [Qemu-devel] [PATCH v8 20/35] qmp: Don't abuse stack to track qmp-output root, Eric Blake, 2015/12/21