b9d14ef event: track callbackID on daemon side of RPC

Authored and Committed by ericb 10 years ago
    event: track callbackID on daemon side of RPC
    
    Right now, the daemon side of RPC events is hard-coded to at most
    one callback per eventID.  But when there are hundreds of domains
    or networks coupled and multiple conections, then sending every
    event to every connection that wants an event, even for the
    connections that only care about events for a particular object,
    is inefficient.  In order to track more than one callback in the
    server, we need to store callbacks by more than just their
    eventID.  This patch rearranges the daemon side to store network
    callbacks in a dynamic array, which can eventually be used for
    multiple callbacks of the same eventID, although actual behavior
    is unchanged without further patches to the RPC protocol.  For
    ease of review, domain events are saved for a later patch, as
    they touch more code.
    
    While at it, fix a bug where a malicious client could send a
    negative eventID to cause network event registration to access
    outside of array bounds (thankfully not a CVE, since domain
    events were already doing the bounds check, and since network
    events have not been released).
    
    * daemon/libvirtd.h (daemonClientPrivate): Alter the tracking of
    network events.
    * daemon/remote.c (daemonClientEventCallback): New struct.
    (remoteEventCallbackFree): New function.
    (remoteClientInitHook, remoteRelayNetworkEventLifecycle)
    (remoteClientFreeFunc)
    (remoteDispatchConnectNetworkEventRegisterAny): Track network
    callbacks differently.
    (remoteDispatchConnectNetworkEventDeregisterAny): Enforce bounds.
    
    Signed-off-by: Eric Blake <eblake@redhat.com>
    
        
file modified
+5 -2
file modified
+80 -33