FA-78921 / Image orientation metadata / Open access
TIFF magic is checked as a single byte · case 01
Big-endian EXIF blocks are rejected as malformed.
ROOT CAUSE
Only the first byte of the magic is compared with 42, which is correct only for little-endian headers.
VERIFIED REPAIR
Decode the magic with the file byte order and compare the 16-bit value with 42.
Unsuccessful approach: Checking the second byte instead rejects little-endian headers.
Case contract
Parse the orientation from an APP1 Exif payload given as a list of byte values: a 6-byte "Exif\0\0" header, then a TIFF header (II little-endian or MM big-endian, magic 42 as a 16-bit value, 32-bit IFD0 offset relative to the TIFF header). Scan IFD0 12-byte entries; the first entry with tag 0x0112, type SHORT (3) and count 1 supplies the value from the first two bytes of its value field. Values outside 1..8 and a missing entry yield 1; structural problems (short payload, bad header, byte order, magic, truncated entry) yield "malformed".
Why this case matters
Camera, phone and scanner images carry an orientation hint separately from the stored pixels; galleries, thumbnailers, editors and upload pipelines must interpret it consistently or photos appear sideways, mirrored or doubly rotated.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
b = data
if len(b) < 14 or b[:6] != [69, 120, 105, 102, 0, 0]:
return 'malformed'
t = b[6:]
if t[:2] == [73, 73]:
le = True
elif t[:2] == [77, 77]:
le = False
else:
return 'malformed'
def u16(o):
if o + 2 > len(t):
return None
return t[o] | (t[o + 1] << 8) if le else (t[o] << 8) | t[o + 1]
def u32(o):
if o + 4 > len(t):
return None
v = t[o:o + 4]
if le:
v = v[::-1]
return (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3]
if t[2] != 42:
return 'malformed'
ifd = u32(4)
count = u16(ifd)
if count is None:
return 'malformed'
for i in range(count):
e = ifd + 2 + 12 * i
if e + 12 > len(t):
return 'malformed'
tag = u16(e)
typ = u16(e + 2)
cnt = u32(e + 4)
if tag == 0x0112 and typ == 3 and cnt == 1:
val = u16(e + 8)
return val if 1 <= val <= 8 else 1
return 1
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 114, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 73, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 26, 1, 3, 0, 1, 0, 0, 0, 126, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 12, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 143, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 177, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 16, 0, 3, 0, 0, 0, 1, 1, 198, 0, 0, 1, 18, 0, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 4, 1, 18, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 1, 16, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 10, 0, 0, 0, 0, 0, 0], 3]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 96, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 150], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 4], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6, 1, 26, 0, 3, 0, 0, 0, 1, 1, 200, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 111, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 10, 0, 0, 0, 3, 1, 26, 0, 3, 0, 0, 0, 1, 1, 193, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 15, 0, 0, 1, 16, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 4, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 77, 1, 0, 0, 16, 1, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 8, 1, 26, 0, 3, 0, 0, 0, 1, 1, 15, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 190, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 0, 0, 0, 0], 6]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 18, 1, 4, 0, 2, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 133, 1, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 192, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 63, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 103, 0, 0, 1, 18, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 16, 1, 3, 0, 1, 0, 0, 0, 171, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 54, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 203, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 115, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 244, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 186, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 42, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 211, 1, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 15, 0, 3], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 42, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 60, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0, 1, 0, 172, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 10, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 22, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 229, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 166, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 241, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 229, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 26, 1, 3, 0, 1, 0, 0, 0, 152, 1, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 69, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 38, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 2, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 0, 0, 0, 0], 2]]]
labels = ["regression: TIFF magic comparison", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: TIFF magic comparison 0 | malformed | 1 | Failed |
| repair trap 1 | 1 | 1 | Passed |
| combined fault 2 | malformed | malformed | Passed |
| control 3 | malformed | malformed | Passed |
| control 4 | malformed | malformed | Passed |
| boundary 5 | malformed | malformed | Passed |
| boundary 6 | malformed | malformed | Passed |
| control 7 | malformed | 3 | Failed |
SHA-256 / 31a50b97654026e855859fd8bfd50ff10f7ad7c7bb8e418244ae7bcecfcc8977
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
b = data
if len(b) < 14 or b[:6] != [69, 120, 105, 102, 0, 0]:
return 'malformed'
t = b[6:]
if t[:2] == [73, 73]:
le = True
elif t[:2] == [77, 77]:
le = False
else:
return 'malformed'
def u16(o):
if o + 2 > len(t):
return None
return t[o] | (t[o + 1] << 8) if le else (t[o] << 8) | t[o + 1]
def u32(o):
if o + 4 > len(t):
return None
v = t[o:o + 4]
if le:
v = v[::-1]
return (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3]
if t[3] != 42:
return 'malformed'
ifd = u32(4)
count = u16(ifd)
if count is None:
return 'malformed'
for i in range(count):
e = ifd + 2 + 12 * i
if e + 12 > len(t):
return 'malformed'
tag = u16(e)
typ = u16(e + 2)
cnt = u32(e + 4)
if tag == 0x0112 and typ == 3 and cnt == 1:
val = u16(e + 8)
return val if 1 <= val <= 8 else 1
return 1
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 114, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 73, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 26, 1, 3, 0, 1, 0, 0, 0, 126, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 12, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 143, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 177, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 16, 0, 3, 0, 0, 0, 1, 1, 198, 0, 0, 1, 18, 0, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 4, 1, 18, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 1, 16, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 10, 0, 0, 0, 0, 0, 0], 3]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 96, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 150], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 4], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6, 1, 26, 0, 3, 0, 0, 0, 1, 1, 200, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 111, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 10, 0, 0, 0, 3, 1, 26, 0, 3, 0, 0, 0, 1, 1, 193, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 15, 0, 0, 1, 16, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 4, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 77, 1, 0, 0, 16, 1, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 8, 1, 26, 0, 3, 0, 0, 0, 1, 1, 15, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 190, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 0, 0, 0, 0], 6]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 18, 1, 4, 0, 2, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 133, 1, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 192, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 63, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 103, 0, 0, 1, 18, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 16, 1, 3, 0, 1, 0, 0, 0, 171, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 54, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 203, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 115, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 244, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 186, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 42, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 211, 1, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 15, 0, 3], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 42, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 60, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0, 1, 0, 172, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 10, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 22, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 229, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 166, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 241, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 229, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 26, 1, 3, 0, 1, 0, 0, 0, 152, 1, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 69, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 38, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 2, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 0, 0, 0, 0], 2]]]
labels = ["regression: TIFF magic comparison", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: TIFF magic comparison 0 | 1 | 1 | Passed |
| repair trap 1 | malformed | 1 | Failed |
| combined fault 2 | malformed | malformed | Passed |
| control 3 | malformed | malformed | Passed |
| control 4 | malformed | malformed | Passed |
| boundary 5 | malformed | malformed | Passed |
| boundary 6 | malformed | malformed | Passed |
| control 7 | 3 | 3 | Passed |
SHA-256 / f594544426ed5352173f04b7bbc486a55a5b8dabf6adf014815c92f3d6fcd6a9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
b = data
if len(b) < 14 or b[:6] != [69, 120, 105, 102, 0, 0]:
return 'malformed'
t = b[6:]
if t[:2] == [73, 73]:
le = True
elif t[:2] == [77, 77]:
le = False
else:
return 'malformed'
def u16(o):
if o + 2 > len(t):
return None
return t[o] | (t[o + 1] << 8) if le else (t[o] << 8) | t[o + 1]
def u32(o):
if o + 4 > len(t):
return None
v = t[o:o + 4]
if le:
v = v[::-1]
return (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3]
if u16(2) != 42:
return 'malformed'
ifd = u32(4)
count = u16(ifd)
if count is None:
return 'malformed'
for i in range(count):
e = ifd + 2 + 12 * i
if e + 12 > len(t):
return 'malformed'
tag = u16(e)
typ = u16(e + 2)
cnt = u32(e + 4)
if tag == 0x0112 and typ == 3 and cnt == 1:
val = u16(e + 8)
return val if 1 <= val <= 8 else 1
return 1
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 114, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 73, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 26, 1, 3, 0, 1, 0, 0, 0, 126, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 0, 12, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 143, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 177, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 16, 0, 3, 0, 0, 0, 1, 1, 198, 0, 0, 1, 18, 0, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 4, 1, 18, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 1, 16, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 10, 0, 0, 0, 0, 0, 0], 3]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 96, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 150], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 4], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6, 1, 26, 0, 3, 0, 0, 0, 1, 1, 200, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 111, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 10, 0, 0, 0, 3, 1, 26, 0, 3, 0, 0, 0, 1, 1, 193, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 15, 0, 0, 1, 16, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 4, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 77, 1, 0, 0, 16, 1, 3, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 5, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 8, 1, 26, 0, 3, 0, 0, 0, 1, 1, 15, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 190, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 77, 0, 0, 0, 0, 0, 0], 6]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 1, 1, 18, 0, 4, 0, 0, 0, 2, 0, 0, 0, 6], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 18, 1, 4, 0, 2, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 133, 1, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 192, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 63, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 103, 0, 0, 1, 18, 0, 3, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 1, 0, 16, 1, 3, 0, 1, 0, 0, 0, 171, 1, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 54, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 203, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 9, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 115, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 244, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 186, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 42, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 211, 1, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 15, 0, 3], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 42, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 43, 0, 0, 0, 8, 0, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 60, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 0, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 26, 0, 3, 0, 0, 0, 1, 0, 172, 0, 0, 0, 0, 0, 0], 1]], [[[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 10, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 22, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 229, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 15, 0, 3, 0, 0, 0, 1, 1, 166, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 1, 241, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 229, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 255, 225, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 26, 1, 3, 0, 1, 0, 0, 0, 152, 1, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 43, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 69, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 38, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 1, 0, 2, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 0, 0, 0, 0], 2]]]
labels = ["regression: TIFF magic comparison", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: TIFF magic comparison 0 | 1 | 1 | Passed |
| repair trap 1 | 1 | 1 | Passed |
| combined fault 2 | malformed | malformed | Passed |
| control 3 | malformed | malformed | Passed |
| control 4 | malformed | malformed | Passed |
| boundary 5 | malformed | malformed | Passed |
| boundary 6 | malformed | malformed | Passed |
| control 7 | 3 | 3 | Passed |
SHA-256 / 2eb4fc4e0d80955e9b227ecbbd29cbc470a5d35207b15c1f4b4d7021f3b01424
Verification & scope
A deterministic bounded teaching model with a stipulated contract; it makes no claim of conformance to any published specification. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:49:39.857844+00:00.
Case digest / 5285247649888fd638ce16f5edef23623f941e6d95d9a4b7529fc6a3426a7d51