From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | pgsql-hackers(at)postgreSQL(dot)org |
Subject: | Badly broken logic in plpython composite-type handling |
Date: | 2015-08-19 16:46:35 |
Message-ID: | 12727.1440002795@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
I looked into the crash reported in bug #13579. The proximate cause
of the crash is that PLyString_ToComposite does this:
PLy_output_datum_func2(&info->out.d, typeTup,
exec_ctx->curr_proc->langid,
exec_ctx->curr_proc->trftypes);
without any thought for the possibility that info->is_rowtype is 1,
in which case it's stomping on the info->out.r data that will be
needed later. I have serious doubts that making PLyTypeOutput a
union was a wise idea, as it means that C offers you exactly zero
protection against this type of data clobber.
I tried changing that to
PLy_output_datum_func(info, typeTup,
exec_ctx->curr_proc->langid,
exec_ctx->curr_proc->trftypes);
which unsurprisingly results in "ERROR: PLyTypeInfo struct is initialized
for a Tuple" in the case reported in the bug ... and also results in quite
a few of the plpython regression tests failing that way, which makes it a
bit astonishing that we've not tripped over this bug already.
I'm inclined to think that maybe PLyString_ToComposite needs to be doing
something more like what PLyObject_ToComposite does, ie doing its own
lookup in a private descriptor; but I'm not sure if that's right, and
anyway it would just be doubling down on a bad design. Not being able
to cache these I/O function lookups is really horrid.
I wonder if that could be fixed by changing PLyTypeInput and PLyTypeOutput
from unions to structs and getting rid of is_rowtype in favor of allowing
the d and r fields to be valid or not independently; then you could treat
the object as either scalar or rowtype at need.
Does whoever designed this code in the first place want to fix it?
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | David Fetter | 2015-08-19 17:01:55 | Re: how to write/setup a C trigger function in a background worker |
Previous Message | Andres Freund | 2015-08-19 15:56:22 | Re: allowing wal_level change at run time |