기여 목록 / 8471469
Blink: Reject oversized Blob.text() results
BlinkfixIn Review
Blob.text()가 디코딩한 문자열이 V8의 문자열 길이 한도를 넘으면 변환 전에 RangeError로 Promise를 거절하도록 변경했습니다.
문제 설명
Blob의 데이터를 UTF-8로 디코딩한 Blink 문자열은 V8이 표현할 수 있는 길이보다 길 수 있습니다. 이를 그대로 Promise 결과로 변환하면 Debug 렌더러가 외부 문자열 생성 과정에서 종료될 수 있었습니다. Blob의 바이트 크기와 디코딩된 문자열 길이는 다르므로 검사 기준도 구분해야 합니다.
해결 내용
- 텍스트 로딩 완료 시
String::length()를v8::String::kMaxLength와 비교합니다. 초과하면RangeError: Invalid string length로 거절하고, 한도 이하면 기존처럼 resolve합니다. - 호출별 길이 한도를 받는
TextWithMaxLengthForTesting()을 추가해 작은 Blob으로 경계 조건을 재현합니다. 테스트 한도는 V8의 실제 최대값을 넘길 수 없습니다. - 새
blob_test.cc를 테스트 빌드 목록에 등록합니다. RangeError는 V8의 구현 한도에 대한 선택이며, 모든 큰 Blob을 입력 바이트 수만으로 거절하는 변경은 아닙니다.
테스트 방법
DecodedTextAtLimitResolves: 8글자와 한도 8에서 정상 resolve합니다.DecodedTextOverLimitRejectsWithRangeError: 9글자와 한도 8에서 RangeError로 reject합니다.LimitUsesDecodedLengthInsteadOfBlobSize: UTF-8 12바이트가 디코딩 후 4글자인 경우 한도 4에서 성공합니다.
확인한 CQ 통과 기록은 Patch Set 2(2026-09-26 UTC)입니다. 현재 보고서가 다루는 Patch Set 3의 통과 결과는 확인되지 않았으므로 이전 결과와 구분합니다. 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
관련 이슈와 외부 PR
배운 점
- 서로 다른 문자열 구현 사이의 변환에서는 대상 엔진의 표현 한도를 확인해야 합니다.
- 호출별 테스트 한도를 주입하면 거대한 메모리를 할당하지 않고도 실제 Promise 성공·실패 경로를 검증할 수 있습니다.