add more info in invalid extra field warning

This commit is contained in:
Jean-Marie Mineau 2025-06-19 10:54:23 +02:00
parent 3a0b9bbf67
commit d5006f591c
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
2 changed files with 27 additions and 13 deletions

View file

@ -4,7 +4,7 @@ use std::io::{SeekFrom, Write};
use crate::compression::CompressionMethod; use crate::compression::CompressionMethod;
use crate::error::Error; use crate::error::Error;
use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField}; use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField};
use crate::{Encoding, Signature, cp437, external_file_attributes, general_purpose_flags}; use crate::{cp437, external_file_attributes, general_purpose_flags, Encoding, Signature};
use androscalpel_serializer::{ReadSeek, Result, Serializable}; use androscalpel_serializer::{ReadSeek, Result, Serializable};
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
@ -136,8 +136,15 @@ impl Serializable for FileHeader {
} }
} }
if extra_size_read > extra_field_length as usize { if extra_size_read > extra_field_length as usize {
warn!("Failed to parse last extra field in {}", header.get_name()); let last_extra = header.extra_field.pop().unwrap();
let size = header.extra_field.pop().unwrap().size(); let size = last_extra.size();
warn!(
"Failed to parse last extra field in {}, last field ({} bytes long) is {} bytes too long",
header.get_name(),
size,
extra_size_read - extra_field_length as usize
);
//warn!("Forgetting last extra field: {:?}", last_extra);
input.seek(SeekFrom::Current(-(size as i64))).unwrap(); input.seek(SeekFrom::Current(-(size as i64))).unwrap();
} }
let mut extra_size_read = input.stream_position().unwrap() - extra_field_off; let mut extra_size_read = input.stream_position().unwrap() - extra_field_off;

View file

@ -5,7 +5,7 @@ use log::warn;
use crate::compression::CompressionMethod; use crate::compression::CompressionMethod;
use crate::error::Error; use crate::error::Error;
use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField}; use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField};
use crate::{Encoding, Signature, cp437, general_purpose_flags}; use crate::{cp437, general_purpose_flags, Encoding, Signature};
use androscalpel_serializer::{ReadSeek, Result, Serializable}; use androscalpel_serializer::{ReadSeek, Result, Serializable};
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
@ -113,25 +113,32 @@ impl Serializable for LocalFileHeader {
header.extra_field.push(field); header.extra_field.push(field);
} }
} }
let mut failed_last_extra_field = false; let mut failed_last_extra_field_data = None;
if extra_size_read > extra_field_length as usize { if extra_size_read > extra_field_length as usize {
//println!("Failed to parse last extra field in {}", header.get_name()); //println!("Failed to parse last extra field in {}", header.get_name());
failed_last_extra_field = true;
let size = header.extra_field.pop().unwrap().size(); let size = header.extra_field.pop().unwrap().size();
input.seek(SeekFrom::Current(-(size as i64))).unwrap(); input.seek(SeekFrom::Current(-(size as i64))).unwrap();
failed_last_extra_field_data =
Some((size, extra_size_read - extra_field_length as usize));
} }
let mut extra_size_read = input.stream_position().unwrap() - extra_field_off; let mut extra_size_read = input.stream_position().unwrap() - extra_field_off;
while extra_size_read < extra_field_length as u64 { while extra_size_read < extra_field_length as u64 {
header.malformed_extra_field.push(u8::deserialize(input)?); header.malformed_extra_field.push(u8::deserialize(input)?);
extra_size_read += 1; extra_size_read += 1;
} }
// If it is not padding from zipalign if let Some((size, size_diff)) = failed_last_extra_field_data {
if failed_last_extra_field // If it is not padding from zipalign
&& header.malformed_extra_field != vec![0] if header.malformed_extra_field != vec![0]
&& header.malformed_extra_field != vec![0, 0] && header.malformed_extra_field != vec![0, 0]
&& header.malformed_extra_field != vec![0, 0, 0] && header.malformed_extra_field != vec![0, 0, 0]
{ {
warn!("Failed to parse last extra field in {}", header.get_name()); warn!(
"Failed to parse last extra field in {}, last field ({} bytes long) is {} bytes too long",
header.get_name(),
size,
size_diff
);
}
} }
//input.seek(SeekFrom::Start(end_of_extra_field)).unwrap(); //input.seek(SeekFrom::Start(end_of_extra_field)).unwrap();
for field in &mut header.extra_field { for field in &mut header.extra_field {