• Tom Lane's avatar
    Prevent possible double-free when update trigger returns old tuple. · 1ced082b
    Tom Lane authored
    This is a variant of the problem fixed in commit 25b69256, which
    unfortunately we failed to detect at the time.  If an update trigger
    returns the "old" tuple, as it's entitled to do, then a subsequent
    iteration of the loop in ExecBRUpdateTriggers would have "oldtuple"
    equal to "trigtuple" and would fail to notice that it shouldn't
    free that.
    
    In addition to fixing the code, extend the test case added by
    25b69256 so that it covers multiple-trigger-iterations cases.
    
    This problem does not manifest in v12/HEAD, as a result of the
    relevant code having been largely rewritten for slotification.
    However, include the test case into v12/HEAD anyway, since this
    is clearly an area that someone could break again in future.
    
    Per report from Piotr Gabriel Kosinski.  Back-patch into all
    supported branches, since the bug seems quite old.
    
    Diagnosis and code fix by Thomas Munro, test case by me.
    
    Discussion: https://postgr.es/m/CAFMLSdP0rd7LqC3j-H6Fh51FYSt5A10DDh-3=W4PPc4LLUQ8YQ@mail.gmail.com
    1ced082b
triggers.out 128 KB