Repository navigation
fix: 라운드35 전수 감사 — 입력의 크기·깊이, 결함 16건 - #59
Merged
Merged
Conversation
src 전체(약 19,500줄)를 모델 -> 포매터 -> 컨트롤 순으로 읽었다. 대부분 이전 라운드가 재지 않은 축: 붙여넣거나 여는 문서가 얼마나 크고 깊을 수 있는가. 프로세스 종료(catch 불가): - HTML <div> 2,000겹(11 KB) -> WalkBlocks 스택 오버플로. DOM 128단 아래는 글자로 접기(비재귀), HtmlAgilityPack id 색인 끔(그 서브트리 제거가 재귀) - 중첩 표 400단 -> 렌더 스택 오버플로, RTF \itap 무제한. RTF 중첩 32단 - 행 없는 인라인 표(JSON) -> 화살표에서 키 처리기 밖으로 예외. 빈 격자는 문서에서 뺌 데이터 소실: - 인라인 표 셀로 끝나는 선택 삭제가 그 줄 전체(표 포함)를 지움 (TextRange.CoveredSpan) - 호스트의 Document 대입 뒤 Ctrl+Z가 옛 파일을 되살림 -> 새 문서 = 새 기록 - 인라인 표 섞인 한 문단 붙여넣기가 표를 버림 보안: 파일의 그림 MIME이 내보낸/클립보드 HTML <img src>에 그대로 -> 속성 주입 메모리·시간: 픽셀 폭탄(1.5 MB -> 1.6 GB, real Skia) 1억 픽셀 상한 · 가져오는 표 1,000열/25만 셀 · .flow 미참조 항목 안 읽음(항목당 256 MB) · RTF IndexOf O(n^2) · HTML 넓은 행 예외 · ListLevel 범위(-1이면 HTML 내보내기 예외) · InsertTable 음수 · 문단 안 script/style 테스트: Round35AuditTests(31). 수정마다 개별 반증 — 깊이 반증은 별도 프로세스(호스트가 죽음). unit 1287 + render 55, 퍼즈 500시드 그린. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
centwon
added a commit
that referenced
this pull request
Sep 30, 2026
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
centwon
added a commit
that referenced
this pull request
Sep 30, 2026
* docs: 로드맵 — 라운드35 머지(#59), 상한값 사용자 확정 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: 라운드35 후속 — 남겨 둔 4건 확정·수정 - JPEG 채움 바이트(FF FF)·길이 없는 마커를 세그먼트 길이로 읽어 프레임 헤더를 건너뜀 -> 크기 (0,0) -> 1억 픽셀 상한 우회. 채움 바이트와 길이 없는 마커를 건너뜀 - RTF 세로 병합 2만 개(1.4 MB)에 29.6 s 멈춤: MergeCells가 매번 격자 전체 스캔. 1x1 칸만인 범위는 기존 병합에 걸칠 수 없으므로 스캔 생략 -> 0.38 s (500x500 상한 끝 2.7 s) - 앵커 셀이 중첩 표로 시작하면 병합한 글자가 그 표 안으로(TableCell.Para가 내려감) - RTF 글꼴명의 ';'가 글꼴 표 항목을 끊음 -> 이름에서 뺌 - 기각: 구분선 Indent의 JSON 누락(메뉴로 못 바꾸고 렌더링도 안 씀) 반증: 수정마다 되돌려 빨강, 빠른 경로의 전제(병합 옆 1x1 범위·병합에 닿는 범위의 확장)도 반증. unit 1293 + render 55, 퍼즈 500시드 그린. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
라운드35 전수 감사.
src약 19,500줄을 모델 → 포매터 → 컨트롤 순으로 읽었다. 결함 16건을 찾았고, 모두 빨강 먼저 → 수정 → 개별 반증을 거쳤다. 대부분은 이전 라운드가 재지 않은 축, 즉 붙여넣거나 여는 입력이 얼마나 크고 깊을 수 있는가에서 나왔다.프로세스 종료 (catch 불가)
<div>2,000겹 (11 KB HTML) 붙여넣기<div>/<span>20,000겹\itap, HTML)→수정: DOM 128단 아래는 글자로 접는다(비재귀). HtmlAgilityPack의 id 색인은 끈다(그 서브트리 제거가 재귀였다). RTF 중첩은 32단까지만 읽는다.
데이터 소실
TextRange.CoveredSpan으로 삭제·복사 텍스트·서식 적용이 같은 규칙을 쓴다.Document에 새 문서를 대입한 뒤 Ctrl+Z를 누르면 옛 파일이 돌아왔다. 이제 새 문서는 새 기록으로 시작한다. undo/redo 자체의 문서 교체는 기록을 유지한다.보안
<img src="data:…">에 그대로 들어가onerror=속성이 주입됐다. 읽을 때와 쓸 때 모두 검증한다.메모리·시간
DecodeToWidth는 더 나빠서 20000²에 2 GB였다. 이제 1억 픽셀 초과는 디코드하지 않는다.IndexOf의 O(n²)는 사전으로 바꿨다..flow: 문서가 참조하는 그림 항목만 읽는다(63 KB 파일이 64 MB를 풀던 문제). 항목당 256 MB 상한.ListLevel-1이면 HTML 내보내기 예외(복사도 실패) ·InsertTable(-1, n)예외 · 문단 안<script>/<style>소스가 본문으로 들어옴.⚠ 확인이 필요한 결정
.flow그림 항목 256 MB.검증
Round35AuditTests31건. 수정마다 되돌려 해당 테스트가 빨개지는지 확인했다. 깊이 관련 반증은 테스트 호스트를 죽이므로 별도 프로세스에서 시간 제한을 두고 돌렸다. 한 겹은 반증에서 초록으로 남아(id 색인은 20,000겹에서만 넘친다) 그 깊이의 사례를 추가했다.file:///%5C%5ChostUNC 우회(\\\host는 SMB를 타지 않음, 0 ms), 링크 셸 실행(http(s)만 연다).포트(WinUIRichEditor)는 포매터가 같은 코드라 같은 결함이 있을 것으로 보지만, 아직 측정하지 않았다.
🤖 Generated with Claude Code