blob: 5a5e1ea7de70c67c54e602085cca4fd59e6f6f2e [file] [log] [blame]
// Copyright 2024 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
//go:build ignore
// +build ignore
package main
// Usage: go run make-hippopotamus-bad-comment-length.go
//
// This program inserts a four-byte "FF FE 00 00" fragment into the
// test/data/hippopotamus.jpeg file. The "FF FE" is a COM (comment) marker. The
// "00 00" payload length is technically invalid (the minimum length is 2, per
// the itu-t81.pdf spec section B.1.1.4 "Marker segments") but libjpeg-turbo is
// more lenient and allows less-than-2 (for COM and APPn markers).
//
// https://www.w3.org/Graphics/JPEG/itu-t81.pdf
//
// https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2192560d74e6e6cf99dd05928885573be00a8208/jdmarker.c#L869-L876
//
// $ go run script/print-jpeg-markers.go test/data/hippopotamus.jpeg
// pos = 0x00000000 = 0 marker = 0xFF 0xD8 SOI
// pos = 0x00000002 = 2 marker = 0xFF 0xE0 APP0
// pos = 0x00000014 = 20 marker = 0xFF 0xDB DQT
// pos = 0x00000059 = 89 marker = 0xFF 0xDB DQT
// pos = 0x0000009E = 158 marker = 0xFF 0xC0 SOF0 (Sequential/Baseline)
// pos = 0x000000B1 = 177 marker = 0xFF 0xC4 DHT
// pos = 0x000000CC = 204 marker = 0xFF 0xC4 DHT
// pos = 0x000000FC = 252 marker = 0xFF 0xC4 DHT
// pos = 0x00000119 = 281 marker = 0xFF 0xC4 DHT
// pos = 0x0000014B = 331 marker = 0xFF 0xDA SOS
// pos = 0x000004C1 = 1217 marker = 0xFF 0xD9 EOI
//
// $ go run script/print-jpeg-markers.go test/data/artificial-jpeg/hippopotamus-bad-comment-length.jpeg
// pos = 0x00000000 = 0 marker = 0xFF 0xD8 SOI
// pos = 0x00000002 = 2 marker = 0xFF 0xE0 APP0
// pos = 0x00000014 = 20 marker = 0xFF 0xDB DQT
// pos = 0x00000059 = 89 marker = 0xFF 0xFE COM
// bad JPEG, pos = 0x0000005B = 91, len(src) = 0x000004C7 = 1223
import (
"fmt"
"os"
)
func main() {
if err := main1(); err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
}
func main1() error {
src, err := os.ReadFile("../hippopotamus.jpeg")
if err != nil {
return err
} else if len(src) != 0x4C3 {
return fmt.Errorf("bad input length: 0x%X", len(src))
}
part0 := src[0x000:0x059]
part1 := src[0x059:0x4C3]
dst := []byte(nil)
dst = append(dst, part0...)
dst = append(dst, 0xFF, 0xFE, 0x00, 0x00)
dst = append(dst, part1...)
return os.WriteFile("hippopotamus-bad-comment-length.jpeg", dst, 0666)
}