기여 목록 / 8461824
CacheStorage: Include response padding in quota preflight
CacheStorage의 저장 공간 사전 검사에 응답 패딩을 포함하도록 수정했습니다. 패딩까지 고려하면 공간이 부족한 쓰기를 거절하고, 음수 패딩과 크기 계산의 오버플로도 기존 오류 경로로 처리합니다.
문제 설명
CacheStorage는 응답을 저장한 뒤 캐시 크기를 계산할 때 FetchAPIResponse::padding을 포함합니다. 그러나 쓰기 전에 필요한 공간을 계산하는 GetRequiredSafeSpaceForResponse()에는 패딩이 빠져 있었습니다.
따라서 응답 본문과 메타데이터를 저장할 공간은 있지만 패딩까지 포함할 공간은 없는 경우에도 할당량 사전 검사를 통과할 수 있었습니다. 저장 전후에 사용하는 크기 계산 기준을 맞출 필요가 있었습니다.
해결 내용
content/browser/cache_storage/cache_storage_cache.cc의 응답 크기 계산에 패딩을 추가했습니다. 본문 크기, 상태 문자열, 헤더 등 기존 계산 항목에 패딩까지 합산한 값으로 필요한 공간을 판단합니다.
safe_space_required += base::CheckedNumeric<uint64_t>(response->padding);패딩을 base::CheckedNumeric<uint64_t>로 변환하므로 음수 패딩은 유효하지 않은 값이 됩니다. 다른 크기와 합산할 때 발생하는 오버플로도 감지해 기존의 잘못된 공간 계산 오류 경로로 전달합니다.
테스트 방법
cache_storage_cache_unittest.cc에 다음 회귀 테스트를 추가했습니다.
| 테스트 | 검증 내용 |
|---|---|
PutIncludesResponsePaddingInQuotaCheck |
패딩을 제외한 크기만큼만 할당량을 설정한 뒤, 양수 패딩을 복원하면 쓰기가 kErrorQuotaExceeded로 실패하는지 확인합니다. |
PutRejectsNegativeResponsePadding |
패딩을 -1로 설정하면 kErrorStorage가 반환되고 kBatchInvalidSpace가 기록되는지 확인합니다. |
PutRejectsOverflowingResponsePadding |
요청과 응답의 크기 합계가 uint64_t 최대값에 도달하도록 본문 크기를 설정한 뒤 패딩을 더하면, 오버플로를 잘못된 공간 계산으로 거절하는지 확인합니다. |
음수·오버플로 테스트는 잘못된 메시지 사유가 CSDH_UNEXPECTED_OPERATION인지도 검사합니다. 위 내용은 Patch Set 5의 테스트 코드를 기준으로 정리했으며, 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
변경은 2026년 9월 30일 UTC에 Chromium main에 반영됐습니다(refs/heads/main@{#1708503}).
배운 점
- 저장 후 사용량에 포함하는 항목은 저장 전 할당량 검사에도 포함해야 합니다. 응답 본문 외에 패딩과 메타데이터까지 비교해야 계산 누락을 찾을 수 있습니다.
- 부호 있는 크기 값을 부호 없는 값으로 변환할 때는 음수와 합산 오버플로를 함께 검사해야 합니다.
- 누락된 항목을 제외한 크기로 할당량을 정확히 설정하면, 그 항목이 사전 검사에 반영되는지 확인하는 회귀 테스트를 만들 수 있습니다.