diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 4eba9ef7240fc8ddd5256e9a47439e57f157769b..bff071042fd4a061f9c6171d4c81d001297a6def 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 b3e3f30113e7e2c802309e52e676e0100146da46..e675b162ec183fc40c83ea26b2e8ec98e1c42fda 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);