Re: 13.0-RC3 bison causes tputs SIGSEGV

From: Thomas Dickey <dickey_at_his.com>
Date: Mon, 29 Mar 2021 19:31:38 -0400
On Mon, Mar 29, 2021 at 12:12:55PM -0700, Henric Jungheim wrote:
>
> I ran into a bit of an odd problem when building the
> sysutils/grub2-bhyve port on 13.0-RC3 (on x64).  The bison command
> dumps core when the output is going to a console.  Redirecting the
> build output to a file avoids the problem.  I'm not sure if this is
> an ncurses issue, a port issue (and which port?), my box, or
> something else (clang?).

It might be a problem with the application's initialization of ncurses.

> This is what the tail end of the port build looks like:
> ...
> grub-mkfont: No (explicitly disabled)
> grub-mount: No (explicitly disabled)
> starfield theme: No (No grub-mkfont)
> With libzfs support: Yes
> *******************************************************
> ===>  Building for grub2-bhyve-0.40_8
> gmake[1]: Entering directory '/usr/ports/sysutils/grub2-bhyve/work/grub2-bhyve-0.40'
> bison -d -p grub_script_yy -b grub_script ./grub-core/script/parser.y
> ./grub-core/script/parser.y:94.1-12: warning: deprecated directive: '%pure-parser', use '%define api.pure' [
>
> And here's what lldb has to say:
>
>
> sysutils/grub2-bhyve/work/grub2-bhyve-0.40>lldb -- /usr/local/bin/bison -d -p grub_script_yy -b grub_script ./grub-core/script/parser.y
> (lldb) target create "/usr/local/bin/bison"
> Current executable set to '/usr/local/bin/bison' (x86_64).
> (lldb) settings set -- target.run-args  "-d" "-p" "grub_script_yy" "-b" "grub_script" "./grub-core/script/parser.y"
> (lldb) run
> Process 50108 launching
> Process 50108 launched: '/usr/local/bin/bison' (x86_64)
> ./grub-core/script/parser.y:94.1-12: warning: deprecated directive: %pure-parser, use %define api.pure [signal SIGSEGV: invalid address (fault address: 0x0)
>     frame #0: 0x0000000000000000
> error: Bad address
> (lldb) bt
> * thread #1, name = 'bison', stop reason = signal SIGSEGV: invalid address (fault address: 0x0)
>   * frame #0: 0x0000000000000000
>     frame #1: 0x0000000800c1930a libncursesw.so.9`delay_output_sp + 234
>     frame #2: 0x0000000800c19b81 libncursesw.so.9`tputs_sp + 1377
>     frame #3: 0x0000000800c19cfb libncursesw.so.9`tputs + 123
>     frame #4: 0x0000000800702dbc libtextstyle.so.0`___lldb_unnamed_symbol149$$libtextstyle.so.0 + 92
>     frame #5: 0x00000008007037ff libtextstyle.so.0`___lldb_unnamed_symbol152$$libtextstyle.so.0 + 943
>     frame #6: 0x00000008007030cf libtextstyle.so.0`___lldb_unnamed_symbol151$$libtextstyle.so.0 + 543
>     frame #7: 0x0000000800700d00 libtextstyle.so.0`___lldb_unnamed_symbol125$$libtextstyle.so.0 + 32

Either bison has to tell libtextstyle to initialize,
or libtextstyle has to know when to initialize ncurses.

For the latter, term_ostream_create calls setupterm,
which interestingly enough tries to recover from an error
by calling the terminfo functions (which could still fail):

          if (setupterm (term, fd, &err) || err == 1)
            {
              /* Retrieve particular values depending on the terminal type.  */
              stream->max_colors = tigetnum ("colors");
              stream->no_color_video = tigetnum ("ncv");

setupterm could fail for instance if there's no terminal description
corresponding to your $TERM variable.  If that happens, then the
SCREEN pointer passed to tputs_sp might be NULL, or cur_term might
be NULL.

In ncurses, the corresponding null-pointer checks are
done with HasTInfoTerminal:

	NCURSES_EXPORT(int)
	NCURSES_SP_NAME(delay_output) (NCURSES_SP_DCLx int ms)
	{
	    T((T_CALLED("delay_output(%p,%d)"), (void *) SP_PARM, ms));

	    if (!HasTInfoTerminal(SP_PARM))
		returnCode(ERR);

	    if (no_pad_char) {
		NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
		napms(ms);
	    } else {

>     frame #8: 0x0000000000407295 bison`___lldb_unnamed_symbol160$$bison + 1669
>     frame #9: 0x0000000000407d75 bison`___lldb_unnamed_symbol177$$bison + 149
>     frame #10: 0x000000000040805d bison`___lldb_unnamed_symbol181$$bison + 109
>     frame #11: 0x000000000042803f bison`___lldb_unnamed_symbol403$$bison + 7679
>     frame #12: 0x000000000042e9c8 bison`___lldb_unnamed_symbol459$$bison + 56
>     frame #13: 0x0000000000403743 bison`___lldb_unnamed_symbol130$$bison + 291
>     frame #14: 0x0000000000403be0 bison`___lldb_unnamed_symbol130$$bison + 1472
> (lldb)
>
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"

--
Thomas E. Dickey <dickey_at_invisible-island.net>
https://invisible-island.net
ftp://ftp.invisible-island.net

Received on Mon Mar 29 2021 - 21:31:42 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:27 UTC