Skip to content
  • Yves Frederix's avatar
    Avoid occasional use-after-free when a variable watch is executed · c6104028
    Yves Frederix authored and Brad King's avatar Brad King committed
    Re-lookup a variable value when an associated VariableWatch is executed
    in cmMakefile::GetDefinition.
    
    This fixes a problem with 'def' sometimes becoming invalid due to memory
    reallocation inside an std::vector. In this case, the problem was that
    if the call to VariableAccessed actually executed a callback function,
    the internal state of the makefile has changed due to the associated
    function scope being pushed. This in turn implies that a new
    cmDefinitions instance was pushed in cmMakefile::VarTree. As
    cmLinkedTree is based on an std::vector, this push can have triggered
    reallocation of its internal memory buffer. However, as the value of
    'def', which was computed on method entry, actually points to a property
    of one of the cmDefinitions instances in cmMakefile::VarTree,
    reallocation can invalidate the value of 'def' so that it cannot simply
    be returned at the end of the function. The solution implemented here is
    to simply lookup the value of 'def' again.
    c6104028