• Tom Lane's avatar
    Fix latent problem with pg_jrand48(). · e0904664
    Tom Lane authored
    POSIX specifies that jrand48() returns a signed 32-bit value (in the
    range [-2^31, 2^31)), but our code was returning an unsigned 32-bit
    value (in the range [0, 2^32)).  This doesn't actually matter to any
    existing call site, because they all cast the "long" result to int32
    or uint32; but it will doubtless bite somebody in the future.
    To fix, cast the arithmetic result to int32 explicitly before the
    compiler widens it to long (if widening is needed).
    
    While at it, upgrade this file's far-short-of-project-style comments.
    Had there been some peer pressure to document pg_jrand48() properly,
    maybe this thinko wouldn't have gotten committed to begin with.
    
    Backpatch to v10 where pg_jrand48() was added, just in case somebody
    back-patches a fix that uses it and depends on the standard behavior.
    
    Discussion: https://postgr.es/m/17235.1545951602@sss.pgh.pa.us
    e0904664
erand48.c 4.25 KB