| From: | Noah Misch <noah(at)leadboat(dot)com> | 
|---|---|
| To: | Robert Haas <robertmhaas(at)gmail(dot)com> | 
| Cc: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-bugs(at)postgresql(dot)org | 
| Subject: | Re: fatal flex error in guc-file.l kills the postmaster | 
| Date: | 2012-01-17 18:23:36 | 
| Message-ID: | 20120117182336.GA25779@tornado.leadboat.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | 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(at)leadboat(dot)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 | Content-Type | Size | 
|---|---|---|
| guc-flex-fatal-v3.patch | text/plain | 4.9 KB | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Kevin Grittner | 2012-01-17 18:56:01 | Re: FreeBSD 9.0/amd64, PostgreSQL 9.1.2, pgbouncer 1.4.2: segmentation fault | 
| Previous Message | shitake | 2012-01-17 14:38:46 | Re: pg_upgrade v9.1 issues |