Use PostmasterRandom(), not random(), for DSM control segment ID.
authorRobert Haas
Tue, 20 Sep 2016 16:24:44 +0000 (12:24 -0400)
committerRobert Haas
Tue, 20 Sep 2016 16:30:42 +0000 (12:30 -0400)
Otherwise, every startup gets the same "random" value, which is
definitely not what was intended.

src/backend/postmaster/postmaster.c
src/backend/storage/ipc/dsm.c
src/include/postmaster/postmaster.h

index e2d8d7ae5182a2bc7904355211c95d89f6c0044a..e0a15e9f099786eed7a46832c7c1091f6b9ce86e 100644 (file)
@@ -400,7 +400,6 @@ static void processCancelRequest(Port *port, void *pkt);
 static int initMasks(fd_set *rmask);
 static void report_fork_failure_to_client(Port *port, int errnum);
 static CAC_state canAcceptConnections(void);
-static long PostmasterRandom(void);
 static void RandomSalt(char *md5Salt);
 static void signal_child(pid_t pid, int signal);
 static bool SignalSomeChildren(int signal, int targets);
@@ -5127,7 +5126,7 @@ RandomSalt(char *md5Salt)
 /*
  * PostmasterRandom
  */
-static long
+long
 PostmasterRandom(void)
 {
    /*
index 7ce45caaf9b0986cf7df794674e2f9cb4a40e00c..357e8a98e547efba691a141ea01aa84672160345 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "lib/ilist.h"
 #include "miscadmin.h"
+#include "postmaster/postmaster.h"
 #include "storage/dsm.h"
 #include "storage/ipc.h"
 #include "storage/lwlock.h"
@@ -179,7 +180,7 @@ dsm_postmaster_startup(PGShmemHeader *shim)
    {
        Assert(dsm_control_address == NULL);
        Assert(dsm_control_mapped_size == 0);
-       dsm_control_handle = random();
+       dsm_control_handle = (dsm_handle) PostmasterRandom();
        if (dsm_control_handle == 0)
            continue;
        if (dsm_impl_op(DSM_OP_CREATE, dsm_control_handle, segsize,
index de4633278064af9d0efdefbaf9eb253e15b95e54..9cf9e5a61d2d48eaf06dd8321aac7b23fedb4d13 100644 (file)
@@ -48,6 +48,7 @@ extern const char *progname;
 
 extern void PostmasterMain(int argc, char *argv[]) __attribute__((noreturn));
 extern void ClosePostmasterPorts(bool am_syslogger);
+extern long PostmasterRandom(void);
 
 extern int MaxLivePostmasterChildren(void);