Skip to content

Commit 4d1750f

Browse files
committed
make decompression able to handle larger inputs
1 parent 7b593c2 commit 4d1750f

File tree

6 files changed

+128
-160
lines changed

6 files changed

+128
-160
lines changed

fuzz/fuzz_targets/compress.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@ fuzz_target!(|data: String| {
1414

1515
assert_eq!(error, BZ_OK);
1616

17-
let mut output = [0u8; 1 << 10];
18-
let mut output_len = output.len() as _;
19-
let error = unsafe {
20-
test_libbz2_rs_sys::decompress_rs(
21-
output.as_mut_ptr(),
22-
&mut output_len,
17+
let (error, output) = unsafe {
18+
test_libbz2_rs_sys::decompress_rs_with_capacity(
19+
1 << 10,
2320
deflated.as_ptr(),
2421
deflated.len() as _,
2522
)
2623
};
2724
assert_eq!(error, BZ_OK);
28-
let output = &output[..output_len as usize];
2925

3026
if output != data.as_bytes() {
3127
let path = std::env::temp_dir().join("compressed.txt");

fuzz/fuzz_targets/decompress_random_input.rs

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,17 @@ use libbz2_rs_sys::BZ_OK;
33
use libfuzzer_sys::fuzz_target;
44

55
fuzz_target!(|source: Vec<u8>| {
6-
let mut dest_c = vec![0u8; 1 << 16];
7-
let mut dest_rs = vec![0u8; 1 << 16];
8-
9-
let mut dest_len_c = dest_c.len() as _;
10-
let mut dest_len_rs = dest_rs.len() as _;
11-
12-
let err_c = unsafe {
13-
test_libbz2_rs_sys::decompress_c(
14-
dest_c.as_mut_ptr(),
15-
&mut dest_len_c,
16-
source.as_ptr(),
17-
source.len() as _,
18-
)
6+
let (err_c, dest_c) = unsafe {
7+
test_libbz2_rs_sys::decompress_c_with_capacity(1 << 16, source.as_ptr(), source.len() as _)
198
};
209

21-
let err_rs = unsafe {
22-
test_libbz2_rs_sys::decompress_rs(
23-
dest_rs.as_mut_ptr(),
24-
&mut dest_len_rs,
25-
source.as_ptr(),
26-
source.len() as _,
27-
)
10+
let (err_rs, dest_rs) = unsafe {
11+
test_libbz2_rs_sys::decompress_rs_with_capacity(1 << 16, source.as_ptr(), source.len() as _)
2812
};
2913

3014
assert_eq!(err_c, err_rs);
3115

3216
if err_c == BZ_OK {
33-
dest_c.truncate(dest_len_c as usize);
34-
dest_rs.truncate(dest_len_rs as usize);
35-
3617
assert_eq!(dest_c, dest_rs);
3718
}
3819
});

fuzz/fuzz_targets/end_to_end.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,16 @@ use libbz2_rs_sys::BZ_OK;
33
use libfuzzer_sys::fuzz_target;
44

55
fn decompress_help(input: &[u8]) -> Vec<u8> {
6-
let mut dest_vec = vec![0u8; 1 << 16];
7-
8-
let mut dest_len = dest_vec.len() as _;
9-
let dest = dest_vec.as_mut_ptr();
10-
116
let source = input.as_ptr();
127
let source_len = input.len() as _;
138

14-
let err = unsafe { test_libbz2_rs_sys::decompress_rs(dest, &mut dest_len, source, source_len) };
9+
let (err, dest_vec) =
10+
unsafe { test_libbz2_rs_sys::decompress_rs_with_capacity(1 << 16, source, source_len) };
1511

1612
if err != BZ_OK {
1713
panic!("error {:?}", err);
1814
}
1915

20-
dest_vec.truncate(dest_len as usize);
21-
2216
dest_vec
2317
}
2418

test-libbz2-rs-sys/examples/decompress.rs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use core::ffi::c_uint;
2-
3-
use test_libbz2_rs_sys::{decompress_c, decompress_rs};
1+
use test_libbz2_rs_sys::{decompress_c_with_capacity, decompress_rs_with_capacity};
42

53
fn main() {
64
let mut it = std::env::args();
@@ -12,44 +10,32 @@ fn main() {
1210
let path = it.next().unwrap();
1311
let input = std::fs::read(&path).unwrap();
1412

15-
let mut dest_vec = vec![0u8; 1 << 28];
16-
17-
let mut dest_len = dest_vec.len() as c_uint;
18-
let dest = dest_vec.as_mut_ptr();
19-
2013
let source = input.as_ptr();
2114
let source_len = input.len() as _;
2215

23-
let err = unsafe { decompress_c(dest, &mut dest_len, source, source_len) };
16+
let (err, dest_vec) =
17+
unsafe { decompress_c_with_capacity(1 << 28, source, source_len) };
2418

2519
if err != 0 {
2620
panic!("error {err}");
2721
}
2822

29-
dest_vec.truncate(dest_len as usize);
30-
3123
drop(dest_vec)
3224
}
3325
"rs" => {
3426
let path = it.next().unwrap();
3527
let input = std::fs::read(&path).unwrap();
3628

37-
let mut dest_vec = vec![0u8; 1 << 28];
38-
39-
let mut dest_len = dest_vec.len() as std::ffi::c_uint;
40-
let dest = dest_vec.as_mut_ptr();
41-
4229
let source = input.as_ptr();
4330
let source_len = input.len() as _;
4431

45-
let err = unsafe { decompress_rs(dest, &mut dest_len, source, source_len) };
32+
let (err, dest_vec) =
33+
unsafe { decompress_rs_with_capacity(1 << 28, source, source_len) };
4634

4735
if err != 0 {
4836
panic!("error {err}");
4937
}
5038

51-
dest_vec.truncate(dest_len as usize);
52-
5339
drop(dest_vec)
5440
}
5541
other => panic!("invalid option '{other}', expected one of 'c' or 'rs'"),

test-libbz2-rs-sys/src/chunked.rs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{compress_c, decompress_c, SAMPLE1_BZ2, SAMPLE1_REF};
1+
use crate::{compress_c, decompress_c, decompress_c_with_capacity, SAMPLE1_BZ2, SAMPLE1_REF};
22

33
fn decompress_rs_chunked_input<'a>(
44
dest: &'a mut [u8],
@@ -55,18 +55,10 @@ fn decompress_chunked_input() {
5555
let chunked = decompress_rs_chunked_input(&mut dest_chunked, SAMPLE1_BZ2, 1).unwrap();
5656

5757
if !cfg!(miri) {
58-
let mut dest = vec![0; 1 << 18];
59-
let mut dest_len = dest.len() as _;
60-
let err = unsafe {
61-
decompress_c(
62-
dest.as_mut_ptr(),
63-
&mut dest_len,
64-
SAMPLE1_BZ2.as_ptr(),
65-
SAMPLE1_BZ2.len() as _,
66-
)
58+
let (err, dest) = unsafe {
59+
decompress_c_with_capacity(1 << 18, SAMPLE1_BZ2.as_ptr(), SAMPLE1_BZ2.len() as _)
6760
};
6861
assert_eq!(err, 0);
69-
dest.truncate(dest_len as usize);
7062

7163
assert_eq!(chunked.len(), dest.len());
7264
assert_eq!(chunked, dest);
@@ -201,18 +193,8 @@ fn decompress_rs_chunked_output<'a>(
201193

202194
#[test]
203195
fn decompress_chunked_output() {
204-
let mut dest = vec![0; 1 << 18];
205-
let mut dest_len = dest.len() as _;
206-
let err = unsafe {
207-
decompress_c(
208-
dest.as_mut_ptr(),
209-
&mut dest_len,
210-
SAMPLE1_BZ2.as_ptr(),
211-
SAMPLE1_BZ2.len() as _,
212-
)
213-
};
196+
let (err, dest) = unsafe { decompress_c(SAMPLE1_BZ2.as_ptr(), SAMPLE1_BZ2.len() as _) };
214197
assert_eq!(err, 0);
215-
dest.truncate(dest_len as usize);
216198

217199
let mut dest_chunked = vec![0; 1 << 18];
218200
let chunked = decompress_rs_chunked_input(&mut dest_chunked, SAMPLE1_BZ2, 1).unwrap();

0 commit comments

Comments
 (0)