From 58d0b04fdf3d96c606181bed7b42466928804cd3 Mon Sep 17 00:00:00 2001
From: "Stephen R. van den Berg" <srb@cuci.nl>
Date: Fri, 1 Apr 2016 03:26:08 +0200
Subject: [PATCH] pgsql: Ensure queries have been fully started before closing
 the fd.

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

diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index e4ee797793..3661637f89 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -63,7 +63,7 @@
 
 final int _fetchlimit=FETCHLIMIT;
 final Thread.Mutex _unnamedportalmux;
-private Thread.Mutex unnamedstatement,termthread;
+private Thread.Mutex unnamedstatement;
 private Thread.MutexKey termlock;
 final int _portalsinflight;
 
@@ -1201,9 +1201,9 @@ private void procmessage() {
 /*semi*/final void close() {
   if(qportals && qportals->size())
     catch(cancelquery());
-  termlock=(termthread=Thread.Mutex())->lock();
+  termlock=unnamedstatement->lock(1);
   c->close();
-  termthread->lock(1);
+  unnamedstatement->lock(1);
   destruct(c);destruct(waitforauthready);
 }
 
@@ -1258,9 +1258,9 @@ private int reconnect() {
 #ifdef PG_STATS
     prepstmtused=0;
 #endif
-    termlock=(termthread=Thread.Mutex())->lock();
+    termlock=unnamedstatement->lock(1);
     c->close();
-    termthread->lock(1);
+    unnamedstatement->lock(1);
     destruct(c);
     PD("Flushing old cache\n");
     foreach(_prepareds;;mapping tp)
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index b554a60946..944c81a3dd 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -356,12 +356,12 @@ outer:
   protected void destroy() {
     if(nostash) {
       catch {
+        while(sizeof(closecallbacks))
+          foreach(closecallbacks;function(void|mixed:void) closecb;)
+            closecb();
         destruct(nostash);
         PD("%d>Close socket\n",socket->query_fd());
         socket->close();
-        foreach(closecallbacks;function(void|mixed:void) closecb;)
-          closecb();
-        closecallbacks=(<>);
       };
     }
     connectfail=0;
@@ -515,7 +515,6 @@ class sql_result {
     _ddescribe=Thread.Condition();
     _ddescribemux=Thread.Mutex();
     closemux=Thread.Mutex();
-    c->closecallbacks+=(<destroy>);
     portalbuffersize=_portalbuffersize;
     alltext = !alltyped;
     _params = params;
@@ -523,6 +522,7 @@ class sql_result {
     _state = PORTALINIT;
     timeout = _timeout;
     gottimeout = _pgsqlsess->cancelquery;
+    c->closecallbacks+=(<destroy>);
   }
 
   //! Returns the command-complete status for this query.
-- 
GitLab