Re: Custom data type in C with one fixed and one variable attribute

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Adrian Schreyer <ams214(at)cam(dot)ac(dot)uk>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Custom data type in C with one fixed and one variable attribute
Date: 2011-10-27 22:23:21
Message-ID: 7306.1319754201@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Adrian Schreyer <ams214(at)cam(dot)ac(dot)uk> writes:
> The data type I have is

> typedef struct {
> int4 length;
> uint32 foo;
> char bar[1];
> } oefp;

Seems reasonable enough.

> mydatatype *dt = (mydatatype*) palloc(VARHDRSZ + sizeof(uint32) +
> strlen(buffer));

> SET_VARSIZE(dt, VARHDRSZ + sizeof(uint32) + strlen(buffer));
> memcpy(dt->bar, buffer, strlen(buffer));
> dt->foo = foo;

Fine, but keep in mind that what you are creating here is a
non-null-terminated string.

> The problem is however that dt->bar contains not only the input string
> but random characters or other garbage as well, so something must go
> wrong at the end of the function. Any thoughts what it could be?

It sounds to me like you are inspecting dt->bar with something that
expects to see a null-terminated string. You could either fix your
inspection code, or expend one more byte to make the string be
null-terminated as stored.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Alan Hodgson 2011-10-27 22:23:44 Re: Server hitting 100% CPU usage, system comes to a crawl.
Previous Message Josh Berkus 2011-10-27 22:06:31 PostgreSQL at LISA in Boston: Dec. 7-8