From 58ea0f523dfdbad7eba3669d99b11a437da944e0 Mon Sep 17 00:00:00 2001 From: Yann Weber Date: Tue, 21 Aug 2018 23:01:47 +0200 Subject: [PATCH] Restoring stdin fcntl flags before exit --- wtfstopw.asm | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/wtfstopw.asm b/wtfstopw.asm index 91c41bc..c2e4e44 100644 --- a/wtfstopw.asm +++ b/wtfstopw.asm @@ -95,6 +95,8 @@ section .data lapcountlen: equ $ - lapcount laplen: dq 2 + fcntl_flag: dq 0 + section .text global _start _start: @@ -105,6 +107,7 @@ xor rdi, rdi mov rax, 72 ; fcntl mov rsi, 3 ; F_GETFL syscall +mov [fcntl_flag], rax mov rdx, rax or rdx, 0x800 ; O_NONBLOCK mov rax, 72 ; fcntl @@ -175,9 +178,26 @@ flush_stdin: je newline_exit jg flush_stdin +mov rdi, 0 ; EXIT OK +; +; Expect rdi to be the return code +; exit: + push rdi + ; restoring stdin state + mov rax, 72 ; fcntl + xor rdi, rdi + mov rsi, 4 ; F_SETFL + mov rdx, [fcntl_flag] + syscall + cmp rax, 0 + je exit_end + pop rdi ; failed to restore + push 1 ; exit FAIL + + exit_end: mov rax, 60 ; sys_exit - mov rdi, 0 ; OK + pop rdi ; return code syscall fault: mov rax, 1 ; write @@ -190,9 +210,8 @@ fault: mov rdx, faultmsglen syscall - mov rax, 60 ; sys_exit mov rdi, 1 ; failure - syscall + jmp exit newline_exit: mov rax, 1 @@ -200,6 +219,8 @@ newline_exit: mov rsi, nl mov rdx, 1 syscall + + mov rdi, 0 ; exit OK jmp exit ;