Thread: NPE in psqlodbc30a.dll!PgDtc_set_property caused by pgendlista.dll!IAsyncPG::RequestExec
NPE in psqlodbc30a.dll!PgDtc_set_property caused by pgendlista.dll!IAsyncPG::RequestExec
From
Craig Ringer
Date:
Hi folks I've been chasing an NPE in psqlODBC while attempting to run a debug build to help identify an MSDTC / XA issue for a customer. In pgenlista.dll, IAsyncPG::RequestExec calls SetDone(...), which clears the IAsyncPG::dtcconn member. It then calls PgDtc_set_property on the just-cleared dtcconn member, causing an NPE. in msdtc_enlist.cpp: if (S_OK != res) { SetDone(res); bReleaseEnlist = true; } PgDtc_set_property(dtcconn, prepareRequested, (void *) 0); At the entry point to IAsyncPG::RequestExec, res == S_OK . It gets set to S_FAIL at: if (!PgDtc_two_phase_operation(econn, PREPARE_TRANSACTION, pgxid)) res = E_FAIL; on line 637. I'll look into why that's failing in my environment, but meanwhile, any attempt to access 'dtcconn' after clearing it is clearly a bug. Presumably the PgDtc_set_property should be done before SetDone, or in an else {} . -- Craig Ringer http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
Re: NPE in psqlodbc30a.dll!PgDtc_set_property caused by pgendlista.dll!IAsyncPG::RequestExec
From
"Inoue, Hiroshi"
Date:
Hi Craig, (2014/06/13 14:40), Craig Ringer wrote: > Hi folks > > I've been chasing an NPE in psqlODBC while attempting to run a debug > build to help identify an MSDTC / XA issue for a customer. > > In pgenlista.dll, IAsyncPG::RequestExec calls SetDone(...), which clears > the IAsyncPG::dtcconn member. It then calls PgDtc_set_property on the > just-cleared dtcconn member, causing an NPE. Oops you are right. Anyway it would take some time to fix it. I would have to remember the code first. Thanks. Hiroshi Inoue > in msdtc_enlist.cpp: > > if (S_OK != res) > { > SetDone(res); > bReleaseEnlist = true; > } > PgDtc_set_property(dtcconn, prepareRequested, (void *) 0); > > > At the entry point to IAsyncPG::RequestExec, res == S_OK . It gets set > to S_FAIL at: > > if (!PgDtc_two_phase_operation(econn, PREPARE_TRANSACTION, pgxid)) > res = E_FAIL; > > on line 637. I'll look into why that's failing in my environment, but > meanwhile, any attempt to access 'dtcconn' after clearing it is clearly > a bug. > > Presumably the PgDtc_set_property should be done before SetDone, or in > an else {} .
Re: NPE in psqlodbc30a.dll!PgDtc_set_property caused by pgendlista.dll!IAsyncPG::RequestExec
From
Craig Ringer
Date:
On 06/13/2014 11:52 PM, Inoue, Hiroshi wrote: > > Oops you are right. > Anyway it would take some time to fix it. > I would have to remember the code first. Yeah, I can imagine you don't poke around in that bit of the code a lot. The Dtc_set_property call looks like it's just simple cleanup, so I'm inclined to just shove it in an } else { } block. The cleanup performed makes no sense if the connection has already been closed. -- Craig Ringer http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services