Ignore interrupts during quickdie().
authorNoah Misch <noah@leadboat.com>
Thu, 12 Sep 2013 00:10:15 +0000 (20:10 -0400)
committerNoah Misch <noah@leadboat.com>
Thu, 12 Sep 2013 00:10:15 +0000 (20:10 -0400)
Once the administrator has called for an immediate shutdown or a backend
crash has triggered a reinitialization, no mere SIGINT or SIGTERM should
change that course.  Such derailment remains possible when the signal
arrives before quickdie() blocks signals.  That being a narrow race
affecting most PostgreSQL signal handlers in some way, leave it for
another patch.  Back-patch this to all supported versions.

src/backend/tcop/postgres.c

index e56dbfb80068a8a1ffe259670738717196e51a36..1eaf287eec9f4e08cdaca28142c5914ffbd718ff 100644 (file)
@@ -2524,6 +2524,13 @@ quickdie(SIGNAL_ARGS)
    sigaddset(&BlockSig, SIGQUIT);      /* prevent nested calls */
    PG_SETMASK(&BlockSig);
 
+   /*
+    * Prevent interrupts while exiting; though we just blocked signals that
+    * would queue new interrupts, one may have been pending.  We don't want a
+    * quickdie() downgraded to a mere query cancel.
+    */
+   HOLD_INTERRUPTS();
+
    /*
     * If we're aborting out of client auth, don't risk trying to send
     * anything to the client; we will likely violate the protocol, not to