[Bug 268076] dc(1): crash on window size change

From: <bugzilla-noreply_at_freebsd.org>
Date: Tue, 06 Dec 2022 23:24:54 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268076

--- Comment #14 from Marcin Cieślak <saper@saper.info> ---
I have set a breakpoint on the signal handler and single-stepped it a bit:

+b bc_vm_sig
Note: breakpoint 1 also set at pc 0x23a66b.
Breakpoint 2 at 0x23a66b: file ./src/vm.c, line 123.
+run
Starting program: /usr/home/saper/src/bc/bin/bc 
warning: Could not load shared library symbols for [vdso].
Do you need "set solib-search-path" or "set sysroot"?

Breakpoint 1, bc_vm_sig (sig=28) at ./src/vm.c:123
123             if (vm->status == (sig_atomic_t) BC_STATUS_QUIT || vm->sig !=
0)
+p *vm
$2 = {status = 0, sig_pop = 0, prs = {l = {buf = 0x0, i = 0, line = 1, len = 0, 
      t = BC_LEX_EOF, last = BC_LEX_EOF, str = {v = 0x800a2a0e0 '\245' <repeats
32 times>, 
        len = 0, cap = 32, size = 1, dtor = 0}, mode = BC_MODE_EXPRS}, flags =
{
      v = 0x800a43040 "", len = 1, cap = 32, size = 2, dtor = 0}, exits = {
      v = 0x800a5d300 '\245' <repeats 200 times>..., len = 0, cap = 32, size =
24, 
      dtor = 0}, conds = {v = 0x800a50700 '\245' <repeats 200 times>..., len =
0, cap = 32, 
      size = 8, dtor = 0}, ops = {v = 0x800a09000 '\245' <repeats 128 times>,
len = 0, 
      cap = 32, size = 4, dtor = 0}, buf = {v = 0x800a2a0c0 '\245' <repeats 64
times>, 
      len = 0, cap = 32, size = 1, dtor = 0}, prog = 0x23ea00 <vm_data+288>, 
    func = 0x800a47000, fidx = 0, auto_part = false}, prog = {globals = {10,
10, 0, 10}, 
    globals_v = {{v = 0x800a50000 "\n", len = 1, cap = 32, size = 8, dtor = 0},
{
        v = 0x800a50100 "\n", len = 1, cap = 32, size = 8, dtor = 0}, {v =
0x800a50200 "", 
        len = 1, cap = 32, size = 8, dtor = 0}, {v = 0x800a50300 "\n", len = 1,
cap = 32, 
        size = 8, dtor = 0}}, rng = {v = {v = 0x800a54000 "", len = 1, cap =
32, size = 32, 
        dtor = 0}}, results = {v = 0x800a57000 '\245' <repeats 200 times>...,
len = 0, 
      cap = 32, size = 48, dtor = 6}, stack = {v = 0x800a5d000 "", len = 1, cap
= 32, 
      size = 24, dtor = 0}, consts = {v = 0x800a60000 '\245' <repeats 200
times>..., 
      len = 0, cap = 32, size = 56, dtor = 5}, const_map = {
      v = 0x800a44c00 '\245' <repeats 200 times>..., len = 0, cap = 32, size =
16, 
      dtor = 0}, strs = {v = 0x800a50600 '\245' <repeats 200 times>..., len =
0, cap = 32, 
      size = 8, dtor = 0}, str_map = {v = 0x800a44e00 '\245' <repeats 200
times>..., 
      len = 0, cap = 32, size = 16, dtor = 0}, fns = {v = 0x800a47000
"\200\240\242", 
      len = 2, cap = 32, size = 120, dtor = 3}, fn_map = {v = 0x800a44200 "",
len = 2, 
      cap = 32, size = 16, dtor = 0}, vars = {v = 0x800a54400 '\245' <repeats
200 times>..., 
      len = 0, cap = 32, size = 32, dtor = 1}, var_map = {
      v = 0x800a44800 '\245' <repeats 200 times>..., len = 0, cap = 32, size =
16, 
      dtor = 0}, arrs = {v = 0x800a54800 '\245' <repeats 200 times>..., len =
0, cap = 32, 
      size = 32, dtor = 1}, arr_map = {v = 0x800a44a00 '\245' <repeats 200
times>..., 
      len = 0, cap = 32, size = 16, dtor = 0}, tail_calls = {v = 0x0, len = 0,
cap = 0, 
      size = 0, dtor = 0}, strmb = {num = 0x23ecd8 <vm_data+1016>, rdx = 0,
scale = 0, 
      len = 1, cap = 8}, asciify = {num = 0x800a2a040, rdx = 0, scale = 0, len
= 0, 
      cap = 8}, last = {num = 0x800a2a060, rdx = 0, scale = 0, len = 0, cap =
8}, 
    strmb_num = {256, 0, 0, 0, 0, 0, 0, 0}}, line_buf = {v = 0x800a2a800 "",
len = 1, 
    cap = 32, size = 1, dtor = 0}, buffer = {v = 0x800a2a100 "", len = 1, cap =
32, 
    size = 1, dtor = 0}, read_prs = {l = {buf = 0x0, i = 0, line = 0, len = 0, 
      t = BC_LEX_EOF, last = BC_LEX_EOF, str = {v = 0x0, len = 0, cap = 0, size
= 0, 
        dtor = 0}, mode = BC_MODE_EXPRS}, flags = {v = 0x0, len = 0, cap = 0,
size = 0, 
      dtor = 0}, exits = {v = 0x0, len = 0, cap = 0, size = 0, dtor = 0}, conds
= {v = 0x0, 
      len = 0, cap = 0, size = 0, dtor = 0}, ops = {v = 0x0, len = 0, cap = 0,
size = 0, 
      dtor = 0}, buf = {v = 0x0, len = 0, cap = 0, size = 0, dtor = 0}, prog =
0x0, 
    func = 0x0, fidx = 0, auto_part = false}, read_buf = {v = 0x0, len = 0, cap
= 0, 
    size = 0, dtor = 0}, jmp_bufs = {v = 0x800a32000 "!\250!", len = 2, cap =
32, size = 96, 
    dtor = 0}, temps_len = 0, file = 0x20ab00 <bc_program_stdin_name>
"<stdin>", 
  sigmsg = 0x20a120 <bc_sig_msg> "\ninterrupt (type \"quit\" to exit)\n",
sig_lock = 1, 
  sig = 0, siglen = 33 '!', read_ret = 77 'M', flags = 15808, nchars = 0,
line_len = 69, 
  no_exprs = false, exit_exprs = false, eof = false, mode = 2 '\002',
no_redefine = false, 
  files = {v = 0x0, len = 0, cap = 0, size = 0, dtor = 0}, exprs = {v = 0x0,
len = 0, cap = 0, size = 0, dtor = 0}, name = 0x7fffffffea8b "bc", help =
0x2059b0 <bc_help> "usage: %s [options] [file...]\n\nbc is a command-line,
arbitrary-precision calculator with a Turing-complete\nlanguage. For details,
use `man %s` or see the online documentation at\nhttps://git.yzena.com/"...,
history = {el = 0x800a6a000, hist = 0x800a67000, badTerm = false}, next =
0x2113a0 <bc_lex_token>, parse = 0x2126c0 <bc_parse_parse>, expr = 0x213430
<bc_parse_expr>, func_header = 0x80027f32c "Function:", err_ids = {0x80027f336
"Math error:", 0x80027f342 "Parse error:", 0x80027f34f "Runtime error:",
0x80027f35e "Fatal error:", 0x80027f36b "Warning:"}, err_msgs = {0x80027f374
"negative number", 0x80027f384 "non-integer number", 0x80027f397 "overflow:
number does not fit into a hardware number", 0x80027f3cc "divide by 0",
0x80027fa7c "memory allocation failed", 0x80027fa95 "I/O error", 0x80027fa9f
"cannot open file: %s", 0x80027fab4 "file is not text: %s", 0x80027fac9 "path
is a directory: %s", 0x80027fae1 "invalid command-line option: \"%s\"",
0x80027fb03 "option requires an argument: '%c' (\"%s\")", 0x80027fb2c "option
takes no arguments: '%c' (\"%s\")", 0x80027fb53 "invalid command-line option
argument: \"%s\"", 0x80027f901 "invalid ibase: must be [%lu, %lu]", 0x80027f923
"invalid obase: must be [%lu, %lu]", 0x80027f945 "invalid scale: must be [%lu,
%lu]", 0x80027f967 "invalid read() expression", 0x80027f981 "recursive read()
call", 0x80027f997 "variable or array element is the wrong type", 0x80027f9c3
"stack has too few elements", 0x80027f9de "stack for register \"%s\" has too
few elements", 0x80027fa0b "wrong number of parameters; need %zu, have %zu",
0x80027fa3a "undefined function: %s()", 0x80027fa53 "cannot use a void value in
an expression", 0x80027f3d8 "end of file", 0x80027f3e4 "invalid character
'%c'", 0x80027f3fb "string end cannot be found", 0x80027f416 "comment end
cannot be found", 0x80027f432 "invalid token", 0x80027f440 "invalid
expression", 0x80027f453 "empty expression", 0x80027f464 "invalid print or
stream statement", 0x80027f486 "invalid function definition", 0x80027f4a2
"invalid assignment: left side must be scale, ibase, obase, seed, last, var, or
array element", 0x80027f4ff "no auto variable found", 0x80027f516 "function
parameter or auto \"%s%s\" already exists", 0x80027f547 "block end cannot be
found", 0x80027f561 "cannot return a value from void function: %s()",
0x80027f590 "var cannot be a reference: %s", 0x80027f5ae "POSIX does not allow
names longer than 1 character: %s", 0x80027f5e5 "POSIX does not allow '#'
script comments", 0x80027f60e "POSIX does not allow the following keyword: %s",
0x80027f63d "POSIX does not allow a period ('.') as a shortcut for the last
result", 0x80027f683 "POSIX requires parentheses around return expressions",
0x80027f6b8 "POSIX does not allow the following operator: %s", 0x80027f6e8
"POSIX does not allow comparison operators outside if statements or loops",
0x80027f731 "POSIX requires 0 or 1 comparison operators per condition",
0x80027f76a "POSIX requires all 3 parts of a for loop to be non-empty",
0x80027f7a3 "POSIX requires a newline between a semicolon and a function
definition", 0x80027f7ea "POSIX does not allow exponential notation",
0x80027f814 "POSIX does not allow array references as function parameters",
0x80027f851 "POSIX does not allow void functions", 0x80027f875 "POSIX requires
the left brace be on the same line as the function header", 0x80027f8be "POSIX
does not allow strings to be assigned to variables or arrays"}, locale =
0x8004a9380 "pl_PL.UTF-8/pl_PL.UTF-8/pl_PL.UTF-8/pl_PL.UTF-8/pl_PL.UTF-8/C",
maxes = {36, 1000000000, 18446744073709551614, 18446744073709551615, 0},
last_base = 0, last_pow = 0, last_exp = 0, last_rem = 0, env_args_buffer = 0x0,
env_args = {v = 0x0, len = 0, cap = 0, size = 0, dtor = 0}, zero = {num =
0x23f27c <vm_data+2460>, rdx = 0, scale = 0, len = 0, cap = 1}, one = {num =
0x23f278 <vm_data+2456>, rdx = 0, scale = 0, len = 1, cap = 1}, max = {num =
0x23f238 <vm_data+2392>, rdx = 0, scale = 0, len = 3, cap = 8}, max2 = {num =
0x23f258 <vm_data+2424>, rdx = 0, scale = 0, len = 5, cap = 8}, max_num =
{709551616, 446744073, 18, 0, 0, 0, 0, 0}, max2_num = {768211456, 374607431,
938463463, 282366920, 340, 0, 0, 0}, one_num = {1}, zero_num = {0}, fout = {f =
0x8004a1b08}, ferr = {f = 0x8004a1c40}, catalog = 0x800a42000, buf = 0x2402f0
<output_bufs> "", buf_len = 0, slabs = {v = 0x800a44000 "", len = 1, cap = 32,
size = 16, dtor = 4}, redefined_kws = {false <repeats 37 times>}, temps_buf =
{0x0 <repeats 512 times>}}
+p errno
$3 = 2
+n
131             if (sig == SIGWINCH)
+n
133                     if (BC_TTY)
+n
135                             el_resize(vm->history.el);
+n
136                     }
+n
144                     return;
+n
198     }
+n
_read () at _read.S:4
4       _read.S: No such file or directory.
+n
cerror () at /usr/src/lib/libc/amd64/sys/cerror.S:52
52              pushq   %rax
+n
cerror () at /usr/src/lib/libc/amd64/sys/cerror.S:53
53              call    PIC_PLT(CNAME(__error))
+bt
#0  cerror () at /usr/src/lib/libc/amd64/sys/cerror.S:53
#1  0x0000000000000004 in ?? ()
#2  0x00000008002a4365 in read_char (el=0x800a6a000, 
    cp=0x7fffffffe294
L"\b\xffffe334翿\x86587f0\x9d83834d\xffffe6a0翿\xffffe688翿")
    at /usr/src/contrib/libedit/read.c:287
#3  0x00000008002a47af in el_wgetc (el=el@entry=0x800a6a000, 
    cp=cp@entry=0x7fffffffe294
L"\b\xffffe334翿\x86587f0\x9d83834d\xffffe6a0翿\xffffe688翿") at
/usr/src/contrib/libedit/read.c:406
#4  0x00000008002a49ab in read_getcmd (el=<optimized out>, cmdnum=<optimized
out>, 
    ch=<optimized out>) at /usr/src/contrib/libedit/read.c:233
#5  el_wgets (el=0x800a6a000, nread=0x7fffffffe334) at
/usr/src/contrib/libedit/read.c:519
#6  0x000000080029b199 in el_gets (el=0x0, nread=0x7fffffffe18a)
    at /usr/src/contrib/libedit/eln.c:75
#7  0x00000000002187e2 in bc_history_line (h=0x23ef10 <vm_data+1584>, 
    vec=0x23ecf8 <vm_data+1048>, prompt=0x201cbd ">>> ") at ./src/history.c:259
#8  0x0000000000235870 in bc_read_line (vec=0x23ecf8 <vm_data+1048>,
prompt=0x201cbd ">>> ")
    at ./src/read.c:250
#9  0x0000000000238d3e in bc_vm_readLine (clear=true) at ./src/vm.c:1123
#10 0x000000000023b6f0 in bc_vm_stdin () at ./src/vm.c:1174
#11 0x000000000023a64d in bc_vm_exec () at ./src/vm.c:1510
#12 0x000000000023996e in bc_vm_boot (argc=1, argv=0x7fffffffe690) at
./src/vm.c:1700
#13 0x000000000021138c in bc_main (argc=1, argv=0x7fffffffe690) at
./src/bc.c:62
#14 0x000000000021a8c9 in main (argc=1, argv=0x7fffffffe690) at
./src/main.c:108
+q


What happens here is that the signal handler does not do too much, it tells
libedit to resize and then exits with an early "return". Since we are in a
read() system call, it will be interrupted.

-- 
You are receiving this mail because:
You are the assignee for the bug.