Thread: Core dump running PL/Perl installcheck with bleadperl [PATCH]

Core dump running PL/Perl installcheck with bleadperl [PATCH]

From
Tim Bunce
Date:
I encountered a core dump running PL/Perl installcheck with a very
recent git HEAD of PostgreSQL and a not quite so recent git HEAD of perl.

The cause is a subtle difference between SvTYPE(sv) == SVt_RV and
SvROK(sv). The former is checking a low-level implementation detail
while the later is directly checking "does this sv contains a reference".

The attached patch fixes the problem by changing the SvTYPE check to use
SvROK instead. Although I only tripped over one case, the patch changes
all four uses of SvTYPE(sv) == SVt_RV. The remaining uses of SvTYPE are ok.

Tim.


Attachment

Re: Core dump running PL/Perl installcheck with bleadperl [PATCH]

From
Tom Lane
Date:
Tim Bunce <Tim.Bunce@pobox.com> writes:
> I encountered a core dump running PL/Perl installcheck with a very
> recent git HEAD of PostgreSQL and a not quite so recent git HEAD of perl.

> The cause is a subtle difference between SvTYPE(sv) == SVt_RV and
> SvROK(sv). The former is checking a low-level implementation detail
> while the later is directly checking "does this sv contains a reference".

Hmm.  Seems like this patch begs the question: if checking SvTYPE(*svp)
isn't safe, why is it safe to look at SvTYPE(SvRV(*svp))?  Shouldn't the
tests against SVt_PVHV be made more abstract as well?
        regards, tom lane


Re: Core dump running PL/Perl installcheck with bleadperl [PATCH]

From
Tim Bunce
Date:
On Sun, Mar 07, 2010 at 12:11:26PM -0500, Tom Lane wrote:
> Tim Bunce <Tim.Bunce@pobox.com> writes:
> > I encountered a core dump running PL/Perl installcheck with a very
> > recent git HEAD of PostgreSQL and a not quite so recent git HEAD of perl.
> 
> > The cause is a subtle difference between SvTYPE(sv) == SVt_RV and
> > SvROK(sv). The former is checking a low-level implementation detail
> > while the later is directly checking "does this sv contains a reference".
> 
> Hmm.  Seems like this patch begs the question: if checking SvTYPE(*svp)
> isn't safe, why is it safe to look at SvTYPE(SvRV(*svp))?  Shouldn't the
> tests against SVt_PVHV be made more abstract as well?

Some SvTYPE values, like SVt_RV, allow the SV to hold one of a number of
different kinds of things. Others, like SVt_PVHV, don't.

No, I don't like it either but that's the way the "Jenga tower made of
yaks" (to use a phrase recently coined by one of the perl maintainers)
has grown. Something like an SvRVHVOK(sv) would be welcome sugar.

Tim.


Re: Core dump running PL/Perl installcheck with bleadperl [PATCH]

From
Tom Lane
Date:
Tim Bunce <Tim.Bunce@pobox.com> writes:
> The attached patch fixes the problem by changing the SvTYPE check to use
> SvROK instead. Although I only tripped over one case, the patch changes
> all four uses of SvTYPE(sv) == SVt_RV. The remaining uses of SvTYPE are ok.

Applied back to 8.0.  7.4 seems not to contain any tests of this form.
        regards, tom lane


Access violation from palloc, Visual Studio 2005, C-language function

From
"Kevin Flanagan"
Date:
Environment: Windows Vista, PostgreSQL 8.4 (1-click installer), Visual
Studio 2005 sp1.

I have a bare-bones DLL built as per the above, compiling the 'add_one' and
'copytext' samples found at
http://www.postgresql.org/docs/8.4/interactive/xfunc-c.html (version 1
calling convention), compiled as 'C'. I can use 'add_one' just fine from
within SQL, but if I use 'copytext', an access violation occurs as soon as
palloc() is called.

Could anyone suggest what the problem might be?

Failing that, are there any other (creative?) ways to return strings from a
C-language function without using palloc?

Thanks in advance for any leads

Kevin.




"Kevin Flanagan" <kevin-f@linkprior.com> writes:
> Environment: Windows Vista, PostgreSQL 8.4 (1-click installer), Visual
> Studio 2005 sp1.

> I have a bare-bones DLL built as per the above, compiling the 'add_one' and
> 'copytext' samples found at
> http://www.postgresql.org/docs/8.4/interactive/xfunc-c.html (version 1
> calling convention), compiled as 'C'. I can use 'add_one' just fine from
> within SQL, but if I use 'copytext', an access violation occurs as soon as
> palloc() is called.

> Could anyone suggest what the problem might be?

Hard to tell without seeing the actual code and a stack trace, but I'd
bet that you haven't fully resolved the build process problems you
mentioned earlier.  I'm thinking this may be a symptom of linkage
failure, since palloc is probably the first place in the above-described
sequence where your DLL is going to call back into the core backend.

Another possibility is that you mistranscribed the example somehow.
Maybe you forgot the PG_FUNCTION_INFO_V1(copytext) macro?

> Failing that, are there any other (creative?) ways to return strings from a
> C-language function without using palloc?

If you can't make those examples work, you have fundamental problems you
need to fix, not find a "creative workaround".
        regards, tom lane


Re: Access violation from palloc, Visual Studio 2005, C-language function

From
"Kevin Flanagan"
Date:
Well - 

>>
Hard to tell without seeing the actual code and a stack trace, but I'd
bet that you haven't fully resolved the build process problems you
mentioned earlier.  
<<

I've attached a zip of the (tiny) project, and a text file with the contents
of the module containing the C-language functions. The only difference from
sample code is that (as pointed out by Takahiro Itagaki in his post here of
8th March) the function implementations need decorating with
__declspec(dllexport). (I hope the attachments don't break mailing list
policy.)

>>
I'm thinking this may be a symptom of linkage failure, since palloc is
probably the first place in the above-described sequence where your DLL is
going to call back into the core backend.
<<

Hmm. But isn't palloc found in postgres.lib, which my DLL statically links
to? Or is that not the lib I'm supposed to link to? (found in c c:\Program
Files\PostgreSQL\8.4\lib) If I don't include it as an input to the linker, I
get "unresolved external symbol _MemoryContextAlloc referenced in function
_copytext" and other unresolved externals ...

>>
Another possibility is that you mistranscribed the example somehow.
Maybe you forgot the PG_FUNCTION_INFO_V1(copytext) macro?
<<

No, that's there.

>>
> Failing that, are there any other (creative?) ways to return strings from
a
> C-language function without using palloc?
If you can't make those examples work, you have fundamental problems you
need to fix, not find a "creative workaround".
<<

I certainly agree in principle, but when you have a deadline to meet,
sometimes you can be under great pressure to find a temporary workaround ...
with the emphasis on temporary.

Thanks in advance for any further leads

Kevin



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Re: Access violation from palloc, Visual Studio 2005, C-language function

From
"Kevin Flanagan"
Date:
Forgot to include the call stack info, such as it is - screen shot attached.

Kevin.

-----Original Message-----
From: pgsql-hackers-owner@postgresql.org
[mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Kevin Flanagan
Sent: 10 March 2010 09:29
To: 'Tom Lane'
Cc: 'PostgreSQL-development'
Subject: Re: [HACKERS] Access violation from palloc, Visual Studio 2005,
C-language function 

Well - 

>>
Hard to tell without seeing the actual code and a stack trace, but I'd bet
that you haven't fully resolved the build process problems you mentioned
earlier.  
<<

I've attached a zip of the (tiny) project, and a text file with the contents
of the module containing the C-language functions. The only difference from
sample code is that (as pointed out by Takahiro Itagaki in his post here of
8th March) the function implementations need decorating with
__declspec(dllexport). (I hope the attachments don't break mailing list
policy.)

>>
I'm thinking this may be a symptom of linkage failure, since palloc is
probably the first place in the above-described sequence where your DLL is
going to call back into the core backend.
<<

Hmm. But isn't palloc found in postgres.lib, which my DLL statically links
to? Or is that not the lib I'm supposed to link to? (found in c c:\Program
Files\PostgreSQL\8.4\lib) If I don't include it as an input to the linker, I
get "unresolved external symbol _MemoryContextAlloc referenced in function
_copytext" and other unresolved externals ...

>>
Another possibility is that you mistranscribed the example somehow.
Maybe you forgot the PG_FUNCTION_INFO_V1(copytext) macro?
<<

No, that's there.

>>
> Failing that, are there any other (creative?) ways to return strings 
> from
a
> C-language function without using palloc?
If you can't make those examples work, you have fundamental problems you
need to fix, not find a "creative workaround".
<<

I certainly agree in principle, but when you have a deadline to meet,
sometimes you can be under great pressure to find a temporary workaround ...
with the emphasis on temporary.

Thanks in advance for any further leads

Kevin



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make
changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

"Kevin Flanagan" <kevin-f@linkprior.com> writes:
>>> Hard to tell without seeing the actual code and a stack trace, but I'd
>>> bet that you haven't fully resolved the build process problems you
>>> mentioned earlier.  

> I've attached a zip of the (tiny) project, and a text file with the contents
> of the module containing the C-language functions. The only difference from
> sample code is that (as pointed out by Takahiro Itagaki in his post here of
> 8th March) the function implementations need decorating with
> __declspec(dllexport).

Mph.  I don't actually believe that, nor do I believe the #define
BUILDING_DLL you put in, because neither of those are needed in any of
our contrib modules.  What I suspect at this point is that the reference
to CurrentMemoryContext in the palloc() macro is being bollixed by
having the wrong value for BUILDING_DLL.  However, not having a Windows
build environment to experiment with, I'll have to defer to somebody
with more experience in that.

(I wonder BTW if we should rename BUILDING_DLL, because it seems a bit
misnamed.  AIUI it's supposed to be set while building the core backend,
not while building loadable modules.)
        regards, tom lane


Re: Access violation from palloc, Visual Studio 2005, C-language function

From
"Kevin Flanagan"
Date:
Aha. I'd read that the build process for the contrib modules involved
generating a .DEF file for the necessary exports. I had the impression that
defining BUILDING_DLL was an alternative, addressing (part) of the issue
(that is, PG_FUNCTION_INFO_V1 declares functions as 'extern PGDLLIMPORT',
and if you define BUILDING_DLL, then PGDLLIMPORT is defined as ' __declspec
(dllexport)'). But you're quite right, if I take out the BUILDING_DLL
definition, and put the __declspec (dllexport) stuff in piecemeal, the
access violation goes away. Thank goodness.

Thanks, that really helped me out.

Kevin.



-----Original Message-----
From: pgsql-hackers-owner@postgresql.org
[mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Tom Lane
Sent: 10 March 2010 18:51
To: Kevin Flanagan
Cc: 'PostgreSQL-development'
Subject: Re: [HACKERS] Access violation from palloc, Visual Studio 2005,
C-language function 

"Kevin Flanagan" <kevin-f@linkprior.com> writes:
>>> Hard to tell without seeing the actual code and a stack trace, but I'd
>>> bet that you haven't fully resolved the build process problems you
>>> mentioned earlier.  

> I've attached a zip of the (tiny) project, and a text file with the
contents
> of the module containing the C-language functions. The only difference
from
> sample code is that (as pointed out by Takahiro Itagaki in his post here
of
> 8th March) the function implementations need decorating with
> __declspec(dllexport).

Mph.  I don't actually believe that, nor do I believe the #define
BUILDING_DLL you put in, because neither of those are needed in any of
our contrib modules.  What I suspect at this point is that the reference
to CurrentMemoryContext in the palloc() macro is being bollixed by
having the wrong value for BUILDING_DLL.  However, not having a Windows
build environment to experiment with, I'll have to defer to somebody
with more experience in that.

(I wonder BTW if we should rename BUILDING_DLL, because it seems a bit
misnamed.  AIUI it's supposed to be set while building the core backend,
not while building loadable modules.)
        regards, tom lane

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers



"Kevin Flanagan" <kevin-f@linkprior.com> writes:
> Aha. I'd read that the build process for the contrib modules involved
> generating a .DEF file for the necessary exports. I had the impression that
> defining BUILDING_DLL was an alternative, addressing (part) of the issue
> (that is, PG_FUNCTION_INFO_V1 declares functions as 'extern PGDLLIMPORT',
> and if you define BUILDING_DLL, then PGDLLIMPORT is defined as ' __declspec
> (dllexport)'). But you're quite right, if I take out the BUILDING_DLL
> definition, and put the __declspec (dllexport) stuff in piecemeal, the
> access violation goes away. Thank goodness.

I remember having complained that that part of the PG_FUNCTION_INFO_V1
macro seemed backwards, and never really getting a satisfactory
explanation of why it isn't (ie, why it shouldn't be designed to expand
as __declspec (dllexport) instead).  But anyway, I think the
conventional wisdom for exporting functions from a loadable module is
to use "dlltool --export-all" rather than bothering with being
selective.
        regards, tom lane