• Tom Lane's avatar
    Teach contain_leaked_vars that assignment SubscriptingRefs are leaky. · 62ee7033
    Tom Lane authored
    array_get_element and array_get_slice qualify as leakproof, since
    they will silently return NULL for bogus subscripts.  But
    array_set_element and array_set_slice throw errors for such cases,
    making them clearly not leakproof.  contain_leaked_vars was evidently
    written with only the former case in mind, as it gave the wrong answer
    for assignment SubscriptingRefs (nee ArrayRefs).
    
    This would be a live security bug, were it not that assignment
    SubscriptingRefs can only occur in INSERT and UPDATE target lists,
    while we only care about leakproofness for qual expressions; so the
    wrong answer can't occur in practice.  Still, that's a rather shaky
    answer for a security-related question; and maybe in future somebody
    will want to ask about leakproofness of a tlist.  So it seems wise to
    fix and even back-patch this correction.
    
    (We would need some change here anyway for the upcoming
    generic-subscripting patch, since extensions might make different
    tradeoffs about whether to throw errors.  Commit 558d77f2 attempted
    to lay groundwork for that by asking check_functions_in_node whether a
    SubscriptingRef contains leaky functions; but that idea fails now that
    the implementation methods of a SubscriptingRef are not SQL-visible
    functions that could be marked leakproof or not.)
    
    Back-patch to 9.6.  While 9.5 has the same issue, the code's a bit
    different.  It seems quite unlikely that we'd introduce any actual bug
    in the short time 9.5 has left to live, so the work/risk/reward balance
    isn't attractive for changing 9.5.
    
    Discussion: https://postgr.es/m/3143742.1607368115@sss.pgh.pa.us
    62ee7033
clauses.c 149 KB