Re: fatal flex error in guc-file.l kills the postmaster - Mailing list pgsql-bugs

From Noah Misch
Subject Re: fatal flex error in guc-file.l kills the postmaster
Date
Msg-id 20120117182336.GA25779@tornado.leadboat.com
Whole thread Raw
In response to Re: fatal flex error in guc-file.l kills the postmaster  (Robert Haas <robertmhaas@gmail.com>)
Responses Re: fatal flex error in guc-file.l kills the postmaster
List pgsql-bugs
On Mon, Jan 16, 2012 at 08:54:53PM -0500, Robert Haas wrote:
> On Sun, Dec 18, 2011 at 11:53 AM, Noah Misch <noah@leadboat.com> wrote:
> > Here's a version that calls sigsetjmp() once per file. ?While postgresql.conf
> > scanning hardly seems like the place to be shaving cycles, this does catch
> > fatal errors in functions other than yylex(), notably yy_create_buffer().
>
> This strikes me as more clever than necessary:
>
> #define fprintf(file, fmt, msg) \
>     0; /* eat cast to void */ \
>     GUC_flex_fatal_errmsg = msg; \
>     siglongjmp(*GUC_flex_fatal_jmp, 1)
>
> Can't we just define a function jumpoutoftheparser() here and call
> that function rather than doing that /* eat cast to void */ hack?
> That would also involve fewer assumptions about the coding style
> emitted by flex.  For example, if flex chose to do something like:
>
>   if (bumpity) fprintf(__FILE__, "%s", "dinglewump");
>
> ...the proposed definition would be a disaster.  I doubt that inlining
> is a material performance benefit here; siglongjmp() can't be all that
> cheap, and the error path shouldn't be all that frequent.
>
> Instead of making ParseConfigFp responsible for restoring
> GUC_flex_fatal_jmp after calling anything that might recursively call
> ParseConfigFp, I think it would make more sense to define it to stash
> away the previous value and restore it on exit.  That way it wouldn't
> need to know which of the things that it calls might in turn
> recursively call it, which seems likely to reduce the chances of
> present or future bugs.  A few comments about whichever way we go with
> it seem like a good idea, too.

Agreed on all points.  I also changed the save/restore of ConfigFileLineno to
work the same way.  New version attached.

Thanks,
nm

Attachment

pgsql-bugs by date:

Previous
From: shitake
Date:
Subject: Re: pg_upgrade v9.1 issues
Next
From: "Kevin Grittner"
Date:
Subject: Re: FreeBSD 9.0/amd64, PostgreSQL 9.1.2, pgbouncer 1.4.2: segmentation fault