From c198719d39153f9986178e2aa40e44f0b77191d8 Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Wed, 17 Feb 2016 19:40:17 +0100 Subject: [PATCH] pgsql: Protect against execution in destructed objects. --- lib/modules/Sql.pmod/pgsql.pike | 27 +++++++++++++-------------- lib/modules/Sql.pmod/pgsql_util.pmod | 4 ++-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 4c997e1abd..adbc103aeb 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -612,17 +612,15 @@ final void _processloop(.pgsql_util.conxion ci) { plugbuffer->add_int8(0); PD("%O\n",(string)plugbuffer); if(catch(ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(SENDOUT))) { -#ifdef PG_DEBUG - if(!_options) - PD("_options is zero, %O\n",this); -#endif - if(_options && _options.reconnect) // FIXME why can _options be 0? - _connectfail(); - else - destruct(waitforauthready); - } else // Do not flush at this point, PostgreSQL 9.4 disapproves - procmessage(); - } + if(this) // Only when not destructed yet + if(_options.reconnect) + _connectfail(); + else + destruct(waitforauthready); + return; + } + } // Do not flush at this point, PostgreSQL 9.4 disapproves + procmessage(); } private void procmessage() { @@ -1174,7 +1172,8 @@ private void procmessage() { break; } PD("Closing database processloop %O\n",err); - _delayederror=err; + if(this) + _delayederror=err; for(;objectp(portal);portal=qportals->read()) if(objectp(portal)) { #ifdef PG_DEBUG @@ -1184,9 +1183,9 @@ private void procmessage() { } if(!ci->close() && !terminating && _options.reconnect) _connectfail(); - else + else if(this) destruct(waitforauthready); - if(err && !stringp(err)) + if(this && err && !stringp(err)) throw(err); } diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 28faff9a06..19a1bb61c5 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -207,8 +207,8 @@ class conxiin { final int read_cb(mixed id,mixed b) { PD("Read callback %O\n",(string)b); Thread.MutexKey lock=fillreadmux->lock(); - if(procmsg) - procmsg=0,lock=0,Thread.Thread(id()); + if(procmsg&&id) + procmsg=0,lock=0,Thread.Thread(id); else if(fillread) didreadcb=1, fillread.signal(); lock=0; -- GitLab