Further fixes to hex2 command line parsing.

Do not hang if not arguments is specified or input file does not exist.
This commit is contained in:
Andrius Štikonas 2022-08-28 23:06:47 +01:00
parent 2b25915169
commit 35dbae15a0
3 changed files with 29 additions and 11 deletions

View File

@ -176,15 +176,20 @@ DEFINE xor_r9,r9 4D31C9
:loop_options_done
# Open file for reading
lea_rdx,[rip+DWORD] %fin # arg2 = &fin
pop_r8 # arg3 = in
push !1 # Set exit code in case of failure
cmp_r8, !0 # If NULL
je %failed_input # then exit
lea_rdx,[rip+DWORD] %fin # arg2 = &fin
push !1 # arg5 = EFI_FILE_READ_ONLY
push !1 # prepare to set arg4 to EFI_FILE_MODE_READ
pop_r9 # arg4 = EFI_FILE_MODE_READ
mov_rcx,[rip+DWORD] %rootdir # arg1 = rootdir
sub_rsp, !32 # allocate shadow stack space for UEFI function
call_[rcx+BYTE] !8 # rootdir->open()
add_rsp, !40 # deallocate stack
cmp_rax, !0 # If failed to open
jne %failed_input # then exit
add_rsp, !48 # deallocate stack
# Open file for writing
pop_r8 # arg3 = out
@ -199,7 +204,7 @@ DEFINE xor_r9,r9 4D31C9
mov_rcx,[rip+DWORD] %rootdir # arg1 = rootdir
sub_rsp, !32 # allocate shadow stack space for UEFI function
call_[rcx+BYTE] !8 # rootdir->open()
add_rsp, !40 # deallocate stack
add_rsp, !48 # deallocate stack
# Allocate ourselves 16 MiB of memory
mov_rdx, %0x1000000 # allocate 16 MiB of memory
@ -701,6 +706,7 @@ DEFINE xor_r9,r9 4D31C9
mov_rcx,[rip+DWORD] %fin # get fin
call %close_file # close fin
:failed_input
mov_rcx,[rip+DWORD] %rootdir # get rootdir
call %close_file # close rootdir

View File

@ -67,15 +67,20 @@ loop_options:
loop_options_done:
# Open file for reading
lea rdx, [rip+fin] # arg2 = &fin
pop r8 # arg3 = in
push 1 # Set exit code in case of failure
cmp r8, 0 # If NULL
je failed_input # then exit
lea rdx, [rip+fin] # arg2 = &fin
push 1 # arg5 = EFI_FILE_READ_ONLY
push 1 # prepare to set arg4 to EFI_FILE_MODE_READ
pop r9 # arg4 = EFI_FILE_MODE_READ
mov rcx, [rip+rootdir] # arg1 = rootdir
sub rsp, 32 # allocate shadow stack space for UEFI function
call [rcx+8] # rootdir->open()
add rsp, 40 # deallocate stack
cmp rax, 0 # If failed to open
jne failed_input # then exit
add rsp, 48 # deallocate stack
# Open file for writing
pop r8 # arg3 = out
@ -90,7 +95,7 @@ loop_options_done:
mov rcx, [rip+rootdir] # arg1 = rootdir
sub rsp, 32 # allocate shadow stack space for UEFI function
call [rcx+8] # rootdir->open()
add rsp, 40 # deallocate stack
add rsp, 48 # deallocate stack
# Allocate ourselves 16 MiB of memory
mov rdx, 0x1000000 # allocate 16 MiB of memory
@ -592,6 +597,7 @@ failed_output:
mov rcx, [rip+fin] # get fin
call close_file # close fin
failed_input:
mov rcx, [rip+rootdir] # get rootdir
call close_file # close rootdir

View File

@ -132,9 +132,9 @@ F0 00 # SizeOfOptionalHeader
# [0x148]
# Start of section headers
00 00 00 00 00 00 00 00 ; Name of the section (empty) but could set to ".text"
C7 06 00 00 ; VirtualSize
DD 06 00 00 ; VirtualSize
00 10 00 00 ; VirtualAddress
C7 06 00 00 ; SizeOfRawData
DD 06 00 00 ; SizeOfRawData
70 01 00 00 ; PointerToRawData
00 00 00 00 ; PointerToRelocations
00 00 00 00 ; PointerToLinenumbers
@ -195,15 +195,20 @@ C7 06 00 00 ; SizeOfRawData
:b #:loop_options_done
# Open file for reading
488D15 %0 ; lea_rdx,[rip+DWORD] %fin # arg2 = &fin
4158 ; pop_r8 # arg3 = in
6A 01 ; push !1 # Set exit code in case of failure
4983F8 00 ; cmp_r8, !0 # If NULL
0F84 %8 ; je %failed_input # then exit
488D15 %0 ; lea_rdx,[rip+DWORD] %fin # arg2 = &fin
6A 01 ; push !1 # arg5 = EFI_FILE_READ_ONLY
6A 01 ; push !1 # prepare to set arg4 to EFI_FILE_MODE_READ
4159 ; pop_r9 # arg4 = EFI_FILE_MODE_READ
488B0D %3 ; mov_rcx,[rip+DWORD] %rootdir # arg1 = rootdir
4883EC 20 ; sub_rsp, !32 # allocate shadow stack space for UEFI function
FF51 08 ; call_[rcx+BYTE] !8 # rootdir->open()
4883C4 28 ; add_rsp, !40 # deallocate stack
4883F8 00 ; cmp_rax, !0 # If failed to open
0F85 %8 ; jne %failed_input # then exit
4883C4 30 ; add_rsp, !48 # deallocate stack
# Open file for writing
4158 ; pop_r8 # arg3 = out
@ -218,7 +223,7 @@ C7 06 00 00 ; SizeOfRawData
488B0D %3 ; mov_rcx,[rip+DWORD] %rootdir # arg1 = rootdir
4883EC 20 ; sub_rsp, !32 # allocate shadow stack space for UEFI function
FF51 08 ; call_[rcx+BYTE] !8 # rootdir->open()
4883C4 28 ; add_rsp, !40 # deallocate stack
4883C4 30 ; add_rsp, !48 # deallocate stack
# Allocate ourselves 16 MiB of memory
48C7C2 00000001 ; mov_rdx, %0x1000000 # allocate 16 MiB of memory
@ -720,6 +725,7 @@ C7 06 00 00 ; SizeOfRawData
488B0D %0 ; mov_rcx,[rip+DWORD] %fin # get fin
E8 %U ; call %close_file # close fin
:8 # :failed_input
488B0D %3 ; mov_rcx,[rip+DWORD] %rootdir # get rootdir
E8 %U ; call %close_file # close rootdir