• L
    util: eliminate "use after free" in callers of virNetDevLinkDump · 94be529b
    Laine Stump 提交于
    virNetDevLinkDump() gets a message from netlink into "resp", then
    calls nlmsg_parse() to fill the table "tb" with pointers into resp. It
    then returns tb to its caller, but not before freeing the buffer at
    resp. That means that all the callers of virNetDevLinkDump() are
    examining memory that has already been freed. This can be verified by
    filling the buffer at resp with garbage prior to freeing it (or, I
    suppose, just running libvirtd under valgrind) then performing some
    operation that calls virNetDevLinkDump().
    
    The upstream commit log incorrectly states that the code has been like
    this ever since virNetDevLinkDump() was written. In reality, the
    problem was introduced with commit e95de74d, first in libvirt-1.0.5,
    which was attempting to eliminate a typecast that caused compiler
    warnings. It has only been pure luck (or maybe a lack of heavy load,
    and/or maybe an allocation algorithm in malloc() that delays re-use of
    just-freed memory) that has kept this from causing errors, for example
    when configuring a PCI passthrough or macvtap passthrough network
    interface.
    
    The solution taken in this patch is the simplest - just return resp to
    the caller along with tb, then have the caller free it after they are
    finished using the data (pointers) in tb. I alternately could have
    made a cleaner interface by creating a new struct that put tb and resp
    together along with a vir*Free() function for it, but this function is
    only used in a couple places, and I'm not sure there will be
    additional new uses of virNetDevLinkDump(), so the value of adding a
    new type, extra APIs, etc. is dubious.
    
    (cherry picked from commit f9f9699f)
    94be529b
virnetdev.c 50.3 KB