diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-08 20:02:01 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-08 20:05:04 +0200 |
commit | 38ccd6af8abbafff98d458a1c62909acfc09a514 (patch) | |
tree | 1a4158db5c7e5e98111ff99d4a9078d93b4ccfcc /libbb | |
parent | 8e2174e9bd836e53c8b9c6e00d1bc6e2a718686e (diff) | |
download | busybox-w32-38ccd6af8abbafff98d458a1c62909acfc09a514.tar.gz busybox-w32-38ccd6af8abbafff98d458a1c62909acfc09a514.tar.bz2 busybox-w32-38ccd6af8abbafff98d458a1c62909acfc09a514.zip |
bzip2: fix two crashes on corrupted archives
As it turns out, longjmp'ing into freed stack is not healthy...
function old new delta
unpack_usage_messages - 97 +97
unpack_bz2_stream 369 409 +40
get_next_block 1667 1677 +10
get_bits 156 155 -1
start_bunzip 212 183 -29
bb_show_usage 181 120 -61
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/3 up/down: 147/-91) Total: 56 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/appletlib.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index 022455da4..769b7881c 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
@@ -102,14 +102,21 @@ static const char *unpack_usage_messages(void) | |||
102 | char *outbuf = NULL; | 102 | char *outbuf = NULL; |
103 | bunzip_data *bd; | 103 | bunzip_data *bd; |
104 | int i; | 104 | int i; |
105 | jmp_buf jmpbuf; | ||
105 | 106 | ||
106 | i = start_bunzip(&bd, | 107 | /* Setup for I/O error handling via longjmp */ |
108 | i = setjmp(jmpbuf); | ||
109 | if (i == 0) { | ||
110 | i = start_bunzip(&jmpbuf, | ||
111 | &bd, | ||
107 | /* src_fd: */ -1, | 112 | /* src_fd: */ -1, |
108 | /* inbuf: */ packed_usage, | 113 | /* inbuf: */ packed_usage, |
109 | /* len: */ sizeof(packed_usage)); | 114 | /* len: */ sizeof(packed_usage) |
110 | /* read_bunzip can longjmp to start_bunzip, and ultimately | 115 | ); |
111 | * end up here with i != 0 on read data errors! Not trivial */ | 116 | } |
112 | if (!i) { | 117 | /* read_bunzip can longjmp and end up here with i != 0 |
118 | * on read data errors! Not trivial */ | ||
119 | if (i == 0) { | ||
113 | /* Cannot use xmalloc: will leak bd in NOFORK case! */ | 120 | /* Cannot use xmalloc: will leak bd in NOFORK case! */ |
114 | outbuf = malloc_or_warn(sizeof(UNPACKED_USAGE)); | 121 | outbuf = malloc_or_warn(sizeof(UNPACKED_USAGE)); |
115 | if (outbuf) | 122 | if (outbuf) |