[Bug 268076] dc(1): crash on window size change
- In reply to: bugzilla-noreply_a_freebsd.org: "[Bug 268076] dc(1): crash on window size change"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 30 Nov 2022 16:04:49 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268076
--- Comment #4 from Marcin Cieślak <saper@saper.info> ---
Thank you for a very quick response, here is how it looks now:
dc(1) prints "ready for more input" every time I resize the window, but does
not crash at all
radziecki> ./bin/dc
2 2 + p
4
ready for more input
5 # resize
ready for more input
ready for more input
ready for more input
bc(1) exists as before
radziecki> ./bin/bc
>>> 2 + 2
4
>>>
Fatal error: I/O error
Function: (main)
This is your software and I fully respect your right to design its features as
you see fit, especially given the maintenance burden is mostly on you.
I think classic "perror()" would be slighly better here (of course without all
the i18n goodies).
diff --git a/src/history.c b/src/history.c
index bc15da5b..15e6e25b 100644
--- a/src/history.c
+++ b/src/history.c
@@ -264,8 +264,7 @@ bc_history_line(BcHistory* h, BcVec* vec, const char*
prompt)
// If this is true, there was an error. Otherwise, it's just
EOF.
if (len == -1)
{
- if (errno == ENOMEM) bc_err(BC_ERR_FATAL_ALLOC_ERR);
- bc_err(BC_ERR_FATAL_IO_ERR);
+ perror("reading next input line failed");
}
else
{
Maybe it could be helpful to tell you how I approached the problem.
This is just my personal story and certainly not a case for everyone
approaching unknown software:
1. First I did
git grep "Fatal error"
to find out there is i18n system in place and it looks like "I/O Error" is an
error number 5 (counted by hand in "bc_err_msgs")
2. Then I did
git grep bc_err_msgs
to learn that the whole i18n thing is initialized via bc_vm_defaultMsgs()
but still no clue regarding what might have caused it
3. Then tried my luck to
git grep bc_err_ids
that reveals there is bc_vm_handleError() and the name looks promising
4. Having learned that it was easier:
(gdb) b bc_vm_handleError
Breakpoint 1 at 0x2372f8: file ./src/vm.c, line 351.
(gdb) 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_handleError (e=BC_ERR_FATAL_IO_ERR, line=0) at
./src/vm.c:351
351 uchar id = bc_err_ids[e];
(gdb) bt
#0 bc_vm_handleError (e=BC_ERR_FATAL_IO_ERR, line=0)
at ./src/vm.c:351
#1 0x0000000000218169 in bc_history_line (
h=0x23e440 <vm_data+1584>, vec=0x23e228 <vm_data+1048>,
prompt=0x201ca5 ">>> ") at ./src/history.c:268
#2 0x0000000000234e10 in bc_read_line (
vec=0x23e228 <vm_data+1048>, prompt=0x201ca5 ">>> ")
at ./src/read.c:236
#3 0x000000000023827e in bc_vm_readLine (clear=true)
at ./src/vm.c:1114
#4 0x000000000023ac20 in bc_vm_stdin () at ./src/vm.c:1165
#5 0x0000000000239b7d in bc_vm_exec () at ./src/vm.c:1501
#6 0x0000000000238eae in bc_vm_boot (argc=1, argv=0x7fffffffe6b0)
at ./src/vm.c:1691
#7 0x000000000021131c in bc_main (argc=1, argv=0x7fffffffe6b0)
at ./src/bc.c:62
#8 0x000000000021a199 in main (argc=1, argv=0x7fffffffe6b0)
at ./src/main.c:108
(gdb) down
Bottom (innermost) frame selected; you cannot go down.
(gdb) up
#1 0x0000000000218169 in bc_history_line (h=0x23e440 <vm_data+1584>,
vec=0x23e228 <vm_data+1048>, prompt=0x201ca5 ">>> ")
at ./src/history.c:268
268 bc_err(BC_ERR_FATAL_IO_ERR);
(gdb) list -
263 {
264 // If this is true, there was an error. Otherwise, it's
just EOF.
265 if (len == -1)
266 {
267 if (errno == ENOMEM)
bc_err(BC_ERR_FATAL_ALLOC_ERR);
268 bc_err(BC_ERR_FATAL_IO_ERR);
269 }
270 else
271 {
272 bc_file_printf(&vm->fout, "\n");
(gdb)
253 }
254 }
255 else bc_history_prompt = bc_vm_strdup(prompt);
256 }
257
258 // Get the line.
259 line = el_gets(h->el, &len);
260
261 // If there is no line...
262 if (BC_ERR(line == NULL))
(gdb) p line
$1 = 0x0
(gdb) p h->el
$2 = (EditLine *) 0x800a6a000
(gdb) p len
$3 = -1
What certainly would help is some unique identification of the position of the
error in the code (be it __FILE__, __LINE__ if need be). BC_ERR_FATAL_IO_ERR is
thrown in dozen or so places so I can't quickly tell where did it fail.
Since FreeBSD runs optimized binaries, but with debug symbols available, it was
frustrating to see all local variables optimized out, only errno was there:
(gdb) p len
$1 = <optimized out>
(gdb) p line
$2 = <optimized out>
(gdb) p h->el
value has been optimized out
(gdb) p errno
$3 = 4
(feel free to move this conversation somewhere else, sadly could not register
at https://git.yzena.com/gavin/bc/)
But again, thank you for building this software for us.
--
You are receiving this mail because:
You are the assignee for the bug.