diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-05-11 22:44:49 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-05-11 22:44:49 -0700 |
commit | e59a74abddaf0b4f9a39432da21c6a98eae46df6 (patch) | |
tree | b21109b5889dcdb9011e5a8559e7fb8e0ba00c4c /subx | |
parent | 6362c51d11ef27335875469e0ff06347357f46b1 (diff) | |
download | mu-e59a74abddaf0b4f9a39432da21c6a98eae46df6.tar.gz |
5156 - error-checking on writes to file
Pretty blunt for now; just abort the entire program on any failure to write. I'm encountering it because I'm somehow treating a stream address as a file descriptor. Maybe mmap is returning addresses below 0x08000000?
Diffstat (limited to 'subx')
-rw-r--r-- | subx/050_write.subx | 11 | ||||
-rw-r--r-- | subx/062write-stream.subx | 18 | ||||
-rwxr-xr-x | subx/apps/assort | bin | 21700 -> 21809 bytes | |||
-rwxr-xr-x | subx/apps/crenshaw2-1 | bin | 18859 -> 18968 bytes | |||
-rwxr-xr-x | subx/apps/crenshaw2-1b | bin | 19418 -> 19527 bytes | |||
-rwxr-xr-x | subx/apps/factorial | bin | 17775 -> 17884 bytes | |||
-rwxr-xr-x | subx/apps/handle | bin | 18602 -> 18711 bytes | |||
-rwxr-xr-x | subx/apps/hex | bin | 21868 -> 21977 bytes | |||
-rwxr-xr-x | subx/apps/pack | bin | 36460 -> 36569 bytes |
9 files changed, 29 insertions, 0 deletions
diff --git a/subx/050_write.subx b/subx/050_write.subx index 083adad6..0d6b8152 100644 --- a/subx/050_write.subx +++ b/subx/050_write.subx @@ -32,6 +32,9 @@ _write: # fd : int, s : (address array byte) -> <void> # . syscall b8/copy-to-EAX 4/imm32/write cd/syscall 0x80/imm8 + # if (EAX < 0) abort + 3d/compare-EAX-with 0/imm32 + 0f 8c/jump-if-lesser $_write:abort/disp32 $_write:end: # . restore registers 5b/pop-to-EBX @@ -43,4 +46,12 @@ $_write:end: 5d/pop-to-EBP c3/return +$_write:abort: + # can't write a message here for risk of an infinite loop, so we'll use a special exit code instead + # . syscall(exit, 255) + bb/copy-to-EBX 0xff/imm32 + b8/copy-to-EAX 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + # . . vim:nowrap:textwidth=0 diff --git a/subx/062write-stream.subx b/subx/062write-stream.subx index eb2df0c5..83268422 100644 --- a/subx/062write-stream.subx +++ b/subx/062write-stream.subx @@ -102,6 +102,9 @@ _write-stream: # fd : int, s : (address stream) -> <void> # . . syscall b8/copy-to-EAX 4/imm32/write cd/syscall 0x80/imm8 + # if (EAX < 0) abort + 3d/compare-EAX-with 0/imm32 + 0f 8c/jump-if-lesser $_write-stream:abort/disp32 # s->read += EAX 01/add 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 . # add EAX to *(ESI+4) # . restore registers @@ -116,6 +119,21 @@ _write-stream: # fd : int, s : (address stream) -> <void> 5d/pop-to-EBP c3/return +$_write-stream:abort: + # . _write(2/stderr, error) + # . . push args + 68/push "_write-stream: failed to write to file"/imm32 + 68/push 2/imm32/stderr + # . . call + e8/call _write/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # . syscall(exit, 1) + bb/copy-to-EBX 1/imm32 + b8/copy-to-EAX 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + test-write-stream-single: # setup # . clear-stream(_test-stream) diff --git a/subx/apps/assort b/subx/apps/assort index af7b47c2..3fbc3b7e 100755 --- a/subx/apps/assort +++ b/subx/apps/assort Binary files differdiff --git a/subx/apps/crenshaw2-1 b/subx/apps/crenshaw2-1 index d8c36cab..ca1e52fa 100755 --- a/subx/apps/crenshaw2-1 +++ b/subx/apps/crenshaw2-1 Binary files differdiff --git a/subx/apps/crenshaw2-1b b/subx/apps/crenshaw2-1b index 66bd4fa8..8a468ff5 100755 --- a/subx/apps/crenshaw2-1b +++ b/subx/apps/crenshaw2-1b Binary files differdiff --git a/subx/apps/factorial b/subx/apps/factorial index 0db812db..9ea9716b 100755 --- a/subx/apps/factorial +++ b/subx/apps/factorial Binary files differdiff --git a/subx/apps/handle b/subx/apps/handle index 7869c416..b32183db 100755 --- a/subx/apps/handle +++ b/subx/apps/handle Binary files differdiff --git a/subx/apps/hex b/subx/apps/hex index a07214ea..ed1d9eeb 100755 --- a/subx/apps/hex +++ b/subx/apps/hex Binary files differdiff --git a/subx/apps/pack b/subx/apps/pack index 30bacf4d..a4a20626 100755 --- a/subx/apps/pack +++ b/subx/apps/pack Binary files differ |