From 5de5611c24e8b2d78c7e9437a5ec294e68cbca2e Mon Sep 17 00:00:00 2001 From: George Koehler Date: Fri, 15 Jun 2018 00:17:12 -0400 Subject: [PATCH 1/2] Use 2-byte alignment in pdpv7 to prevent SIGBUS. Change the alignment in C structs (wa, pa, sa, and so on) from 1 to 2 bytes. This prevents the SIGBUS when PDP-11 Unix V7 catches the misalignment. This fixes hilo_p.pdpv7 in simh-pdp11. Change ALIGN to document that sections have 2-byte alignment. This change should have no effect, because the sections only contain 2-byte values. --- plat/pdpv7/descr | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plat/pdpv7/descr b/plat/pdpv7/descr index ee69bf137..1fcc21161 100644 --- a/plat/pdpv7/descr +++ b/plat/pdpv7/descr @@ -1,24 +1,24 @@ # $Revision$ var w=2 -var wa=1 +var wa=2 var p=2 -var pa=1 +var pa=2 var s=2 -var sa=1 +var sa=2 var l=4 -var la=1 +var la=2 var f=4 -var fa=1 +var fa=2 var d=8 -var da=1 +var da=2 var x=8 -var xa=1 +var xa=2 var ARCH=pdp var PLATFORM=pdpv7 var PLATFORMDIR={EM}/share/ack/{PLATFORM} var CPP_F=-D__unix -var ALIGN=-a0:1 -a1:1 -a2:1 -a3:1 +var ALIGN=-a0:2 -a1:2 -a2:2 -a3:2 var C_INCLUDES=-I{PLATFORMDIR}/include -I{EM}/share/ack/include/ansi From 5db312a1c0891f16d88fd3f187e0fda46044b4a5 Mon Sep 17 00:00:00 2001 From: George Koehler Date: Fri, 15 Jun 2018 00:48:29 -0400 Subject: [PATCH 2/2] Prevent crash in isatty() The existing code allocated 2 bytes (char*), but gtty() needs 6 bytes (struct sgttyb), so isatty() smashed the stack and corrupted its return address, probably causing SIGBUS or SIGSEGV. Fix by switching to TIOCGETD, which needs 2 bytes. TIOCGETD isn't in the manual for tty(4), but does appear in https://minnie.tuhs.org//cgi-bin/utree.pl?file=V7/usr/sys/dev/tty.c This fixes hilo_c.pdpv7 and hilo_mod.pdpv7 in simh-pdp11. --- plat/pdpv7/libsys/isatty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plat/pdpv7/libsys/isatty.c b/plat/pdpv7/libsys/isatty.c index 9ff30e797..7bf22b914 100644 --- a/plat/pdpv7/libsys/isatty.c +++ b/plat/pdpv7/libsys/isatty.c @@ -1,8 +1,8 @@ int isatty(int fd) { - char* p; + unsigned u; - if (gtty(fd, &p) < 0) + if (ioctl(fd, /*TIOCGETD*/(('t'<<8)|0), &u) < 0) return 0; return 1; }