• L
    nwfilter: fix crash during filter define when lxc driver failed startup · b8a56f12
    Laine Stump 提交于
    The meat of this patch is just moving the calls to
    virNWFilterRegisterCallbackDriver from each hypervisor's "register"
    function into its "initialize" function. The rest is just code
    movement to allow that, and a new virNWFilterUnRegisterCallbackDriver
    function to undo what the register function does.
    
    The long explanation:
    
    There is an array in nwfilter called callbackDrvArray that has
    pointers to a table of functions for each hypervisor driver that are
    called by nwfilter. One of those function pointers is to a function
    that will lock the hypervisor driver. Entries are added to the table
    by calling each driver's "register" function, which happens quite
    early in libvirtd's startup.
    
    Sometime later, each driver's "initialize" function is called. This
    function allocates a driver object and stores a pointer to it in a
    static variable that was previously initialized to NULL. (and here's
    the important part...) If the "initialize" function fails, the driver
    object is freed, and that pointer set back to NULL (but the entry in
    nwfilter's callbackDrvArray is still there).
    
    When the "lock the driver" function mentioned above is called, it
    assumes that the driver was successfully loaded, so it blindly tries
    to call virMutexLock on "driver->lock".
    
    BUT, if the initialize never happened, or if it failed, "driver" is
    NULL. And it just happens that "lock" is always the first field in
    driver so it is also NULL.
    
    Boom.
    
    To fix this, the call to virNWFilterRegisterCallbackDriver for each
    driver shouldn't be called until the end of its (*already guaranteed
    successful*) "initialize" function, not during its "register" function
    (which is currently the case). This implies that there should also be
    a virNWFilterUnregisterCallbackDriver() function that is called in a
    driver's "shutdown" function (although in practice, that function is
    currently never called).
    b8a56f12
libvirt_private.syms 37.5 KB