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:38 +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 975b98790dae1ccf2dea97c842e6cded9b9b4c23..949e7e07402b97368b8bb2224520301b889d8e03 100644 (file)
@@ -399,7 +399,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);
@@ -5077,7 +5076,7 @@ RandomSalt(char *md5Salt)
 /*
  * PostmasterRandom
  */
-static long
+long
 PostmasterRandom(void)
 {
    /*
index b82ae05e15546da6f21820743add1c22badab14b..7042297209565746ee29751b8e6e1122d188f28f 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 d16030482fad56361eeec66f488af269e7aec976..69518303385bd625cae18a3473a8462a8a2fe91d 100644 (file)
@@ -48,6 +48,7 @@ extern const char *progname;
 
 extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();
 extern void ClosePostmasterPorts(bool am_syslogger);
+extern long PostmasterRandom(void);
 
 extern int MaxLivePostmasterChildren(void);