From: Tom Lane Date: Wed, 1 Jul 2015 22:07:48 +0000 (-0400) Subject: Make sampler_random_fract() actually obey its API contract. X-Git-Url: http://git.postgresql.org/gitweb/-?a=commitdiff_plain;h=d7c19d68550eb6018e8581a73a351905f4cc435c;p=users%2Frhaas%2Fpostgres.git Make sampler_random_fract() actually obey its API contract. This function is documented to return a value in the range (0,1), which is what its predecessor anl_random_fract() did. However, the new version depends on pg_erand48() which returns a value in [0,1). The possibility of returning zero creates hazards of division by zero or trying to compute log(0) at some call sites, and it might well break third-party modules using anl_random_fract() too. So let's change it to never return zero. Spotted by Coverity. Michael Paquier, cosmetically adjusted by me --- diff --git a/src/backend/utils/misc/sampling.c b/src/backend/utils/misc/sampling.c index aaf1d6c410..6191f79734 100644 --- a/src/backend/utils/misc/sampling.c +++ b/src/backend/utils/misc/sampling.c @@ -237,7 +237,14 @@ sampler_random_init_state(long seed, SamplerRandomState randstate) double sampler_random_fract(SamplerRandomState randstate) { - return pg_erand48(randstate); + double res; + + /* pg_erand48 returns a value in [0.0 - 1.0), so we must reject 0 */ + do + { + res = pg_erand48(randstate); + } while (res == 0.0); + return res; }