Improve skipping padding

* Skip up to 0x800 bytes
* Skip zero bytes also if there are less than four consecutive zero bytes
  remaining
This commit is contained in:
Martchus 2020-11-14 22:52:27 +01:00
parent e7ce9e7ced
commit 41184e704d
1 changed files with 15 additions and 5 deletions

View File

@ -172,14 +172,16 @@ startParsingSignature:
stream().read(buff, sizeof(buff)); stream().read(buff, sizeof(buff));
// skip zero bytes/padding // skip zero bytes/padding
// note: Only skipping 4 or more consecutive zero bytes at this point because some signatures start with up to 4 zero bytes.
size_t bytesSkipped = 0; size_t bytesSkipped = 0;
for (buffOffset = buff; buffOffset != buffEnd && !(*buffOffset); ++buffOffset, ++bytesSkipped) for (buffOffset = buff; buffOffset != buffEnd && !(*buffOffset); ++buffOffset, ++bytesSkipped)
; ;
if (bytesSkipped >= 4) { if (bytesSkipped >= 4) {
skipZeroBytes:
m_containerOffset += bytesSkipped; m_containerOffset += bytesSkipped;
// give up after 0x100 bytes // give up after 0x100 bytes
if ((m_paddingSize += bytesSkipped) >= 0x100u) { if ((m_paddingSize += bytesSkipped) >= 0x800u) {
m_containerParsingStatus = ParsingStatus::NotSupported; m_containerParsingStatus = ParsingStatus::NotSupported;
m_containerFormat = ContainerFormat::Unknown; m_containerFormat = ContainerFormat::Unknown;
return; return;
@ -188,9 +190,6 @@ startParsingSignature:
// try again // try again
goto startParsingSignature; goto startParsingSignature;
} }
if (m_paddingSize) {
diag.emplace_back(DiagLevel::Warning, argsToString(m_paddingSize, " zero-bytes skipped at the beginning of the file."), context);
}
// parse signature // parse signature
switch ((m_containerFormat = parseSignature(buff, sizeof(buff)))) { switch ((m_containerFormat = parseSignature(buff, sizeof(buff)))) {
@ -254,7 +253,11 @@ startParsingSignature:
static_cast<OggContainer *>(m_container.get())->setChecksumValidationEnabled(m_forceFullParse); static_cast<OggContainer *>(m_container.get())->setChecksumValidationEnabled(m_forceFullParse);
break; break;
case ContainerFormat::Unknown: case ContainerFormat::Unknown:
// container format is still unknown -> check for magic numbers at odd offsets // skip the zero bytes after all
if (bytesSkipped) {
goto skipZeroBytes;
}
// check for magic numbers at odd offsets
// -> check for tar (magic number at offset 0x101) // -> check for tar (magic number at offset 0x101)
if (size() > 0x107) { if (size() > 0x107) {
stream().seekg(0x101); stream().seekg(0x101);
@ -269,6 +272,13 @@ startParsingSignature:
} }
} }
if (m_paddingSize) {
diag.emplace_back(DiagLevel::Warning,
argsToString(m_paddingSize,
m_id3v2Tags.empty() ? " zero-bytes skipped at the beginning of the file." : " zero-bytes skipped after the ID3v2 tag."),
context);
}
// set parsing status // set parsing status
if (m_containerParsingStatus == ParsingStatus::NotParsedYet) { if (m_containerParsingStatus == ParsingStatus::NotParsedYet) {
if (m_containerFormat == ContainerFormat::Unknown) { if (m_containerFormat == ContainerFormat::Unknown) {