Re: selfmade datatype in C and server-crash - Mailing list pgsql-general
From | Markus Schulz |
---|---|
Subject | Re: selfmade datatype in C and server-crash |
Date | |
Msg-id | 200510051138.20430.msc@antzsystem.de Whole thread Raw |
In response to | Re: selfmade datatype in C and server-crash (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: selfmade datatype in C and server-crash
Re: selfmade datatype in C and server-crash |
List | pgsql-general |
On Wednesday 05 October 2005 05:01, Tom Lane wrote: > Markus Schulz <msc@antzsystem.de> writes: > > This works fine and then i've created the new Type like: > > > > CREATE OR REPLACE FUNCTION etextin(cstring) > > RETURNS etext AS > > '$libdir/new_types.so', 'etextin' > > LANGUAGE 'c' VOLATILE; > > > > CREATE OR REPLACE FUNCTION etextout(etext) > > RETURNS cstring AS > > '$libdir/new_types.so', 'etextout' > > LANGUAGE 'c' VOLATILE; > > You'd likely be well advised to declare these STRICT (hint: is the C > code checking for null input?) ... and unless the datatype has weird no, was'nt checked. copy from original text code. > semantics, its I/O functions should be IMMUTABLE. This doesn't > matter too much for the system's ordinary use of I/O functions, but > for security you want to make sure the functions are properly marked > in case they get called directly. ok, changed to strict (makes really sense), but don't change anything. now there is no need for NULL checks if i understand right? > > But if i'm trying to use the type in a table (for instance table > > with only one etext column) the server crashed after inserting the > > second (first insert works) tuple or on every select. > > Getting a stack trace from the crash would be helpful. But the fact > that it only fails on the second try makes me suspicious that it's > a memory-management issue. Count thy pallocs. here's a backtrace. Program received signal SIGSEGV, Segmentation fault. 0x402eacff in strlen () from /lib/libc.so.6 (gdb) sharedlibrary new_types Reading symbols from /usr/lib/postgresql/lib/new_types.so...done. Loaded symbols for /usr/lib/postgresql/lib/new_types.so (gdb) bt #0 0x402eacff in strlen () from /lib/libc.so.6 #1 0x40ffeb00 in etextin (fcinfo=0x0) at new_types.c:27 #2 0x081ec020 in fmgr_internal_function () #3 0x081ed720 in OidFunctionCall3 () #4 0x080d0ec2 in stringTypeDatum () #5 0x080d1745 in coerce_type () #6 0x080d130b in coerce_to_target_type () #7 0x080d351e in updateTargetListEntry () #8 0x080b1549 in parse_sub_analyze () #9 0x080b0fe6 in parse_sub_analyze () #10 0x080b0de9 in parse_sub_analyze () #11 0x080b0cd9 in parse_analyze () #12 0x0817c7c1 in pg_analyze_and_rewrite () #13 0x0817cb88 in pg_plan_queries () #14 0x0817f1e0 in PostgresMain () #15 0x08158d7b in ClosePostmasterPorts () #16 0x08158763 in ClosePostmasterPorts () #17 0x08156c68 in PostmasterMain () #18 0x081562f9 in PostmasterMain () #19 0x08126266 in main () my test query was:(run twice and crashed on second run) insert into test ( var1) values ('andf'); the table has only one column of type etext. in my opinion there must be already something wrong in first "insert" statement and then perhaps the heap became corrupt? if i understand strict correctly, there is no chance to got a NULL Pointer into strlen?!? here is the etextin code:(cut'n'paste from adt/varlena.c Code) Datum etextin(PG_FUNCTION_ARGS) { char *inputText = PG_GETARG_CSTRING(0); text *result; int len=0; /* verify encoding */ len = strlen(inputText); pg_verifymbstr(inputText, len, false); result = (text *) palloc(len + VARHDRSZ); VARATT_SIZEP(result) = len + VARHDRSZ; memcpy(VARDATA(result), inputText, len); PG_RETURN_TEXT_P(result); } compiled and linked like: gcc -Wall -g -O2 -I. -I/usr/include/postgresql/server -c -o new_types.o new_types.c gcc -shared new_types.o -lm -o new_types.so Markus Schulz
pgsql-general by date: