Re: Gcc 4.4 causes abort in plpython. - Mailing list pgsql-hackers

From Alvaro Herrera
Subject Re: Gcc 4.4 causes abort in plpython.
Date
Msg-id 20081229122547.GC4545@alvh.no-ip.org
Whole thread Raw
In response to Gcc 4.4 causes abort in plpython.  (Kurt Roeckx <kurt@roeckx.be>)
Responses Re: Gcc 4.4 causes abort in plpython.
List pgsql-hackers
Kurt Roeckx wrote:

> #3  0x00000000006c8033 in MemoryContextAlloc (context=0x0, size=112)
>     at mcxt.c:507
> #4  0x00000000006abe82 in CopyErrorData () at elog.c:1082
> #5  0x00002b41ea61a755 in PLy_spi_execute_plan (ob=<value optimized out>,
>     list=<value optimized out>, limit=<value optimized out>) at plpython.c:2587

It's calling CopyErrorData with CurrentMemoryContext pointing to NULL,
which is not impossible since the GCC-inlined version of
MemoryContextSwitchTo does not check that it wasn't (the other version
does -- should we fix that?).

The question is why is that memory context set to NULL.  The code looks
like this:

PLy_spi_execute_plan( ... )
{MemoryContext    oldcontext;...oldcontext = CurrentMemoryContext;PG_TRY();{    ...}PG_CATCH();{
MemoryContextSwitchTo(oldcontext);   CopyErrorData();    ...}
 


This has been like this for quite a while, which I find surprising
because I got scolded for a similar coding pattern awhile back.  I think
I found that the variable was reversed to the value it had on entering
the block by the longjmp call.  (IIRC Tom complained because his
compiler threw a "variable might be clobbered by longjmp" warning).  We
at Command Prompt also had a similar case on the then-proprietary
Replicator code.

I think a simplistic solution is to declare the variable volatile.
Would you test that and report back?

Thanks.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


pgsql-hackers by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: incoherent view of serializable transactions
Next
From: Peter Eisentraut
Date:
Subject: Re: dblink vs SQL/MED