• P
    qom: Split out object and class caches · 0ab4c94c
    Peter Crosthwaite 提交于
    The object-cast and class-cast caches cannot be shared because class
    caching is conditional on the target type not being an interface and
    object caching is unconditional. Leads to a bug when a class cast
    to an interface follows an object cast to the same interface type:
    
    FooObject = FOO(obj);
    FooClass = FOO_GET_CLASS(obj);
    
    Where TYPE_FOO is an interface. The first (object) cast will be
    successful and cache the casting result (i.e. TYPE_FOO will be cached).
    The second (class) cast will then check the shared cast cache
    and register a hit. The issue is, when a class cast hits in the cache
    it just returns a pointer cast of the input class (i.e. the concrete
    class).
    
    When casting to an interface, the cast itself must return the
    interface class, not the concrete class. The implementation of class
    cast caching already ensures that the returned cast result is only
    a pointer cast before caching. The object cast logic however does
    not have this check.
    
    Resolve by just splitting the object and class caches.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: NPeter Crosthwaite <peter.crosthwaite@xilinx.com>
    Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
    Tested-by: NNathan Rossi <nathan.rossi@xilinx.com>
    Reviewed-by: NEdgar E. Iglesias <edgar.iglesias@gmail.com>
    Signed-off-by: NAndreas Färber <afaerber@suse.de>
    0ab4c94c
object.c 34.7 KB