• E
    qapi: Fix error handling code on alternate conflict · fda72ab4
    Eduardo Habkost 提交于
    The conflict check added by commit c0644771 ("qapi: Reject
    alternates that can't work with keyval_parse()") doesn't work
    with the following declaration:
    
      { 'alternate': 'Alt',
        'data': { 'one': 'bool',
                  'two': 'str' } }
    
    It crashes with:
    
      Traceback (most recent call last):
        File "./scripts/qapi-types.py", line 295, in <module>
          schema = QAPISchema(input_file)
        File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 1468, in __init__
          self.exprs = check_exprs(parser.exprs)
        File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 958, in check_exprs
          check_alternate(expr, info)
        File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 830, in check_alternate
          % (name, key, types_seen[qtype]))
      KeyError: 'QTYPE_QSTRING'
    
    This happens because the previously-seen conflicting member
    ('one') can't be found at types_seen[qtype], but at
    types_seen['QTYPE_BOOL'].
    
    Fix the bug by moving the error check to the same loop that adds
    new items to types_seen, raising an exception if types_seen[qt]
    is already set.
    
    Add two additional test cases that can detect the bug.
    Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
    Message-Id: <20170717180926.14924-1-ehabkost@redhat.com>
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    fda72ab4
qapi.py 69.7 KB