add more info in invalid extra field warning
This commit is contained in:
parent
3a0b9bbf67
commit
d5006f591c
2 changed files with 27 additions and 13 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue