fix: add metaint validation and mid-metadata truncation test

Made-with: Cursor
This commit is contained in:
cottongin
2026-03-10 01:22:31 -04:00
parent 45a946f829
commit 1a3a58b8f0
2 changed files with 25 additions and 0 deletions

View File

@@ -27,6 +27,7 @@ class IcyParser(
}
private fun parseWithMetadata(metaint: Int) {
require(metaint > 0) { "metaint must be positive, got $metaint" }
val audioBuf = ByteArray(metaint)
while (true) {
val audioRead = readFully(audioBuf, 0, metaint)

View File

@@ -267,4 +267,28 @@ class IcyParserTest {
assertTrue(audioCollected.all { it == 0x42.toByte() })
assertEquals(0, metadataEvents.size)
}
@Test
fun handlesTruncationMidMetadata_noCrash_noIncompleteMetadataEmitted() {
val metaint = 8
val audioChunk = ByteArray(8) { 0x42 }
val fullStream = buildIcyStream(metaint, IcyBlock(audioChunk, "StreamTitle='Test';"))
// Full audio (8) + length byte (2 = 32 bytes) + only 16 bytes of metadata (truncated)
val truncated =
fullStream.copyOf(8 + 1 + 16)
val audioCollected = mutableListOf<Byte>()
val metadataEvents = mutableListOf<IcyMetadata>()
IcyParser(
input = ByteArrayInputStream(truncated),
metaint = metaint,
onAudioData = { buf, off, len -> (0 until len).forEach { audioCollected.add(buf[off + it]) } },
onMetadata = { metadataEvents.add(it) }
).readAll()
assertEquals(8, audioCollected.size)
assertTrue(audioCollected.all { it == 0x42.toByte() })
assertEquals(0, metadataEvents.size)
}
}