Hello, just tried to reproduce this issue. I think the problem is with the usage of the segment register $fs in dosemu that is not compatible with gcc use of that segment register $fs.
It looks like in "regular" processes the $fs register stays always at a value of 0. But after starting the unzip32.exe from message #15 we get to the point where the stack protection canary value is filled in "dosemu_fault". But this time $fs = 0xb7, therefore the canary gets a differnt value than usual: 0x00005555555a5c4d <dosemu_fault+13>: mov %fs:0x28,%rax 0x00005555555a5c56 <dosemu_fault+22>: mov %rax,0x88(%rsp) Later "dosemu_fault" executes "init_handler" that calls "syscall". After that the $fs register is 0 again: 147 return syscall(SYS_arch_prctl, code, addr); Then at the end of dosemu_fault the stack protection canary value is now compared again, but with a different $fs the values are different: 0x00005555555a5d18 <dosemu_fault+216>: xor %fs:0x28,%rax 0x00005555555a5d21 <dosemu_fault+225>: jne 0x5555555a5e4b <dosemu_fault+523> ... 0x00005555555a5e4b <dosemu_fault+523>: callq 0x55555557a140 <__stack_chk_fail@plt> So really there is no stack smashing going on, just the detection is not working in this environment. This is also confirmed in this link [1]. There is also a hint how to avoid the stack protection mechanism to be added to some functions. Attached patch does exactly this. The stack smashing can be observed in the unstable package of dosemu too. Kind regards, Bernhard [1] https://aur.archlinux.org/packages/dosemu-git/
apt install xserver-xorg lightdm openbox dosemu dosemu-dbgsym gdb valgrind zip dpkg-dev devscripts mc git apt build-dep dosemu (mkdir dosemu; cd dosemu; apt source dosemu) wget --user-agent="" http://www.delorie.com/pub/djgpp/current/unzip32.exe mv unzip32.exe .dosemu/drive_c/ /usr/bin/xdosemu benutzer@debian:~$ /usr/bin/xdosemu *** stack smashing detected ***: /usr/bin/xdosemu terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7f57d2425bfb] /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f57d24ae1f7] /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f57d24ae1c0] /usr/bin/xdosemu(+0x51e50)[0x55604d00be50] /lib/x86_64-linux-gnu/libc.so.6(+0x33060)[0x7f57d23e8060] /usr/bin/xdosemu(run_dpmi+0x119)[0x55604d059dc9] ======= Memory map: ======== gdb -q --args /usr/bin/dosemu.bin -X -p -E "unzip32" handle SIGSEGV nostop noprint cont *** stack smashing detected ***: /usr/bin/dosemu.bin terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7ffff739abfb] /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7ffff74231f7] /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7ffff74231c0] /usr/bin/dosemu.bin(+0x51e50)[0x5555555a5e50] /lib/x86_64-linux-gnu/libc.so.6(+0x33060)[0x7ffff735d060] /usr/bin/dosemu.bin(run_dpmi+0x119)[0x5555555f3dc9] ======= Memory map: ======== (gdb) disassemble dosemu_fault,0x00005555555a5e4b+0x20 ... 0x0000561052192c4d <dosemu_fault+13>: mov %fs:0x28,%rax 0x0000561052192c56 <dosemu_fault+22>: mov %rax,0x88(%rsp) 0x0000561052192c5e <dosemu_fault+30>: xor %eax,%eax ... 0x0000561052192d10 <dosemu_fault+208>: mov 0x88(%rsp),%rax 0x0000561052192d18 <dosemu_fault+216>: xor %fs:0x28,%rax 0x0000561052192d21 <dosemu_fault+225>: jne 0x561052192e4b <dosemu_fault+523> ... 0x0000561052192e4b <dosemu_fault+523>: callq 0x561052167140 <__stack_chk_fail@plt> 0x0000561052192e50 <SIGIO_call+0>: sub $0x8,%rsp . gdb -q --args /usr/bin/dosemu.bin -X -p -E "unzip32" directory /home/benutzer/dosemu/orig/dosemu-1.4.0.7+20130105+b028d3f/src/arch/linux/async handle SIGSEGV nostop noprint set height 0 set width 0 set pagination off display/i $pc b *(dosemu_fault+30) run print/x 0x88+$rsp print/x *(int*)0x7fffffffe148 display/x $fs b *(dosemu_fault+13) if ($fs != 0) disa 1 cont benutzer@debian:~$ gdb -q --args /usr/bin/dosemu.bin -X -p -E "unzip32" Reading symbols from /usr/bin/dosemu.bin...Reading symbols from /usr/lib/debug/.build-id/e6/269b11b17af3136254880ec6b9bd18f464db59.debug...done. done. (gdb) directory /home/benutzer/dosemu/orig/dosemu-1.4.0.7+20130105+b028d3f/src/arch/linux/async Source directories searched: /home/benutzer/dosemu/orig/dosemu-1.4.0.7+20130105+b028d3f/src/arch/linux/async:$cdir:$cwd (gdb) handle SIGSEGV nostop noprint Signal Stop Print Pass to program Description SIGSEGV No No Yes Segmentation fault (gdb) set height 0 (gdb) set width 0 (gdb) set pagination off (gdb) display/i $pc 1: x/i $pc <error: No registers.> (gdb) b *(dosemu_fault+30) Breakpoint 1 at 0x51c5e: file sigsegv.c, line 453. (gdb) run Starting program: /usr/bin/dosemu.bin -X -p -E unzip32 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 1, 0x00005555555a5c5e in dosemu_fault (signal=11, si=0x7fffffffe2b0, uc=0x7fffffffe180) at sigsegv.c:453 453 { 1: x/i $pc => 0x5555555a5c5e <dosemu_fault+30>: xor %eax,%eax (gdb) print/x 0x88+$rsp $1 = 0x7fffffffe148 (gdb) print/x *(int*)0x7fffffffe148 $2 = 0xe1943200 (gdb) display/x $fs 2: /x $fs = 0x0 (gdb) (gdb) b *(dosemu_fault+13) if ($fs != 0) Breakpoint 2 at 0x5555555a5c4d: file sigsegv.c, line 453. (gdb) disa 1 (gdb) cont Continuing. Breakpoint 2, dosemu_fault (signal=11, si=0x7fffffffe2b0, uc=0x7fffffffe180) at sigsegv.c:453 453 { 1: x/i $pc => 0x5555555a5c4d <dosemu_fault+13>: mov %fs:0x28,%rax 2: /x $fs = 0xb7 (gdb) display/x *(int*)0x7fffffffe148 3: /x *(int*)0x7fffffffe148 = 0xe1943200 (gdb) undisp 3 (gdb) nexti 0x00005555555a5c56 453 { 1: x/i $pc => 0x5555555a5c56 <dosemu_fault+22>: mov %rax,0x88(%rsp) 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c5e 453 { 1: x/i $pc => 0x5555555a5c5e <dosemu_fault+30>: xor %eax,%eax 2: /x $fs = 0xb7 (gdb) dosemu_fault0 (scp=0x7fffffffe1a8, signal=11) at sigsegv.c:387 387 fault_cnt++; 1: x/i $pc => 0x5555555a5c60 <dosemu_fault+32>: mov 0x38515a(%rip),%eax # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c66 387 fault_cnt++; 1: x/i $pc => 0x5555555a5c66 <dosemu_fault+38>: add $0x1,%eax 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c69 387 fault_cnt++; 1: x/i $pc => 0x5555555a5c69 <dosemu_fault+41>: mov %eax,0x385151(%rip) # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0xb7 (gdb) 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c6f <dosemu_fault+47>: mov 0x38514b(%rip),%eax # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c75 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c75 <dosemu_fault+53>: cmp $0x2,%eax 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c78 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c78 <dosemu_fault+56>: jg 0x5555555a5e41 <dosemu_fault+513> 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c7e 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c7e <dosemu_fault+62>: lea 0x28(%rdx),%rbx 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c82 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c82 <dosemu_fault+66>: mov %edi,%r12d 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c85 388 if (fault_cnt > 2) { 1: x/i $pc => 0x5555555a5c85 <dosemu_fault+69>: mov %rdx,%rbp 2: /x $fs = 0xb7 (gdb) 397 init_handler(scp); 1: x/i $pc => 0x5555555a5c88 <dosemu_fault+72>: mov %rbx,%rdi 2: /x $fs = 0xb7 (gdb) 0x00005555555a5c8b 397 init_handler(scp); 1: x/i $pc => 0x5555555a5c8b <dosemu_fault+75>: callq 0x5555555a6790 <init_handler> 2: /x $fs = 0xb7 (gdb) 399 if (kernel_version_code < 0x20600+14) { 1: x/i $pc => 0x5555555a5c90 <dosemu_fault+80>: cmpl $0x2060d,0x527892(%rip) # 0x555555acd52c <kernel_version_code> 2: /x $fs = 0x0 (gdb) 0x00005555555a5c9a 399 if (kernel_version_code < 0x20600+14) { 1: x/i $pc => 0x5555555a5c9a <dosemu_fault+90>: jle 0x5555555a5d48 <dosemu_fault+264> 2: /x $fs = 0x0 (gdb) 411 if (fault_cnt > 1 && _trapno == 0xe && !DPMIValidSelector(_cs)) { 1: x/i $pc => 0x5555555a5ca0 <dosemu_fault+96>: mov 0x38511a(%rip),%eax # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0x0 (gdb) 0x00005555555a5ca6 411 if (fault_cnt > 1 && _trapno == 0xe && !DPMIValidSelector(_cs)) { 1: x/i $pc => 0x5555555a5ca6 <dosemu_fault+102>: cmp $0x1,%eax 2: /x $fs = 0x0 (gdb) 0x00005555555a5ca9 411 if (fault_cnt > 1 && _trapno == 0xe && !DPMIValidSelector(_cs)) { 1: x/i $pc => 0x5555555a5ca9 <dosemu_fault+105>: jle 0x5555555a5cbc <dosemu_fault+124> 2: /x $fs = 0x0 (gdb) debug_level (letter=103) at ../../../../src/include/dosemu_debug.h:187 187 return debug[letter].level; 1: x/i $pc => 0x5555555a5cbc <dosemu_fault+124>: movzbl 0x790cf5(%rip),%edi # 0x555555d369b8 <debug+2488> 2: /x $fs = 0x0 (gdb) dosemu_fault0 (scp=0x7fffffffe1a8, signal=11) at sigsegv.c:436 436 if (debug_level('g')>7) 1: x/i $pc => 0x5555555a5cc3 <dosemu_fault+131>: cmp $0x7,%edi 2: /x $fs = 0x0 (gdb) 0x00005555555a5cc6 436 if (debug_level('g')>7) 1: x/i $pc => 0x5555555a5cc6 <dosemu_fault+134>: jg 0x5555555a5e20 <dosemu_fault+480> 2: /x $fs = 0x0 (gdb) 440 retcode = dosemu_fault1 (signal, scp); 1: x/i $pc => 0x5555555a5ccc <dosemu_fault+140>: mov %r12d,%edi 2: /x $fs = 0x0 (gdb) 0x00005555555a5ccf 440 retcode = dosemu_fault1 (signal, scp); 1: x/i $pc => 0x5555555a5ccf <dosemu_fault+143>: mov %rbx,%rsi 2: /x $fs = 0x0 (gdb) 0x00005555555a5cd2 440 retcode = dosemu_fault1 (signal, scp); 1: x/i $pc => 0x5555555a5cd2 <dosemu_fault+146>: callq 0x5555555a5240 <dosemu_fault1> 2: /x $fs = 0x0 (gdb) debug_level (letter=<optimized out>) at ../../../../src/include/dosemu_debug.h:187 187 return debug[letter].level; 1: x/i $pc => 0x5555555a5cd7 <dosemu_fault+151>: movzbl 0x790cda(%rip),%edi # 0x555555d369b8 <debug+2488> 2: /x $fs = 0x0 (gdb) dosemu_fault0 (scp=0x7fffffffe1a8, signal=11) at sigsegv.c:440 440 retcode = dosemu_fault1 (signal, scp); 1: x/i $pc => 0x5555555a5cde <dosemu_fault+158>: mov %eax,%r12d 2: /x $fs = 0x0 (gdb) 442 if (debug_level('g')>8) 1: x/i $pc => 0x5555555a5ce1 <dosemu_fault+161>: cmp $0x8,%edi 2: /x $fs = 0x0 (gdb) 0x00005555555a5ce4 442 if (debug_level('g')>8) 1: x/i $pc => 0x5555555a5ce4 <dosemu_fault+164>: jle 0x5555555a5cf4 <dosemu_fault+180> 2: /x $fs = 0x0 (gdb) 444 if(retcode) 1: x/i $pc => 0x5555555a5cf4 <dosemu_fault+180>: test %r12d,%r12d 2: /x $fs = 0x0 (gdb) 0x00005555555a5cf7 444 if(retcode) 1: x/i $pc => 0x5555555a5cf7 <dosemu_fault+183>: jne 0x5555555a5d38 <dosemu_fault+248> 2: /x $fs = 0x0 (gdb) 445 _eax = retcode; 1: x/i $pc => 0x5555555a5d38 <dosemu_fault+248>: mov %r12d,0x90(%rbp) 2: /x $fs = 0x0 (gdb) 0x00005555555a5d3f 445 _eax = retcode; 1: x/i $pc => 0x5555555a5d3f <dosemu_fault+255>: jmp 0x5555555a5cf9 <dosemu_fault+185> 2: /x $fs = 0x0 (gdb) 446 dpmi_iret_setup(scp); 1: x/i $pc => 0x5555555a5cf9 <dosemu_fault+185>: mov %rbx,%rdi 2: /x $fs = 0x0 (gdb) 0x00005555555a5cfc 446 dpmi_iret_setup(scp); 1: x/i $pc => 0x5555555a5cfc <dosemu_fault+188>: callq 0x5555555ec840 <dpmi_iret_setup> 2: /x $fs = 0x0 (gdb) 447 fault_cnt--; 1: x/i $pc => 0x5555555a5d01 <dosemu_fault+193>: mov 0x3850b9(%rip),%eax # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0x0 (gdb) 0x00005555555a5d07 447 fault_cnt--; 1: x/i $pc => 0x5555555a5d07 <dosemu_fault+199>: sub $0x1,%eax 2: /x $fs = 0x0 (gdb) 0x00005555555a5d0a 447 fault_cnt--; 1: x/i $pc => 0x5555555a5d0a <dosemu_fault+202>: mov %eax,0x3850b0(%rip) # 0x55555592adc0 <fault_cnt> 2: /x $fs = 0x0 (gdb) dosemu_fault (signal=<optimized out>, si=<optimized out>, uc=0x7fffffffe180) at sigsegv.c:456 456 } 1: x/i $pc => 0x5555555a5d10 <dosemu_fault+208>: mov 0x88(%rsp),%rax 2: /x $fs = 0x0 (gdb) 0x00005555555a5d18 456 } 1: x/i $pc => 0x5555555a5d18 <dosemu_fault+216>: xor %fs:0x28,%rax 2: /x $fs = 0x0 (gdb) 0x00005555555a5d21 456 } 1: x/i $pc => 0x5555555a5d21 <dosemu_fault+225>: jne 0x5555555a5e4b <dosemu_fault+523> 2: /x $fs = 0x0 (gdb) 456 } 1: x/i $pc => 0x5555555a5e4b <dosemu_fault+523>: callq 0x55555557a140 <__stack_chk_fail@plt> 2: /x $fs = 0x0 (gdb) bt #0 dosemu_fault (signal=<optimized out>, si=<optimized out>, uc=0x7fffffffe180) at sigsegv.c:456 #1 <signal handler called> #2 0x00005555555f3dc9 in dpmi_transfer (scp=0x400bf, xfr=<optimized out>) at dpmi.c:407 #3 direct_dpmi_switch (scp=0x400bf) at dpmi.c:483 #4 dpmi_control () at dpmi.c:593 #5 run_dpmi () at dpmi.c:2870 #6 0x0000000000000000 in ?? () (gdb) disassemble dosemu_fault,0x00005555555a5e4b+0x20 Dump of assembler code from 0x5555555a5c40 to 0x5555555a5e6b: 0x00005555555a5c40 <dosemu_fault+0>: push %r13 0x00005555555a5c42 <dosemu_fault+2>: push %r12 0x00005555555a5c44 <dosemu_fault+4>: push %rbp 0x00005555555a5c45 <dosemu_fault+5>: push %rbx 0x00005555555a5c46 <dosemu_fault+6>: sub $0x98,%rsp 0x00005555555a5c4d <dosemu_fault+13>: mov %fs:0x28,%rax 0x00005555555a5c56 <dosemu_fault+22>: mov %rax,0x88(%rsp) 0x00005555555a5c5e <dosemu_fault+30>: xor %eax,%eax 0x00005555555a5c60 <dosemu_fault+32>: mov 0x38515a(%rip),%eax # 0x55555592adc0 <fault_cnt> 0x00005555555a5c66 <dosemu_fault+38>: add $0x1,%eax 0x00005555555a5c69 <dosemu_fault+41>: mov %eax,0x385151(%rip) # 0x55555592adc0 <fault_cnt> 0x00005555555a5c6f <dosemu_fault+47>: mov 0x38514b(%rip),%eax # 0x55555592adc0 <fault_cnt> 0x00005555555a5c75 <dosemu_fault+53>: cmp $0x2,%eax 0x00005555555a5c78 <dosemu_fault+56>: jg 0x5555555a5e41 <dosemu_fault+513> 0x00005555555a5c7e <dosemu_fault+62>: lea 0x28(%rdx),%rbx 0x00005555555a5c82 <dosemu_fault+66>: mov %edi,%r12d 0x00005555555a5c85 <dosemu_fault+69>: mov %rdx,%rbp 0x00005555555a5c88 <dosemu_fault+72>: mov %rbx,%rdi 0x00005555555a5c8b <dosemu_fault+75>: callq 0x5555555a6790 <init_handler> 0x00005555555a5c90 <dosemu_fault+80>: cmpl $0x2060d,0x527892(%rip) # 0x555555acd52c <kernel_version_code> 0x00005555555a5c9a <dosemu_fault+90>: jle 0x5555555a5d48 <dosemu_fault+264> 0x00005555555a5ca0 <dosemu_fault+96>: mov 0x38511a(%rip),%eax # 0x55555592adc0 <fault_cnt> 0x00005555555a5ca6 <dosemu_fault+102>: cmp $0x1,%eax 0x00005555555a5ca9 <dosemu_fault+105>: jle 0x5555555a5cbc <dosemu_fault+124> 0x00005555555a5cab <dosemu_fault+107>: movzwl 0xc8(%rbp),%ecx 0x00005555555a5cb2 <dosemu_fault+114>: cmp $0xe,%cx 0x00005555555a5cb6 <dosemu_fault+118>: je 0x5555555a5d70 <dosemu_fault+304> 0x00005555555a5cbc <dosemu_fault+124>: movzbl 0x790cf5(%rip),%edi # 0x555555d369b8 <debug+2488> 0x00005555555a5cc3 <dosemu_fault+131>: cmp $0x7,%edi 0x00005555555a5cc6 <dosemu_fault+134>: jg 0x5555555a5e20 <dosemu_fault+480> 0x00005555555a5ccc <dosemu_fault+140>: mov %r12d,%edi 0x00005555555a5ccf <dosemu_fault+143>: mov %rbx,%rsi 0x00005555555a5cd2 <dosemu_fault+146>: callq 0x5555555a5240 <dosemu_fault1> 0x00005555555a5cd7 <dosemu_fault+151>: movzbl 0x790cda(%rip),%edi # 0x555555d369b8 <debug+2488> 0x00005555555a5cde <dosemu_fault+158>: mov %eax,%r12d 0x00005555555a5ce1 <dosemu_fault+161>: cmp $0x8,%edi 0x00005555555a5ce4 <dosemu_fault+164>: jle 0x5555555a5cf4 <dosemu_fault+180> 0x00005555555a5ce6 <dosemu_fault+166>: lea 0xdd78b(%rip),%rsi # 0x555555683478 0x00005555555a5ced <dosemu_fault+173>: xor %eax,%eax 0x00005555555a5cef <dosemu_fault+175>: callq 0x5555555add70 <log_printf> 0x00005555555a5cf4 <dosemu_fault+180>: test %r12d,%r12d 0x00005555555a5cf7 <dosemu_fault+183>: jne 0x5555555a5d38 <dosemu_fault+248> 0x00005555555a5cf9 <dosemu_fault+185>: mov %rbx,%rdi 0x00005555555a5cfc <dosemu_fault+188>: callq 0x5555555ec840 <dpmi_iret_setup> 0x00005555555a5d01 <dosemu_fault+193>: mov 0x3850b9(%rip),%eax # 0x55555592adc0 <fault_cnt> 0x00005555555a5d07 <dosemu_fault+199>: sub $0x1,%eax 0x00005555555a5d0a <dosemu_fault+202>: mov %eax,0x3850b0(%rip) # 0x55555592adc0 <fault_cnt> 0x00005555555a5d10 <dosemu_fault+208>: mov 0x88(%rsp),%rax 0x00005555555a5d18 <dosemu_fault+216>: xor %fs:0x28,%rax 0x00005555555a5d21 <dosemu_fault+225>: jne 0x5555555a5e4b <dosemu_fault+523> 0x00005555555a5d27 <dosemu_fault+231>: add $0x98,%rsp 0x00005555555a5d2e <dosemu_fault+238>: pop %rbx 0x00005555555a5d2f <dosemu_fault+239>: pop %rbp 0x00005555555a5d30 <dosemu_fault+240>: pop %r12 0x00005555555a5d32 <dosemu_fault+242>: pop %r13 0x00005555555a5d34 <dosemu_fault+244>: retq 0x00005555555a5d35 <dosemu_fault+245>: nopl (%rax) 0x00005555555a5d38 <dosemu_fault+248>: mov %r12d,0x90(%rbp) 0x00005555555a5d3f <dosemu_fault+255>: jmp 0x5555555a5cf9 <dosemu_fault+185> 0x00005555555a5d41 <dosemu_fault+257>: nopl 0x0(%rax) 0x00005555555a5d48 <dosemu_fault+264>: mov %rsp,%rdi 0x00005555555a5d4b <dosemu_fault+267>: callq 0x55555557a500 <sigemptyset@plt> 0x00005555555a5d50 <dosemu_fault+272>: mov %r12d,%esi 0x00005555555a5d53 <dosemu_fault+275>: mov %rsp,%rdi 0x00005555555a5d56 <dosemu_fault+278>: callq 0x55555557ac30 <sigaddset@plt> 0x00005555555a5d5b <dosemu_fault+283>: xor %edx,%edx 0x00005555555a5d5d <dosemu_fault+285>: mov %rsp,%rsi 0x00005555555a5d60 <dosemu_fault+288>: mov $0x1,%edi 0x00005555555a5d65 <dosemu_fault+293>: callq 0x555555579e30 <sigprocmask@plt> 0x00005555555a5d6a <dosemu_fault+298>: jmpq 0x5555555a5ca0 <dosemu_fault+96> 0x00005555555a5d6f <dosemu_fault+303>: nop 0x00005555555a5d70 <dosemu_fault+304>: movzwl 0xb8(%rbp),%edx 0x00005555555a5d77 <dosemu_fault+311>: lea 0x842022(%rip),%rsi # 0x555555de7da0 <Segments> 0x00005555555a5d7e <dosemu_fault+318>: mov %edx,%eax 0x00005555555a5d80 <dosemu_fault+320>: shr $0x3,%ax 0x00005555555a5d84 <dosemu_fault+324>: and $0x1fff,%eax 0x00005555555a5d89 <dosemu_fault+329>: shl $0x4,%rax 0x00005555555a5d8d <dosemu_fault+333>: cmpl $0xfe,0xc(%rsi,%rax,1) 0x00005555555a5d95 <dosemu_fault+341>: je 0x5555555a5dc8 <dosemu_fault+392> 0x00005555555a5d97 <dosemu_fault+343>: and $0x4,%edx 0x00005555555a5d9a <dosemu_fault+346>: je 0x5555555a5dc8 <dosemu_fault+392> 0x00005555555a5d9c <dosemu_fault+348>: movzbl 0x790c15(%rip),%edi # 0x555555d369b8 <debug+2488> 0x00005555555a5da3 <dosemu_fault+355>: cmp $0x7,%edi 0x00005555555a5da6 <dosemu_fault+358>: jle 0x5555555a5ccc <dosemu_fault+140> 0x00005555555a5dac <dosemu_fault+364>: lea 0xdd695(%rip),%rsi # 0x555555683448 0x00005555555a5db3 <dosemu_fault+371>: mov %r12d,%edx 0x00005555555a5db6 <dosemu_fault+374>: xor %eax,%eax 0x00005555555a5db8 <dosemu_fault+376>: callq 0x5555555add70 <log_printf> 0x00005555555a5dbd <dosemu_fault+381>: jmpq 0x5555555a5ccc <dosemu_fault+140> 0x00005555555a5dc2 <dosemu_fault+386>: nopw 0x0(%rax,%rax,1) 0x00005555555a5dc8 <dosemu_fault+392>: mov 0xa8(%rbp),%rax 0x00005555555a5dcf <dosemu_fault+399>: movzbl (%rax),%eax 0x00005555555a5dd2 <dosemu_fault+402>: lea -0x64(%rax),%edx 0x00005555555a5dd5 <dosemu_fault+405>: cmp $0x1,%dl 0x00005555555a5dd8 <dosemu_fault+408>: jbe 0x5555555a5e30 <dosemu_fault+496> 0x00005555555a5dda <dosemu_fault+410>: cmpw $0x3,0x7a2142(%rip) # 0x555555d47f24 <config+4> 0x00005555555a5de2 <dosemu_fault+418>: jne 0x5555555a5cbc <dosemu_fault+124> 0x00005555555a5de8 <dosemu_fault+424>: mov 0x384f3a(%rip),%eax # 0x55555592ad28 <in_dpmi> 0x00005555555a5dee <dosemu_fault+430>: test %eax,%eax 0x00005555555a5df0 <dosemu_fault+432>: je 0x5555555a5cbc <dosemu_fault+124> 0x00005555555a5df6 <dosemu_fault+438>: mov 0x384f28(%rip),%eax # 0x55555592ad24 <in_dpmi_dos_int> 0x00005555555a5dfc <dosemu_fault+444>: test %eax,%eax 0x00005555555a5dfe <dosemu_fault+446>: jne 0x5555555a5cbc <dosemu_fault+124> 0x00005555555a5e04 <dosemu_fault+452>: mov %rbx,%rdi 0x00005555555a5e07 <dosemu_fault+455>: callq 0x5555555e8200 <e_emu_fault> 0x00005555555a5e0c <dosemu_fault+460>: test %eax,%eax 0x00005555555a5e0e <dosemu_fault+462>: je 0x5555555a5cbc <dosemu_fault+124> 0x00005555555a5e14 <dosemu_fault+468>: jmpq 0x5555555a5d01 <dosemu_fault+193> 0x00005555555a5e19 <dosemu_fault+473>: nopl 0x0(%rax) 0x00005555555a5e20 <dosemu_fault+480>: movzwl 0xc8(%rbp),%ecx 0x00005555555a5e27 <dosemu_fault+487>: jmp 0x5555555a5dac <dosemu_fault+364> 0x00005555555a5e29 <dosemu_fault+489>: nopl 0x0(%rax) 0x00005555555a5e30 <dosemu_fault+496>: movzbl %al,%edi 0x00005555555a5e33 <dosemu_fault+499>: callq 0x5555555a66c0 <check_fix_fs_gs_base> 0x00005555555a5e38 <dosemu_fault+504>: test %eax,%eax 0x00005555555a5e3a <dosemu_fault+506>: je 0x5555555a5dda <dosemu_fault+410> 0x00005555555a5e3c <dosemu_fault+508>: jmpq 0x5555555a5d01 <dosemu_fault+193> 0x00005555555a5e41 <dosemu_fault+513>: mov $0xff,%edi 0x00005555555a5e46 <dosemu_fault+518>: callq 0x555555579f00 <_exit@plt> => 0x00005555555a5e4b <dosemu_fault+523>: callq 0x55555557a140 <__stack_chk_fail@plt> 0x00005555555a5e50 <SIGIO_call+0>: sub $0x8,%rsp 0x00005555555a5e54 <SIGIO_call+4>: pushq 0x77fc5e(%rip) # 0x555555d25ab8 <fds_sigio+120> 0x00005555555a5e5a <SIGIO_call+10>: pushq 0x77fc50(%rip) # 0x555555d25ab0 <fds_sigio+112> 0x00005555555a5e60 <SIGIO_call+16>: pushq 0x77fc42(%rip) # 0x555555d25aa8 <fds_sigio+104> 0x00005555555a5e66 <SIGIO_call+22>: pushq 0x77fc34(%rip) # 0x555555d25aa0 <fds_sigio+96> End of assembler dump. https://aur.archlinux.org/packages/dosemu-git/ sed -i 's/((no_instrument_function/&,optimize("no-stack-protector")/' src/arch/linux/async/sigsegv.c src/arch/linux/async/signal.c
Description: Avoid stack protection for signal handler Dosemu's usage of the segment register e.g. fs is not compatible with Gcc's stack protection mechanism. Author: Bernhard Ãbelacker <bernha...@mailbox.org> --- Origin: other, https://aur.archlinux.org/packages/dosemu-git/ Bug: Bug-Debian: https://bugs.debian.org/829417 Bug-Ubuntu: Forwarded: no Reviewed-By: Last-Update: 2018-07-31 --- dosemu-1.4.0.7+20130105+b028d3f.orig/src/arch/linux/async/signal.c +++ dosemu-1.4.0.7+20130105+b028d3f/src/arch/linux/async/signal.c @@ -225,7 +225,7 @@ int check_fix_fs_gs_base(unsigned char p /* init_handler puts the handler in a sane state that glibc expects. That means restoring fs and gs for vm86 (necessary for 2.4 kernels) and fs, gs and eflags for DPMI. */ -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) void init_handler(struct sigcontext_struct *scp) { /* @@ -309,7 +309,7 @@ void init_handler(struct sigcontext_stru /* this cleaning up is necessary to avoid the port server becoming a zombie process */ -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) static void cleanup_child(struct sigcontext_struct *scp) { int status; @@ -322,7 +322,7 @@ static void cleanup_child(struct sigcont } } -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) static void leavedos_signal(int sig) { init_handler(NULL); @@ -804,7 +804,7 @@ static void sigalrm(struct sigcontext_st } } -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) static void sigasync0(int sig, struct sigcontext_struct *scp) { init_handler(scp); @@ -813,7 +813,7 @@ static void sigasync0(int sig, struct si dpmi_iret_setup(scp); } -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) static void sigasync(int sig, siginfo_t *si, void *uc) { sigasync0(sig, (struct sigcontext_struct *) --- dosemu-1.4.0.7+20130105+b028d3f.orig/src/arch/linux/async/sigsegv.c +++ dosemu-1.4.0.7+20130105+b028d3f/src/arch/linux/async/sigsegv.c @@ -37,7 +37,7 @@ void print_exception_info(struct sigcont /* * All of the functions in this module need to be declared with - * __attribute__((no_instrument_function)) + * __attribute__((no_instrument_function,optimize("no-stack-protector"))) * so that they can safely handle signals that occur in DPMI context when * DOSEMU is built with the "-pg" gcc flag (which enables instrumentation for * gprof profiling). @@ -62,7 +62,7 @@ void print_exception_info(struct sigcont * DANG_END_FUNCTION */ -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) int dosemu_fault1( #ifdef __linux__ int signal, struct sigcontext_struct *scp @@ -380,7 +380,7 @@ bad: } } -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) static void dosemu_fault0(int signal, struct sigcontext_struct *scp) { int retcode; @@ -448,7 +448,7 @@ static void dosemu_fault0(int signal, st } #ifdef __linux__ -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) void dosemu_fault(int signal, siginfo_t *si, void *uc) { dosemu_fault0(signal, (struct sigcontext_struct *) @@ -465,7 +465,7 @@ void dosemu_fault(int signal, siginfo_t * DANG_END_FUNCTION * */ -__attribute__((no_instrument_function)) +__attribute__((no_instrument_function,optimize("no-stack-protector"))) void print_exception_info(struct sigcontext_struct *scp) { int i;