Обсуждение: BUG #15541: Use after release in PQprint
The following bug has been logged on the website:
Bug reference: 15541
Logged by: Pan Bian
Email address: bianpan2016@163.com
PostgreSQL version: 11.1
Operating system: Linux
Description:
File: src/interfaces/libpq/fe-print.c
Function: PQprint
Issue details:
The function PQprint releases the file hander fout via pclose or _pclose
when usePipe is true. After that, fout is used again to write message
"fputs("</table>\n", fout);".
For your convenience, I copy-and-paste related code as follows.
67 void
68 PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
69 {
...
310 if (usePipe)
311 {
312 #ifdef WIN32
313 _pclose(fout);
314 #else
315 pclose(fout);
316
317 #ifdef ENABLE_THREAD_SAFETY
318 /* we can't easily verify if EPIPE occurred, so say it did
*/
319 if (sigpipe_masked)
320 pq_reset_sigpipe(&osigset, sigpipe_pending, true);
321 #else
322 pqsignal(SIGPIPE, oldsigpipehandler);
323 #endif /* ENABLE_THREAD_SAFETY */
324 #endif /* WIN32 */
325 }
326 if (po->html3 && !po->expanded)
327 fputs("</table>\n", fout);
328 }
329 }
Thank you,
Pan Bian
=?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes:
> The function PQprint releases the file hander fout via pclose or _pclose
> when usePipe is true. After that, fout is used again to write message
> "fputs("</table>\n", fout);".
Wow, that is ancient. It looks like commit edb519b14 of 27-Jul-1996
added the pipe close stanza in the wrong place, and nobody's noticed
it since. That's probably not so surprising given the multiple
conditions required to trigger it plus the fact that this whole
function is, if not completely dead code, at least not used anywhere
in the PG distribution. Still, we oughta fix it.
Thanks for the report!
regards, tom lane
I wrote:
> Wow, that is ancient. It looks like commit edb519b14 of 27-Jul-1996
> added the pipe close stanza in the wrong place, and nobody's noticed
> it since. That's probably not so surprising given the multiple
> conditions required to trigger it plus the fact that this whole
> function is, if not completely dead code, at least not used anywhere
> in the PG distribution. Still, we oughta fix it.
Actually, looking closer at just what those conditions are: the
giant bit of spaghetti code at lines 177-188 will never enable the
pager if po->html3 is on. Probably that was because of laziness
about counting lines correctly in that case, but anyway it means
the problem situation is unreachable, AFAICS.
It still seems worth fixing in HEAD, in case anyone ever tries to
remove that restriction; but I'm no longer feeling that we need
to back-patch it.
regards, tom lane
On 2018-Dec-07, Tom Lane wrote: > It still seems worth fixing in HEAD, in case anyone ever tries to > remove that restriction; but I'm no longer feeling that we need > to back-patch it. I wonder why don't we just remove PQprint altogether. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
> I wonder why don't we just remove PQprint altogether.
Yeah, I was wondering that too. AFAICS the whole of fe-print.c
is dead code so far as our own usage is concerned. Is there any
evidence that outside code is using PQprint, PQprintTuples, or
PQdisplayTuples? (The latter two aren't even documented...)
Still, I'm not sure if we can remove them outright without it
being considered a library compatibility break by some distros.
regards, tom lane
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
> I wonder why don't we just remove PQprint altogether.
Yeah, I was wondering that too. AFAICS the whole of fe-print.c
is dead code so far as our own usage is concerned. Is there any
evidence that outside code is using PQprint, PQprintTuples, or
PQdisplayTuples? (The latter two aren't even documented...)
Still, I'm not sure if we can remove them outright without it
being considered a library compatibility break by some distros.
regards, tom lane