FAILURE MAP
← Case archive

FA-78911 / Image orientation metadata / Open access

Exif header check ignores the two null padding bytes · case 01

Payloads that merely begin with the letters "Exif" are parsed as TIFF data with a shifted header.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Only the four identifier letters are compared, so the mandatory two null bytes are never verified.

VERIFIED REPAIR

Require the full six-byte identifier "Exif\0\0" before the TIFF header.

Unsuccessful approach: Checking just the first null byte still accepts a corrupt second padding byte.

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[:4] != [69, 120, 105, 102]:
        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, 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, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 4, 0, 15, 1, 3, 0, 1, 0, 0, 0, 17, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 68, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 178, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 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, 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, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 247, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 124, 1, 0, 0, 0, 0, 0, 0], 1], [[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, 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, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 2, 0, 3, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 62, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 115, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 111, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[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, 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, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 181, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0], 7], [[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, 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, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 15, 0, 3, 0, 0, 0, 1, 1, 194, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 84, 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, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 219, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 182, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 202, 0, 0, 0, 15, 1, 3, 0, 1], 8], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 242, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 214, 0, 0, 0, 0, 0, 0], 8], [[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, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 37, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 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, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 238, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 17, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 37, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 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, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 4, 0, 18, 1, 3, 0, 1, 0, 0, 0, 6, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 147, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 88, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 151, 1, 0, 0, 0, 0, 0, 0], 6], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 2, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 6, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 125, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 225, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0], 5], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 95, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 168, 1, 0, 0, 0, 0, 0, 0], 'malformed']], [[[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 240, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 64, 1, 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, 0, 0, 3, 0, 15, 1, 3, 0, 1, 0, 0, 0, 51, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 55], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 215, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0], 7], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 173, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 83, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 181, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 0, 196, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 141, 0, 0, 0, 0, 0, 0], 1], [[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']]]
labels = ["regression: Exif identifier with null padding", "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 fixtureActualExpectedOutcome
regression: Exif identifier with null padding 01malformedFailed
repair trap 11malformedFailed
combined fault 211Passed
control 3malformedmalformedPassed
control 4malformedmalformedPassed
boundary 511Passed
boundary 611Passed
control 71malformedFailed

SHA-256 / 918391f73b387f0d728f8cbea5b904b5781bec5026d9baa7c9383ab10ee048e1

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[:5] != [69, 120, 105, 102, 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, 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, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 4, 0, 15, 1, 3, 0, 1, 0, 0, 0, 17, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 68, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 178, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 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, 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, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 247, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 124, 1, 0, 0, 0, 0, 0, 0], 1], [[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, 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, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 2, 0, 3, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 62, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 115, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 111, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[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, 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, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 181, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0], 7], [[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, 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, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 15, 0, 3, 0, 0, 0, 1, 1, 194, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 84, 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, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 219, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 182, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 202, 0, 0, 0, 15, 1, 3, 0, 1], 8], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 242, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 214, 0, 0, 0, 0, 0, 0], 8], [[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, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 37, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 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, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 238, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 17, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 37, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 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, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 4, 0, 18, 1, 3, 0, 1, 0, 0, 0, 6, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 147, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 88, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 151, 1, 0, 0, 0, 0, 0, 0], 6], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 2, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 6, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 125, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 225, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0], 5], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 95, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 168, 1, 0, 0, 0, 0, 0, 0], 'malformed']], [[[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 240, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 64, 1, 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, 0, 0, 3, 0, 15, 1, 3, 0, 1, 0, 0, 0, 51, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 55], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 215, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0], 7], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 173, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 83, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 181, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 0, 196, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 141, 0, 0, 0, 0, 0, 0], 1], [[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']]]
labels = ["regression: Exif identifier with null padding", "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 fixtureActualExpectedOutcome
regression: Exif identifier with null padding 01malformedFailed
repair trap 11malformedFailed
combined fault 211Passed
control 3malformedmalformedPassed
control 4malformedmalformedPassed
boundary 511Passed
boundary 611Passed
control 71malformedFailed

SHA-256 / 64b79f4767ec3a639a1524c8211b0a2263bdbab95f2563d863a076b6c01857d8

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, 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, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 4, 0, 15, 1, 3, 0, 1, 0, 0, 0, 17, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 9, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 68, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 178, 1, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 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, 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, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 247, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 124, 1, 0, 0, 0, 0, 0, 0], 1], [[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, 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, 0, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 18, 0, 3, 0, 0, 0, 2, 0, 3, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 62, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 115, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 111, 0, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0], 8], [[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, 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, 42, 0, 8, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 181, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0], 7], [[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, 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, 255, 77, 77, 0, 42, 0, 0, 0, 8, 0, 2, 1, 15, 0, 3, 0, 0, 0, 1, 1, 194, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 84, 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, 2, 1, 26, 0, 3, 0, 0, 0, 1, 0, 219, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 182, 0, 0, 0, 0, 0, 0], 'malformed'], [[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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 202, 0, 0, 0, 15, 1, 3, 0, 1], 8], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 242, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 8, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 214, 0, 0, 0, 0, 0, 0], 8], [[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, 77, 77, 0, 42, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 1, 135, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 37, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 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, 4, 1, 18, 0, 3, 0, 0, 0, 1, 0, 5, 0, 0, 1, 26, 0, 3, 0, 0, 0, 1, 0, 17, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 238, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 1, 0, 18, 1, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 3, 0, 26, 1, 3, 0, 1, 0, 0, 0, 17, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 37, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 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, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 4, 0, 18, 1, 3, 0, 1, 0, 0, 0, 6, 0, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 147, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 88, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 151, 1, 0, 0, 0, 0, 0, 0], 6], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 18, 1, 3, 0, 2, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 6, 1, 0, 0, 15, 1, 3, 0, 1, 0, 0, 0, 125, 1, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 225, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0], 5], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 16, 1, 3, 0, 1, 0, 0, 0, 95, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 168, 1, 0, 0, 0, 0, 0, 0], 'malformed']], [[[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 10, 0, 0, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 77, 77, 0, 42, 0, 0, 0, 10, 0, 0, 0, 4, 1, 16, 0, 3, 0, 0, 0, 1, 1, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 163, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 240, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0], 'malformed'], [[69, 120, 105, 102, 0, 255, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 26, 1, 3, 0, 1, 0, 0, 0, 64, 1, 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, 0, 0, 3, 0, 15, 1, 3, 0, 1, 0, 0, 0, 51, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 8, 0, 0, 0, 16, 1, 3, 0, 1, 0, 0, 0, 55], 8], [[69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 2, 0, 15, 1, 3, 0, 1, 0, 0, 0, 215, 1, 0, 0, 18, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0], 7], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 4, 1, 18, 0, 3, 0, 0, 0, 2, 0, 8, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 0, 173, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 1, 83, 0, 0, 1, 15, 0, 3, 0, 0, 0, 1, 1, 181, 0, 0, 0, 0, 0, 0], 1], [[69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 3, 1, 16, 0, 3, 0, 0, 0, 1, 0, 196, 0, 0, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 16, 0, 3, 0, 0, 0, 1, 0, 141, 0, 0, 0, 0, 0, 0], 1], [[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']]]
labels = ["regression: Exif identifier with null padding", "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 fixtureActualExpectedOutcome
regression: Exif identifier with null padding 0malformedmalformedPassed
repair trap 1malformedmalformedPassed
combined fault 211Passed
control 3malformedmalformedPassed
control 4malformedmalformedPassed
boundary 511Passed
boundary 611Passed
control 7malformedmalformedPassed

SHA-256 / adcf0a4874a40de24b399d361456ad10fc3f412cb31ab831cf29088136b0db5d

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.846245+00:00.

Case digest / 7730c4607086c38363f531c47c6b4a893efa2bcabe8112cb6ed699b26cbad248