]> granicus.if.org Git - postgresql/commitdiff
Fix possible leak of semaphore count.
authorRobert Haas <rhaas@postgresql.org>
Thu, 5 Jan 2017 18:12:16 +0000 (13:12 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 5 Jan 2017 19:33:14 +0000 (14:33 -0500)
Commit 4aec49899e5782247e134f94ce1c6ee926f88e1c reorganized the order
of operations here so that we no longer increment the number of "extra
waits" before locking the semaphore, but it did not change the
starting value of extraWaits from 0 to -1 to compensate.  In the worst
case, this could leak a semaphore count, but that seems to be unlikely
in practice.

Discussion: http://postgr.es/m/CAA4eK1JyVqXiMba+-a589Rk0pyHsyKkGxeumVKjU6Y74hdrVLQ@mail.gmail.com

Amit Kapila, per an off-list report by Dilip Kumar.  Reviewed by me.

src/backend/storage/ipc/procarray.c

index 83b0c71f5282ee96e33ed400c22bb71aae49c77b..3f47b984eef920a19cca4e1b3a3ec4130fa288fa 100644 (file)
@@ -484,7 +484,6 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid)
        volatile PROC_HDR *procglobal = ProcGlobal;
        uint32          nextidx;
        uint32          wakeidx;
-       int                     extraWaits = -1;
 
        /* We should definitely have an XID to clear. */
        Assert(TransactionIdIsValid(allPgXact[proc->pgprocno].xid));
@@ -511,6 +510,8 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid)
         */
        if (nextidx != INVALID_PGPROCNO)
        {
+               int                     extraWaits = 0;
+
                /* Sleep until the leader clears our XID. */
                for (;;)
                {