Skip to content

Commit d18f667

Browse files
committed
Initialize random() in bootstrap/stand-alone postgres and in initdb.
This removes a difference between the standard IsUnderPostmaster execution environment and that of --boot and --single. In a stand-alone backend, "SELECT random()" always started at the same seed. On a system capable of using posix shared memory, initdb could still conclude "selecting dynamic shared memory implementation ... sysv". Crashed --boot or --single postgres processes orphaned shared memory objects having names that collided with the not-actually-random names that initdb probed. The sysv fallback appeared after ten crashes of --boot or --single postgres. Since --boot and --single are rare in production use, systems used for PostgreSQL development are the principal candidate to notice this symptom. Back-patch to 9.3 (all supported versions). PostgreSQL 9.4 introduced dynamic shared memory, but 9.3 does share the "SELECT random()" problem. Reviewed by Tom Lane and Kyotaro HORIGUCHI. Discussion: https://postgr.es/m/20180915221546.GA3159382@rfd.leadboat.com
1 parent 73a6005 commit d18f667

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

src/backend/utils/init/miscinit.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,14 @@ InitStandaloneProcess(const char *argv0)
325325

326326
MyStartTime = time(NULL); /* set our start time in case we call elog */
327327

328+
/*
329+
* Initialize random() for the first time, like PostmasterMain() would.
330+
* In a regular IsUnderPostmaster backend, BackendRun() computes a
331+
* high-entropy seed before any user query. Fewer distinct initial seeds
332+
* can occur here.
333+
*/
334+
srandom((unsigned int) (MyProcPid ^ MyStartTime));
335+
328336
/* Initialize process-local latch support */
329337
InitializeLatchSupport();
330338
MyLatch = &LocalLatchData;

src/bin/initdb/initdb.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,9 @@ choose_dsm_implementation(void)
923923
#ifdef HAVE_SHM_OPEN
924924
int ntries = 10;
925925

926+
/* Initialize random(); this function is its only user in this program. */
927+
srandom((unsigned int) (getpid() ^ time(NULL)));
928+
926929
while (ntries > 0)
927930
{
928931
uint32 handle;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy