Hi, whenever I run a C-function (part of an .so file) and the file is overwritten, the connection crashes. Tested on 9.1.3 and 9.2-beta1.
It's 100% reproducible: 1) compile the attached file and copy the .so to pkglibdir $ gcc -I/home/tomas/tmp/postgresql-9.1.2/src/include testcomp.c -shared -fPIC -o testcomp.so $ cp testcomp.so `pg_config --pkglibdir` 2) create a function, calling the .so CREATE FUNCTION test_computation() RETURNS void AS 'testcomp','test_computation' LANGUAGE C STRICT; 3) call the function and while it's running, repeat step (1). 4) an example of the output WARNING: i = 532000000 v = 141512000266000000 WARNING: i = 533000000 v = 142044500266500000 WARNING: i = 534000000 v = 142578000267000000 The connection to the server was lost. Attempting reset: Failed. and a log says this LOG: server process (PID 17161) was terminated by signal 7: Bus error LOG: terminating any other active server processes WARNING: terminating connection because of crash of another server process ... This does not happen when the .so is removed or just touched, it needs to be overwritten (although with a file that's binary exactly the same). Basic info about the box: Linux rimmer 3.3.2-gentoo #1 SMP PREEMPT Wed Apr 18 14:54:04 CEST 2012 x86_64 Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz GenuineIntel GNU/Linux kind regards Tomas
#include <stdio.h> #include <stdlib.h> #include "postgres.h" #include "funcapi.h" #include "miscadmin.h" PG_MODULE_MAGIC; /* * gcc -I/home/tomas/tmp/postgresql-9.1.2/src/include testcomp.c -shared -fPIC * -o testcomp.so * * CREATE FUNCTION test_computation() * RETURNS void * AS 'testcomp','test_computation' * LANGUAGE C STRICT; * * */ PG_FUNCTION_INFO_V1(test_computation); Datum test_computation(PG_FUNCTION_ARGS); void *print_message_function( void *ptr ); Datum test_computation(PG_FUNCTION_ARGS) { int64 result; char * message1 = print_message_function(&result); PG_RETURN_VOID(); } void *print_message_function( void *ptr ) { int64 i; int64 x = 0; /* let's torture the CPU a bit ... */ for (i = 0; i < 5000000000; i++) { x = x + i; if (i % 1000000 == 0) { /* needed for a quick response to cancel-query */ elog(WARNING, "i = %ld v = %ld", i, x); } } *((int64*)ptr) = x; }
-- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs