fix(audio): guard EXTENSIBLE fmt OOB read on truncated buffer; document padded-container gap
This commit is contained in:
@@ -174,6 +174,11 @@ public class AudioProcessor
|
|||||||
return new WavValidationResult { IsValid = false, ErrorMessage = "Invalid data: EXTENSIBLE fmt chunk too small" };
|
return new WavValidationResult { IsValid = false, ErrorMessage = "Invalid data: EXTENSIBLE fmt chunk too small" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fmtChunkPos + 8 + 40 > buffer.Length)
|
||||||
|
{
|
||||||
|
return new WavValidationResult { IsValid = false, ErrorMessage = "Invalid data: EXTENSIBLE fmt chunk extends past end of file" };
|
||||||
|
}
|
||||||
|
|
||||||
// SubFormat GUID begins 24 bytes into the fmt chunk data (fmtChunkPos + 8 + 24). Its
|
// SubFormat GUID begins 24 bytes into the fmt chunk data (fmtChunkPos + 8 + 24). Its
|
||||||
// first two bytes are the little-endian format tag; 0x0001 == WAVE_FORMAT_PCM.
|
// first two bytes are the little-endian format tag; 0x0001 == WAVE_FORMAT_PCM.
|
||||||
var subFormatPos = fmtChunkPos + 8 + 24;
|
var subFormatPos = fmtChunkPos + 8 + 24;
|
||||||
@@ -220,6 +225,9 @@ public class AudioProcessor
|
|||||||
// For EXTENSIBLE the offset-22 field is the container width; the true sample depth lives in
|
// For EXTENSIBLE the offset-22 field is the container width; the true sample depth lives in
|
||||||
// wValidBitsPerSample (fmtChunkPos + 8 + 18). They usually match (Bandcamp 24-bit = 24/24)
|
// wValidBitsPerSample (fmtChunkPos + 8 + 18). They usually match (Bandcamp 24-bit = 24/24)
|
||||||
// but the valid bits are authoritative for the normalized header and metadata.
|
// but the valid bits are authoritative for the normalized header and metadata.
|
||||||
|
// Note: padded-container EXTENSIBLE (e.g. 24-bit valid in a 32-bit container) is not yet
|
||||||
|
// supported — the mismatched BlockAlign will cause ValidateAudioParameters to throw and fall
|
||||||
|
// back to defaults. This is an accepted gap as of this fix.
|
||||||
if (validation.IsExtensible)
|
if (validation.IsExtensible)
|
||||||
{
|
{
|
||||||
bitsPerSample = BitConverter.ToUInt16(buffer, validation.FmtChunkPos + 8 + 18);
|
bitsPerSample = BitConverter.ToUInt16(buffer, validation.FmtChunkPos + 8 + 18);
|
||||||
|
|||||||
Reference in New Issue
Block a user