Skip to content
Snippets Groups Projects
  • Tom Lane's avatar
    f8ace547
    Fix type-safety problem with parallel aggregate serial/deserialization. · f8ace547
    Tom Lane authored
    The original specification for this called for the deserialization function
    to have signature "deserialize(serialtype) returns transtype", which is a
    security violation if transtype is INTERNAL (which it always would be in
    practice) and serialtype is not (which ditto).  The patch blithely overrode
    the opr_sanity check for that, which was sloppy-enough work in itself,
    but the indisputable reason this cannot be allowed to stand is that CREATE
    FUNCTION will reject such a signature and thus it'd be impossible for
    extensions to create parallelizable aggregates.
    
    The minimum fix to make the signature type-safe is to add a second, dummy
    argument of type INTERNAL.  But to lock it down a bit more and make misuse
    of INTERNAL-accepting functions less likely, let's get rid of the ability
    to specify a "serialtype" for an aggregate and just say that the only
    useful serialtype is BYTEA --- which, in practice, is the only interesting
    value anyway, due to the usefulness of the send/recv infrastructure for
    this purpose.  That means we only have to allow "serialize(internal)
    returns bytea" and "deserialize(bytea, internal) returns internal" as
    the signatures for these support functions.
    
    In passing fix bogus signature of int4_avg_combine, which I found thanks
    to adding an opr_sanity check on combinefunc signatures.
    
    catversion bump due to removing pg_aggregate.aggserialtype and adjusting
    signatures of assorted built-in functions.
    
    David Rowley and Tom Lane
    
    Discussion: <27247.1466185504@sss.pgh.pa.us>
    f8ace547
    History
    Fix type-safety problem with parallel aggregate serial/deserialization.
    Tom Lane authored
    The original specification for this called for the deserialization function
    to have signature "deserialize(serialtype) returns transtype", which is a
    security violation if transtype is INTERNAL (which it always would be in
    practice) and serialtype is not (which ditto).  The patch blithely overrode
    the opr_sanity check for that, which was sloppy-enough work in itself,
    but the indisputable reason this cannot be allowed to stand is that CREATE
    FUNCTION will reject such a signature and thus it'd be impossible for
    extensions to create parallelizable aggregates.
    
    The minimum fix to make the signature type-safe is to add a second, dummy
    argument of type INTERNAL.  But to lock it down a bit more and make misuse
    of INTERNAL-accepting functions less likely, let's get rid of the ability
    to specify a "serialtype" for an aggregate and just say that the only
    useful serialtype is BYTEA --- which, in practice, is the only interesting
    value anyway, due to the usefulness of the send/recv infrastructure for
    this purpose.  That means we only have to allow "serialize(internal)
    returns bytea" and "deserialize(bytea, internal) returns internal" as
    the signatures for these support functions.
    
    In passing fix bogus signature of int4_avg_combine, which I found thanks
    to adding an opr_sanity check on combinefunc signatures.
    
    catversion bump due to removing pg_aggregate.aggserialtype and adjusting
    signatures of assorted built-in functions.
    
    David Rowley and Tom Lane
    
    Discussion: <27247.1466185504@sss.pgh.pa.us>