FA-26841 / HTTP ranges / Open access
Multipart boundary parameter parsing: quoted separator bytes stay inside the boundary · case 01
Multipart boundary parameter parsing: quoted separator bytes stay inside the boundary.
ROOT CAUSE
The multipart-boundary-parameter-quoted-semicolon decision uses parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted=not quoted elif c==';': parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value.
VERIFIED REPAIR
Apply the bounded decision exactly: parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted=not quoted elif c==';' and not quoted: parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value
Unsuccessful approach: The partial repair uses parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted=not quoted elif c==';' and (not quoted or current.endswith('a')): parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value, which still violates the stated contract.
Case contract
Parse a bounded Content-Type string with semicolon-separated parameters, quoted strings and backslash escapes inside quotes. Require multipart/byteranges (case-insensitive) and exactly one boundary parameter, with 1..12 ASCII printable characters excluding CR/LF. Other parameters ignored. Unbalanced quotes or dangling quoted escapes reject. Input x is the field string.
Why this case matters
Range responses combine representation identity, conditional requests, framing, and partial-object state.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
parts=[]
current=''
quoted=False
escaped=False
for c in x:
if escaped:
current+=c
escaped=False
elif quoted and c=='\\':
escaped=True
elif c=='"':
quoted=not quoted
elif c==';':
parts.append(current)
current=''
else:
current+=c
if quoted or escaped: return None
parts.append(current)
if parts[0].strip().lower()!='multipart/byteranges': return None
boundaries=[]
for part in parts[1:]:
if '=' not in part: continue
key,value=part.split('=',1)
if key.strip().lower()=='boundary': boundaries.append(value.strip())
if len(boundaries)!=1: return None
value=boundaries[0]
if not 1<=len(value)<=12: return None
if any(ord(c)<32 or ord(c)>126 for c in value): return None
return value
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quoted-semicolon fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quoted-semicolon fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quoted-semicolon fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quoted-semicolon fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quoted-semicolon fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quoted-semicolon fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
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 |
|---|---|---|---|
| quoted-semicolon fixture 0 | a | a;b | Failed |
| quoted-semicolon fixture 1 | a"b | a"b | Passed |
| quoted-semicolon fixture 2 | a\b | a\b | Passed |
| quoted-semicolon fixture 3 | None | None | Passed |
| quoted-semicolon fixture 4 | abc | abc | Passed |
| quoted-semicolon fixture 5 | None | None | Passed |
| quoted-semicolon fixture 6 | None | None | Passed |
| quoted-semicolon fixture 7 | None | None | Passed |
| quoted-semicolon fixture 8 | None | None | Passed |
| quoted-semicolon fixture 9 | abcdefghijkl | abcdefghijkl | Passed |
| quoted-semicolon fixture 10 | None | None | Passed |
| quoted-semicolon fixture 11 | None | None | Passed |
| quoted-semicolon fixture 12 | None | None | Passed |
| quoted-semicolon fixture 13 | None | None | Passed |
| quoted-semicolon fixture 14 | None | None | Passed |
| quoted-semicolon fixture 15 | b1 | b1 | Passed |
| quoted-semicolon fixture 16 | abc | abc | Passed |
| quoted-semicolon fixture 17 | ab | ab | Passed |
SHA-256 / 54889aba9ba48301e4bd8c6c9bc9edbfef4a943a314ba31991a898b35f77293e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
parts=[]
current=''
quoted=False
escaped=False
for c in x:
if escaped:
current+=c
escaped=False
elif quoted and c=='\\':
escaped=True
elif c=='"':
quoted=not quoted
elif c==';' and (not quoted or current.endswith('a')):
parts.append(current)
current=''
else:
current+=c
if quoted or escaped: return None
parts.append(current)
if parts[0].strip().lower()!='multipart/byteranges': return None
boundaries=[]
for part in parts[1:]:
if '=' not in part: continue
key,value=part.split('=',1)
if key.strip().lower()=='boundary': boundaries.append(value.strip())
if len(boundaries)!=1: return None
value=boundaries[0]
if not 1<=len(value)<=12: return None
if any(ord(c)<32 or ord(c)>126 for c in value): return None
return value
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quoted-semicolon fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quoted-semicolon fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quoted-semicolon fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quoted-semicolon fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quoted-semicolon fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quoted-semicolon fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
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 |
|---|---|---|---|
| quoted-semicolon fixture 0 | a | a;b | Failed |
| quoted-semicolon fixture 1 | a"b | a"b | Passed |
| quoted-semicolon fixture 2 | a\b | a\b | Passed |
| quoted-semicolon fixture 3 | None | None | Passed |
| quoted-semicolon fixture 4 | abc | abc | Passed |
| quoted-semicolon fixture 5 | None | None | Passed |
| quoted-semicolon fixture 6 | None | None | Passed |
| quoted-semicolon fixture 7 | None | None | Passed |
| quoted-semicolon fixture 8 | None | None | Passed |
| quoted-semicolon fixture 9 | abcdefghijkl | abcdefghijkl | Passed |
| quoted-semicolon fixture 10 | None | None | Passed |
| quoted-semicolon fixture 11 | None | None | Passed |
| quoted-semicolon fixture 12 | None | None | Passed |
| quoted-semicolon fixture 13 | None | None | Passed |
| quoted-semicolon fixture 14 | None | None | Passed |
| quoted-semicolon fixture 15 | b1 | b1 | Passed |
| quoted-semicolon fixture 16 | abc | abc | Passed |
| quoted-semicolon fixture 17 | ab | ab | Passed |
SHA-256 / 71f4eb4009402acc88b9f1564b4cedbd5d6fbd2621ced21ba893ba9a1118dad5
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
parts=[]
current=''
quoted=False
escaped=False
for c in x:
if escaped:
current+=c
escaped=False
elif quoted and c=='\\':
escaped=True
elif c=='"':
quoted=not quoted
elif c==';' and not quoted:
parts.append(current)
current=''
else:
current+=c
if quoted or escaped: return None
parts.append(current)
if parts[0].strip().lower()!='multipart/byteranges': return None
boundaries=[]
for part in parts[1:]:
if '=' not in part: continue
key,value=part.split('=',1)
if key.strip().lower()=='boundary': boundaries.append(value.strip())
if len(boundaries)!=1: return None
value=boundaries[0]
if not 1<=len(value)<=12: return None
if any(ord(c)<32 or ord(c)>126 for c in value): return None
return value
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quoted-semicolon fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quoted-semicolon fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quoted-semicolon fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quoted-semicolon fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quoted-semicolon fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quoted-semicolon fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quoted-semicolon fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quoted-semicolon fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
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 |
|---|---|---|---|
| quoted-semicolon fixture 0 | a;b | a;b | Passed |
| quoted-semicolon fixture 1 | a"b | a"b | Passed |
| quoted-semicolon fixture 2 | a\b | a\b | Passed |
| quoted-semicolon fixture 3 | None | None | Passed |
| quoted-semicolon fixture 4 | abc | abc | Passed |
| quoted-semicolon fixture 5 | None | None | Passed |
| quoted-semicolon fixture 6 | None | None | Passed |
| quoted-semicolon fixture 7 | None | None | Passed |
| quoted-semicolon fixture 8 | None | None | Passed |
| quoted-semicolon fixture 9 | abcdefghijkl | abcdefghijkl | Passed |
| quoted-semicolon fixture 10 | None | None | Passed |
| quoted-semicolon fixture 11 | None | None | Passed |
| quoted-semicolon fixture 12 | None | None | Passed |
| quoted-semicolon fixture 13 | None | None | Passed |
| quoted-semicolon fixture 14 | None | None | Passed |
| quoted-semicolon fixture 15 | b1 | b1 | Passed |
| quoted-semicolon fixture 16 | abc | abc | Passed |
| quoted-semicolon fixture 17 | ab | ab | Passed |
SHA-256 / 1579c72064e5f97633aa03272aacf410511c8882b8f0653fcbcb9f1da9999b50
Verification & scope
Deterministic simplified range service, with stipulated local policies and already parsed trusted inputs; not a complete HTTP implementation. 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:41:19.552374+00:00.
Case digest / bfa618c0e33a363d9041a0e22a99ff5f0ccbcc68602d9c5e16f85c0c77bc5b18