Skip to content

Commit abfc23d

Browse files
feat: Upgrade [Extended]FileOptions::add_extra_data() data from Box<[u8]> to AsRef<[u8]> (#435)
* Upgrade ExtendedFileOptions::add_extra_data() data from Box<[u8]> to AsRef<[u8]> Existing callers are unaffected but you can just give it slices now * Upgrade FileOptions::add_extra_data() data from Box<[u8]> to AsRef<[u8]> likewise * Build matrix coverage * fmt * Unsplit * Bump version to 6.0.0
1 parent eb1b586 commit abfc23d

File tree

3 files changed

+22
-30
lines changed

3 files changed

+22
-30
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "zip"
3-
version = "5.1.1"
3+
version = "6.0.0"
44
authors = [
55
"Mathijs van de Nes <[email protected]>",
66
"Marli Frost <[email protected]>",

src/legacy/huffman.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ mod tests {
213213
assert_eq!(
214214
d.huffman_decode(
215215
8,
216-
&mut BitReader::endian(&mut Cursor::new(vec![!0x0]), LittleEndian)
216+
&mut BitReader::endian(&mut Cursor::new(&[!0x0]), LittleEndian)
217217
)
218218
.unwrap(),
219219
0
@@ -223,7 +223,7 @@ mod tests {
223223
assert_eq!(
224224
d.huffman_decode(
225225
8,
226-
&mut BitReader::endian(&mut Cursor::new(vec![!0b110]), LittleEndian)
226+
&mut BitReader::endian(&mut Cursor::new(&[!0b110]), LittleEndian)
227227
)
228228
.unwrap(),
229229
0b011
@@ -233,7 +233,7 @@ mod tests {
233233
assert_eq!(
234234
d.huffman_decode(
235235
8,
236-
&mut BitReader::endian(&mut Cursor::new(vec![!0b1111]), LittleEndian)
236+
&mut BitReader::endian(&mut Cursor::new(&[!0b1111]), LittleEndian)
237237
)
238238
.unwrap(),
239239
0b10001
@@ -243,7 +243,7 @@ mod tests {
243243
assert_eq!(
244244
d.huffman_decode(
245245
8,
246-
&mut BitReader::endian(&mut Cursor::new(vec![!0b11111]), LittleEndian)
246+
&mut BitReader::endian(&mut Cursor::new(&[!0b11111]), LittleEndian)
247247
)
248248
.unwrap(),
249249
0b10000
@@ -253,7 +253,7 @@ mod tests {
253253
assert!(d
254254
.huffman_decode(
255255
8,
256-
&mut BitReader::endian(&mut Cursor::new(vec![!0x7f]), LittleEndian)
256+
&mut BitReader::endian(&mut Cursor::new(&[!0x7f]), LittleEndian)
257257
)
258258
.is_err());
259259
}

src/write.rs

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,13 @@ pub struct ExtendedFileOptions {
292292

293293
impl ExtendedFileOptions {
294294
/// Adds an extra data field, unless we detect that it's invalid.
295-
pub fn add_extra_data(
295+
pub fn add_extra_data<D: AsRef<[u8]>>(
296296
&mut self,
297297
header_id: u16,
298-
data: Box<[u8]>,
298+
data: D,
299299
central_only: bool,
300300
) -> ZipResult<()> {
301+
let data = data.as_ref();
301302
let len = data.len() + 4;
302303
if self.extra_data.len() + self.central_extra_data.len() + len > u16::MAX as usize {
303304
Err(invalid!("Extra data field would be longer than allowed"))
@@ -324,12 +325,12 @@ impl ExtendedFileOptions {
324325
pub(crate) fn add_extra_data_unchecked(
325326
vec: &mut Vec<u8>,
326327
header_id: u16,
327-
data: Box<[u8]>,
328+
data: &[u8],
328329
) -> Result<(), ZipError> {
329330
vec.reserve_exact(data.len() + 4);
330331
vec.write_u16_le(header_id)?;
331332
vec.write_u16_le(data.len() as u16)?;
332-
vec.write_all(&data)?;
333+
vec.write_all(data)?;
333334
Ok(())
334335
}
335336

@@ -535,10 +536,10 @@ impl<T: FileOptionExtension> FileOptions<'_, T> {
535536
}
536537
impl FileOptions<'_, ExtendedFileOptions> {
537538
/// Adds an extra data field.
538-
pub fn add_extra_data(
539+
pub fn add_extra_data<D: AsRef<[u8]>>(
539540
&mut self,
540541
header_id: u16,
541-
data: Box<[u8]>,
542+
data: D,
542543
central_only: bool,
543544
) -> ZipResult<()> {
544545
self.extended_options
@@ -931,27 +932,22 @@ impl<W: Write + Seek> ZipWriter<W> {
931932
let mut aes_extra_data_start = 0;
932933
#[cfg(feature = "aes-crypto")]
933934
if let Some(EncryptWith::Aes { mode, .. }) = options.encrypt_with {
934-
let aes_dummy_extra_data =
935-
vec![0x02, 0x00, 0x41, 0x45, mode as u8, 0x00, 0x00].into_boxed_slice();
935+
let aes_dummy_extra_data = [0x02, 0x00, 0x41, 0x45, mode as u8, 0x00, 0x00];
936936
aes_extra_data_start = extra_data.len() as u64;
937937
ExtendedFileOptions::add_extra_data_unchecked(
938938
&mut extra_data,
939939
0x9901,
940-
aes_dummy_extra_data,
940+
&aes_dummy_extra_data,
941941
)?;
942942
} else if let Some((mode, vendor, underlying)) = options.aes_mode {
943943
// For raw copies of AES entries, write the correct AES extra data immediately
944-
let mut body = Vec::with_capacity(7);
945-
body.write_u16_le(vendor as u16)?; // vendor version (1 or 2)
946-
body.extend_from_slice(b"AE"); // vendor id
947-
body.push(mode as u8); // strength
948-
body.write_u16_le(underlying.serialize_to_u16())?; // real compression method
944+
let mut body = [0; 7];
945+
[body[0], body[1]] = (vendor as u16).to_le_bytes(); // vendor version (1 or 2)
946+
[body[2], body[3]] = *b"AE"; // vendor id
947+
body[4] = mode as u8; // strength
948+
[body[5], body[6]] = underlying.serialize_to_u16().to_le_bytes(); // real compression method
949949
aes_extra_data_start = extra_data.len() as u64;
950-
ExtendedFileOptions::add_extra_data_unchecked(
951-
&mut extra_data,
952-
0x9901,
953-
body.into_boxed_slice(),
954-
)?;
950+
ExtendedFileOptions::add_extra_data_unchecked(&mut extra_data, 0x9901, &body)?;
955951
}
956952

957953
let (compression_method, aes_mode) = match options.encrypt_with {
@@ -981,11 +977,7 @@ impl<W: Write + Seek> ZipWriter<W> {
981977
let mut pad_body = vec![0; pad_length - 4];
982978
debug_assert!(pad_body.len() >= 2);
983979
[pad_body[0], pad_body[1]] = options.alignment.to_le_bytes();
984-
ExtendedFileOptions::add_extra_data_unchecked(
985-
&mut extra_data,
986-
0xa11e,
987-
pad_body.into_boxed_slice(),
988-
)?;
980+
ExtendedFileOptions::add_extra_data_unchecked(&mut extra_data, 0xa11e, &pad_body)?;
989981
debug_assert_eq!((extra_data.len() as u64 + header_end) % align, 0);
990982
}
991983
}

0 commit comments

Comments
 (0)