• Michael Roth's avatar
    qapi: add visit_start_union and visit_end_union · cee2dedb
    Michael Roth authored
    In some cases an input visitor might bail out on filling out a
    struct for various reasons, such as missing fields when running
    in strict mode. In the case of a QAPI Union type, this may lead
    to cases where the .kind field which encodes the union type
    is uninitialized. Subsequently, other visitors, such as the
    dealloc visitor, may use this .kind value as if it were
    initialized, leading to assumptions about the union type which
    in this case may lead to segfaults. For example, freeing an
    integer value.
    
    However, we can generally rely on the fact that the always-present
    .data void * field that we generate for these union types will
    always be NULL in cases where .kind is uninitialized (at least,
    there shouldn't be a reason where we'd do this purposefully).
    
    So pass this information on to Visitor implementation via these
    optional start_union/end_union interfaces so this information
    can be used to guard against the situation above. We will make
    use of this information in a subsequent patch for the dealloc
    visitor.
    
    Cc: qemu-stable@nongnu.org
    Reported-by: default avatarFam Zheng <famz@redhat.com>
    Suggested-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
    Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
    cee2dedb
qapi-visit-core.c 7.5 KB