Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!doctype html>
<html lang="en">
<head class="reftest-wait">
<meta charset="utf-8">
<title>Firefox WebM Alpha BlockAdditional</title>
</head>
<body>
<h1>Firefox WebM Alpha BlockAdditional</h1>
<p>
This embeds a valid alpha WebM, rewrites the first
<code>BlockMore</code> entry, creates a malformed <code>video/webm</code>
Blob in JavaScript, and feeds it to a normal <code>&lt;video&gt;</code>
element.
</p>
<a id="download" download="alpha-blockadditional-poc.webm">download malformed webm</a>
<pre id="log"></pre>
<video id="player" controls muted></video>
<script>
const SAMPLE_BASE64 =
"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";
const FIRST_BLOCK_MORE = 0x272;
const EXPECTED_BYTES = [
0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xee, 0x81, 0x01,
0xa5, 0xb4
];
const PATCH_BYTES = [
0xa6, 0x86, 0xa5, 0x08, 0x10, 0x00, 0x00, 0x00, 0xec, 0xb8
];
const logNode = document.getElementById("log");
const player = document.getElementById("player");
const download = document.getElementById("download");
function log(message) {
logNode.textContent += `${message}\n`;
}
function decodeBase64(base64) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return bytes;
}
function expectBytes(bytes, offset, expected) {
for (let i = 0; i < expected.length; i++) {
if (bytes[offset + i] !== expected[i]) {
const got = Array.from(bytes.slice(offset, offset + expected.length))
.map((value) => value.toString(16).padStart(2, "0"))
.join(" ");
throw new Error(`unexpected bytes at 0x${offset.toString(16)}: ${got}`);
}
}
}
function buildMalformedBlob() {
const bytes = decodeBase64(SAMPLE_BASE64);
log(`decoded sample: ${bytes.length} bytes`);
expectBytes(bytes, FIRST_BLOCK_MORE, EXPECTED_BYTES);
bytes.set(PATCH_BYTES, FIRST_BLOCK_MORE);
log("patched first BlockMore");
log(" offset: 0x272");
log(" bytes: a6 86 a5 08 10 00 00 00 ec b8");
log(" result: BlockMore(size=6), BlockAdditional(size=0x10000000)");
return new Blob([bytes], { type: "video/webm" });
}
async function run() {
logNode.textContent = "";
if (player.src) {
URL.revokeObjectURL(player.src);
player.removeAttribute("src");
player.load();
}
const blob = buildMalformedBlob();
const url = URL.createObjectURL(blob);
download.href = url;
player.src = url;
log(`blob size: ${blob.size} bytes`);
log("assigned malformed Blob URL to <video>");
const errorPromise = new Promise(r => player.onerror = r);
await player.play();
log("play() resolved");
await errorPromise;
log("got error");
document.documentElement.removeAttribute("class");
}
run();
</script>
</body>
</html>