main changed DIALOG_STATE, DIALOG_VARS, and DIALOG_COLORS but /usr/lib/libdialog.so.? naming was not adjusted? (crashes in releng/13 programs on main [so: 14] can result)
Date: Fri, 22 Oct 2021 08:08:39 UTC
main [soi: 14] commit a96ef450 (2021-02-26 09:16:49 +0000)
changed DIALOG_STATE, DIALOG_VARS, and DIALOG_COLORS .
These are publicly exposed in (ones that I noticed):
/usr/include/dialog.h:extern DIALOG_STATE dialog_state;
/usr/include/dialog.h:extern DIALOG_VARS dialog_vars;
/usr/include/dialog.h:extern DIALOG_COLORS dlg_color_table[];
and ends up with the storage being form the .bss of
the likes of dialog4ports (the example I ran into).
But the .9 in /usr/lib/libdialog.so.9 's .text that references
the storage where not increased compared to releng/13.0 and
stable/13 that predate the changes, there by not matching
old programs built under releng/13.0 or stable/13 .
Turns out that this explains the crashes I get when I attempt
to use a releng/13 based dialog4ports under main [so: 14]. For
a particular example, see:
https://lists.freebsd.org/archives/freebsd-current/2021-October/000860.html
It shows /usr/main-src/contrib/dialog/dlg_keys.c in
/usr/lib/libdialog.so.9 updating a new field:
286 } else {
287 dialog_state.had_resize = FALSE;
0x00000008002d298e <+62>: movb $0x0,0x84(%rax)
such that the following happens:
Hardware watchpoint 1: -location __stderrp
Old value = (FILE *) 0x8004d4940
New value = (FILE *) 0x4d4940
where:
(gdb) print &__stderrp
$4 = (FILE **) 0x208568 <__stderrp>
which has that storage in the dialog4ports area:
0x0000000000208360 - 0x0000000000208c50 is .bss
with the older set of fields and size for:
extern DIALOG_STATE dialog_state;
That in turn later leads to a SIGSEGV from the point of
view of a releng/13 based dialog4ports build.
Should main [14] instead have:
/usr/lib/libdialog.so.10
in order to avoid some releng/13.0 and stable/13 programs
trashing their memory? I'm guessing there is no reasonble
way to "compat" this. But preventing programs from trashing
there own memory and running in a corrupted state seems
achievable if the /usr/lib/libdialog.so.? name changes.
This might be something for a freebsd-arch discussion for
relevant folks.
===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)