From 243450f14ae962f71305c9f93f2772225f1d381c Mon Sep 17 00:00:00 2001
From: "Stephen R. van den Berg" <srb@cuci.nl>
Date: Sat, 1 Jul 2017 16:48:02 +0200
Subject: [PATCH] pgsql: Omit qportals on CancelRequest connections, eliminates
 interference.

---
 lib/modules/Sql.pmod/pgsql.pike      | 8 ++------
 lib/modules/Sql.pmod/pgsql_util.pmod | 9 +++++----
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index 830b507288..fd5071f32d 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -302,10 +302,6 @@ protected void create(void|string host, void|string database,
    ? !!reconnected : -1;
 }
 
-private .pgsql_util.conxion getsocket(void|int nossl) {
-  return .pgsql_util.conxion(this,qportals,(int)nossl);
-}
-
 //! Cancels all currently running queries in this session.
 //!
 //! @seealso
@@ -316,7 +312,7 @@ private .pgsql_util.conxion getsocket(void|int nossl) {
 //! through the generic SQL-interface.
 /*semi*/final void cancelquery() {
   PD("CancelRequest\n");
-  .pgsql_util.conxion lcon=getsocket(2);
+  .pgsql_util.conxion lcon = .pgsql_util.conxion(this, 0, 2);
   lcon->add_int32(16)->add_int32(PG_PROTOCOL(1234,5678))
    ->add_int32(backendpid)->add(cancelsecret)->sendcmd(FLUSHSEND);
   destruct(lcon);		// Destruct explicitly to avoid delayed close
@@ -1340,7 +1336,7 @@ private int reconnect() {
   _readyforquerycount=1;
   _waittocommit=0;
   qportals->write(1);
-  if(!(c=getsocket()))
+  if (!(c = .pgsql_util.conxion(this, qportals, 0)))
     ERROR("Couldn't connect to database on %s:%d\n",_host,_port);
   _runtimeparameter=([]);
   _unnamedportalmux=Thread.Mutex();
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index f7c98d650d..b51d3cbf41 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -425,9 +425,10 @@ outer:
   protected void destroy() {
     PD("%d>Close conxion %d\n", socket ? socket->query_fd() : -1, !!nostash);
     int|.pgsql_util.sql_result portal;
-    while (portal = qportals->try_read())
-      if (objectp(portal))
-        portal->_purgeportal();
+    if (qportals)			// CancelRequest does not use qportals
+      while (portal = qportals->try_read())
+        if (objectp(portal))
+          portal->_purgeportal();
     if(nostash) {
       catch {
         while(sizeof(closecallbacks))
@@ -504,7 +505,7 @@ outer:
                     "queued portals: %d  output queue: %d/%d\n"
                     "started: %d\n",
                     fd,sizeof(i),i->_size_object(),
-                    qportals->size(),sizeof(this),_size_object(),
+                    qportals && qportals->size(), sizeof(this), _size_object(),
                     !!started);
         break;
     }
-- 
GitLab