Skip to content
Snippets Groups Projects
Commit c198719d authored by Stephen R. van den Berg's avatar Stephen R. van den Berg
Browse files

pgsql: Protect against execution in destructed objects.

parent bf9dab1b
No related branches found
No related tags found
No related merge requests found
...@@ -612,17 +612,15 @@ final void _processloop(.pgsql_util.conxion ci) { ...@@ -612,17 +612,15 @@ final void _processloop(.pgsql_util.conxion ci) {
plugbuffer->add_int8(0); plugbuffer->add_int8(0);
PD("%O\n",(string)plugbuffer); PD("%O\n",(string)plugbuffer);
if(catch(ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(SENDOUT))) { if(catch(ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(SENDOUT))) {
#ifdef PG_DEBUG if(this) // Only when not destructed yet
if(!_options) if(_options.reconnect)
PD("_options is zero, %O\n",this);
#endif
if(_options && _options.reconnect) // FIXME why can _options be 0?
_connectfail(); _connectfail();
else else
destruct(waitforauthready); destruct(waitforauthready);
} else // Do not flush at this point, PostgreSQL 9.4 disapproves return;
procmessage();
} }
} // Do not flush at this point, PostgreSQL 9.4 disapproves
procmessage();
} }
private void procmessage() { private void procmessage() {
...@@ -1174,6 +1172,7 @@ private void procmessage() { ...@@ -1174,6 +1172,7 @@ private void procmessage() {
break; break;
} }
PD("Closing database processloop %O\n",err); PD("Closing database processloop %O\n",err);
if(this)
_delayederror=err; _delayederror=err;
for(;objectp(portal);portal=qportals->read()) for(;objectp(portal);portal=qportals->read())
if(objectp(portal)) { if(objectp(portal)) {
...@@ -1184,9 +1183,9 @@ private void procmessage() { ...@@ -1184,9 +1183,9 @@ private void procmessage() {
} }
if(!ci->close() && !terminating && _options.reconnect) if(!ci->close() && !terminating && _options.reconnect)
_connectfail(); _connectfail();
else else if(this)
destruct(waitforauthready); destruct(waitforauthready);
if(err && !stringp(err)) if(this && err && !stringp(err))
throw(err); throw(err);
} }
......
...@@ -207,8 +207,8 @@ class conxiin { ...@@ -207,8 +207,8 @@ class conxiin {
final int read_cb(mixed id,mixed b) { final int read_cb(mixed id,mixed b) {
PD("Read callback %O\n",(string)b); PD("Read callback %O\n",(string)b);
Thread.MutexKey lock=fillreadmux->lock(); Thread.MutexKey lock=fillreadmux->lock();
if(procmsg) if(procmsg&&id)
procmsg=0,lock=0,Thread.Thread(id()); procmsg=0,lock=0,Thread.Thread(id);
else if(fillread) else if(fillread)
didreadcb=1, fillread.signal(); didreadcb=1, fillread.signal();
lock=0; lock=0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment