Обсуждение: 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
От
Craig Ringer
Дата:
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
От
"Inoue, Hiroshi"
Дата:
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 {} .
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