Refactor RandomSalt to handle salts of different lengths.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 18 Aug 2016 10:41:17 +0000 (13:41 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 18 Aug 2016 10:41:17 +0000 (13:41 +0300)
All we need is 4 bytes at the moment, for MD5 authentication. But in
upcomint patches for SCRAM authentication, SCRAM will need a salt of
different length. It's less scary for the caller to pass the buffer
length anyway, than assume a certain-sized output buffer.

Author: Michael Paquier
Discussion: <CAB7nPqQvO4sxLFeS9D+NM3wpy08ieZdAj_6e117MQHZAfxBFsg@mail.gmail.com>

src/backend/postmaster/postmaster.c

index f5c8e9d812c234b1b8c61c06ad879ab781b4b5a1..05f3f14e35bb11e60bbbcc4b13e613c36782aee9 100644 (file)
@@ -404,7 +404,7 @@ 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 RandomSalt(char *salt, int len);
 static void signal_child(pid_t pid, int signal);
 static bool SignalSomeChildren(int signal, int targets);
 static void TerminateChildren(int signal);
@@ -2342,7 +2342,7 @@ ConnCreate(int serverFd)
         * after.  Else the postmaster's random sequence won't get advanced, and
         * all backends would end up using the same salt...
         */
-       RandomSalt(port->md5Salt);
+       RandomSalt(port->md5Salt, sizeof(port->md5Salt));
 
        /*
         * Allocate GSSAPI specific state struct
@@ -5083,23 +5083,21 @@ StartupPacketTimeoutHandler(void)
  * RandomSalt
  */
 static void
-RandomSalt(char *md5Salt)
+RandomSalt(char *salt, int len)
 {
        long            rand;
+       int                     i;
 
        /*
         * We use % 255, sacrificing one possible byte value, so as to ensure that
         * all bits of the random() value participate in the result. While at it,
         * add one to avoid generating any null bytes.
         */
-       rand = PostmasterRandom();
-       md5Salt[0] = (rand % 255) + 1;
-       rand = PostmasterRandom();
-       md5Salt[1] = (rand % 255) + 1;
-       rand = PostmasterRandom();
-       md5Salt[2] = (rand % 255) + 1;
-       rand = PostmasterRandom();
-       md5Salt[3] = (rand % 255) + 1;
+       for (i = 0; i < len; i++)
+       {
+               rand = PostmasterRandom();
+               salt[i] = (rand % 255) + 1;
+       }
 }
 
 /*