• Tom Lane's avatar
    Fix two issues in TOAST decompression. · dfc79773
    Tom Lane authored
    pglz_maximum_compressed_size() potentially underestimated the amount
    of compressed data required to produce N bytes of decompressed data;
    this is a fault in commit 11a078cf.
    
    Separately from that, pglz_decompress() failed to protect itself
    against corrupt compressed data, particularly off == 0 in a match
    tag.  Commit c60e520f turned such a situation into an infinite loop,
    where before it'd just have resulted in garbage output.
    
    The combination of these two bugs seems like it may explain bug #16694
    from Tom Vijlbrief, though it's impossible to be quite sure without
    direct inspection of the failing session.  (One needs to assume that
    the pglz_maximum_compressed_size() bug caused us to fail to fetch the
    second byte of a match tag, and what happened to be there instead was
    a zero.  The reported infinite loop is hard to explain without off == 0,
    though.)
    
    Aside from fixing the bugs, rewrite associated comments for more
    clarity.
    
    Back-patch to v13 where both these commits landed.
    
    Discussion: https://postgr.es/m/16694-f107871e499ec114@postgresql.org
    dfc79773
pg_lzcompress.c 25.9 KB