From 601713af2712313c6707823de2e91d457ddd6d81 Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Fri, 30 Apr 2021 15:55:29 +0200 Subject: [PATCH] pgsql: Catch even more double traps. --- lib/modules/Sql.pmod/pgsql.pike | 3 ++- lib/modules/Sql.pmod/pgsql_util.pmod | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 4eba9ef724..bff071042f 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -270,7 +270,8 @@ protected void create(void|string host, void|string database, && (t = time(1)) - lastping > MINPINGINTERVAL && (ret = !catch(proxy.c->start()->sendcmd(FLUSHSEND)))) lastping = t; - return ret ? !!reconnected : -1; + // After catch(start()) we might have been destructed + return this && ret ? !!reconnected : -1; } //! Cancels all currently running queries in this session. diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index b3e3f30113..e675b162ec 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -1569,13 +1569,16 @@ class sql_result { array(Thread.MutexKey) reflock = ({ 0 }); for (;;) { reflock[0] = closemux->lock(aborted); - if (!catch(plugbuffer = c->start(reflock))) + if (!catch(plugbuffer = c->start(reflock))) { + if (!this) // If dead + return; if (plugbuffer) plugbuffer->sendcmd(_closeportal(plugbuffer, reflock)); else { PD("Releasesession retry closemux %O\n", _portalname); continue; } + } break; } reflock[0] = 0; @@ -1962,9 +1965,11 @@ class proxy { PD("%O\n", (string)plugbuffer); void|bufcon|conxsess cs; if (catch(cs = ci->start())) { - destruct(waitforauthready); - unnamedstatement = 0; - termlock = 1; + if (this) { // Only if still alive + destruct(waitforauthready); + unnamedstatement = 0; + termlock = 1; + } return; } else { CHAIN(cs)->add_hstring(plugbuffer, 4, 4); -- GitLab