• Tom Lane's avatar
    Fix integer-overflow corner cases in substring() functions. · 4bd3fad8
    Tom Lane authored
    If the substring start index and length overflow when added together,
    substring() misbehaved, either throwing a bogus "negative substring
    length" error on a case that should succeed, or failing to complain that
    a negative length is negative (and instead returning the whole string,
    in most cases).  Unsurprisingly, the text, bytea, and bit variants of
    the function all had this issue.  Rearrange the logic to ensure that
    negative lengths are always rejected, and add an overflow check to
    handle the other case.
    
    Also install similar guards into detoast_attr_slice() (nee
    heap_tuple_untoast_attr_slice()), since it's far from clear that
    no other code paths leading to that function could pass it values
    that would overflow.
    
    Patch by myself and Pavel Stehule, per bug #16804 from Rafi Shamim.
    
    Back-patch to v11.  While these bugs are old, the common/int.h
    infrastructure for overflow-detecting arithmetic didn't exist before
    commit 4d6ad312, and it doesn't seem like these misbehaviors are bad
    enough to justify developing a standalone fix for the older branches.
    
    Discussion: https://postgr.es/m/16804-f4eeeb6c11ba71d4@postgresql.org
    4bd3fad8
varbit.c 42.4 KB