Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d18f667

Browse filesBrowse 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
Copy full SHA for d18f667

File tree

Expand file treeCollapse file tree

2 files changed

+11
-0
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+11
-0
lines changed

‎src/backend/utils/init/miscinit.c

Copy file name to clipboardExpand all lines: src/backend/utils/init/miscinit.c
+8Lines 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

Copy file name to clipboardExpand all lines: src/bin/initdb/initdb.c
+3Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.