• Tom Lane's avatar
    Fix actual and potential double-frees around tuplesort usage. · c2d4eb1b
    Tom Lane authored
    tuplesort_gettupleslot() passed back tuples allocated in the tuplesort's
    own memory context, even when the caller was responsible to free them.
    This created a double-free hazard, because some callers might destroy
    the tuplesort object (via tuplesort_end) before trying to clean up the
    last returned tuple.  To avoid this, change the API to specify that the
    tuple is allocated in the caller's memory context.  v10 and HEAD already
    did things that way, but in 9.5 and 9.6 this is a live bug that can
    demonstrably cause crashes with some grouping-set usages.
    
    In 9.5 and 9.6, this requires doing an extra tuple copy in some cases,
    which is unfortunate.  But the amount of refactoring needed to avoid it
    seems excessive for a back-patched change, especially since the cases
    where an extra copy happens are less performance-critical.
    
    Likewise change tuplesort_getdatum() to return pass-by-reference Datums
    in the caller's context not the tuplesort's context.  There seem to be
    no live bugs among its callers, but clearly the same sort of situation
    could happen in future.
    
    For other tuplesort fetch routines, continue to allocate the memory in
    the tuplesort's context.  This is a little inconsistent with what we now
    do for tuplesort_gettupleslot() and tuplesort_getdatum(), but that's
    preferable to adding new copy overhead in the back branches where it's
    clearly unnecessary.  These other fetch routines provide the weakest
    possible guarantees about tuple memory lifespan from v10 on, anyway,
    so this actually seems more consistent overall.
    
    Adjust relevant comments to reflect these API redefinitions.
    
    Arguably, we should change the pre-9.5 branches as well, but since
    there are no known failure cases there, it seems not worth the risk.
    
    Peter Geoghegan, per report from Bernd Helmle.  Reviewed by Kyotaro
    Horiguchi; thanks also to Andreas Seltenreich for extracting a
    self-contained test case.
    
    Discussion: https://postgr.es/m/1512661638.9720.34.camel@oopsware.de
    c2d4eb1b
tuplesort.c 136 KB