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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs