The odds that this is a bug in repalloc, and not in your own code, are
nil.

regards, tom lane

Dear Tom Lane,
Thanks for quick response. Trying to focus what kind of bug could infest my code, I reduced the code to a small example that illustrates the infaust effect. I've tried to follow as much as possible the manual, so I'm trying to figure what's wrong.


This is the source code:
---> snip <---
#include <postgres.h>
#include <fmgr.h>
#include <funcapi.h>
#include <commands/trigger.h>
#include <executor/spi.h>
#include <catalog/pg_type.h>
#include <sys/types.h>
#include <ctype.h>

typedef struct
{
        TupleDesc tupdesc;
        u_int32_t size;
        u_int8_t *buf;
} repalloc_test_t;

void repalloc_bubble(u_int8_t *buf, u_int32_t s)
{
        buf = repalloc(buf, s);
        bzero(buf, s);
}

PG_FUNCTION_INFO_V1(repalloc_test);

Datum repalloc_test(PG_FUNCTION_ARGS)
{
        FuncCallContext *funcctx;
        repalloc_test_t *d;
        u_int32_t i;
        MemoryContext oldcontext;

funcctx = SRF_FIRSTCALL_INIT();
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
d = funcctx->user_fctx = (repalloc_test_t *) palloc(sizeof(repalloc_test_t));
bzero(d, sizeof(repalloc_test_t));
d->tupdesc = RelationNameGetTupleDesc("repalloc_type");
d->size = 32;
d->buf = palloc(d->size);
bzero(d->buf, d->size);
for(i = 0; i < d->size; i++)
elog(WARNING, "TEST A: d->buf[%d] = %d", i, d->buf[i]);
d->size = 64;
repalloc_bubble(d->buf, d->size);
for(i = 0; i < d->size; i++)
elog(WARNING, "TEST B: d->buf[%d] = %d", i, d->buf[i]);
funcctx->slot = TupleDescGetSlot(d->tupdesc);
MemoryContextSwitchTo(oldcontext);
funcctx = SRF_PERCALL_SETUP();
SRF_RETURN_DONE(funcctx);
}
----> snip <-----


I've then created the following script to load the library and execute it:

---> snip <---
CREATE TYPE "repalloc_type" AS
(
"count" integer,
"size" integer
);
CREATE OR REPLACE FUNCTION repalloc_test() RETURNS setof repalloc_type AS 'path/to/lib.so' LANGUAGE C IMMUTABLE WITH (isStrict);
SELECT * FROM repalloc_test();
DROP FUNCTION repalloc_test();
DROP TYPE repalloc_type;
---> snip <---


This is the output of the WARNING messages:

---> snip <---
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[0] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[1] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[2] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[3] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[4] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[5] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[6] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[7] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[8] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[9] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[10] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[11] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[12] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[13] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[14] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[15] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[16] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[17] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[18] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[19] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[20] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[21] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[22] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[23] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[24] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[25] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[26] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[27] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[28] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[29] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[30] = 0
psql:repalloc_test.sql:7: WARNING:  TEST A: d->buf[31] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[0] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[1] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[2] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[3] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[4] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[5] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[6] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[7] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[8] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[9] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[10] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[11] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[12] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[13] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[14] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[15] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[16] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[17] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[18] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[19] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[20] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[21] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[22] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[23] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[24] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[25] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[26] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[27] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[28] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[29] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[30] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[31] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[32] = 248
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[33] = 196
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[34] = 49
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[35] = 8
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[36] = 128
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[37] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[38] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[39] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[40] = 179
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[41] = 104
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[42] = 236
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[43] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[44] = 99
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[45] = 111
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[46] = 117
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[47] = 110
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[48] = 116
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[49] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[50] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[51] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[52] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[53] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[54] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[55] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[56] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[57] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[58] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[59] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[60] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[61] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[62] = 0
psql:repalloc_test.sql:7: WARNING:  TEST B: d->buf[63] = 0
---> snip <---

As you may notice, I never write into d->buf, nor I "overflow" any of the other values and all the buffers are correctly allocated, but still d->buf gets overwritten. I may be possibly using the API incorrectly, so could you please help me understand what's actually failing?





Giacomo Cariello, [EMAIL PROTECTED]
KeyID: 3072/1024/0x409C9044
Fingerprint: 7984 10FD 0460 4202 BF90 3881 CDE4 D78E 409C 9044

"Put that mic in my hand and let me kick out the jams!" - MC5



---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to