| From: | Craig Ringer <craig(at)2ndquadrant(dot)com> | 
|---|---|
| To: | "pgsql-odbc(at)postgresql(dot)org" <pgsql-odbc(at)postgresql(dot)org> | 
| Subject: | NPE in psqlodbc30a.dll!PgDtc_set_property caused by pgendlista.dll!IAsyncPG::RequestExec | 
| Date: | 2014-06-13 05:40:42 | 
| Message-ID: | 539A8EDA.8050503@2ndquadrant.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-odbc | 
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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Heikki Linnakangas | 2014-06-13 12:33:51 | Building psqlODBC installers | 
| Previous Message | Hiroshi Inoue | 2014-06-13 03:59:07 | Re: XA registry entries are missing from 64-bit install |