OSSCA Chromium

기여 목록 / 8302834

FSA: Validate emoji ZWJ names in the shared filename layer

ContentfixIn Review

네이티브 File System Access에서 ZWJ로 연결한 이모지 파일명이 누락되는 문제를 공통 파일명 검증 계층에서 처리하는 패치입니다. 현재 Gerrit에서는 WIP이며, 보고서 상태는 요청에 따라 in review로 기록합니다.

문제 설명

기존 파일명 검증은 Unicode 형식 문자를 모두 거절하므로, 🧖🏼‍♀️처럼 U+200D ZERO WIDTH JOINER를 포함한 이름도 디렉터리 목록에서 빠집니다. 목록 열거만 예외 처리하면 조회·생성·삭제·이동에서 같은 이름을 다르게 취급하게 됩니다.

해결 내용

  1. base::i18n::IsFilenameLegalWithEmojisAllowed()를 추가해 Unicode GB11의 Extended_Pictographic Extend* ZWJ Extended_Pictographic 문맥에 있는 U+200D만 허용합니다. GB11은 문자소 경계 규칙이므로 완전한 이모지 유효성 검사와는 구분합니다.
  2. FSA의 공통 IsSafePathComponent()에서 새 검증 함수를 사용해 열거, 파일·디렉터리 조회와 생성, 삭제, 이동·이름 변경에 같은 규칙을 적용합니다.
  3. 기존 IsFilenameLegal()과 파일명 치환 함수는 엄격한 처리를 유지합니다. Windows 짧은 이름, 위험한 확장자, 예약 이름과 URL 구성에는 원래 이름을 보존하며 OPFS 검증은 변경하지 않습니다.

테스트 방법

  • IsFilenameLegalWithEmojisAllowed와 IsFilenameLegalRejectsInvalidEmojiJoiningContexts로 허용되는 연결 문맥과 잘못된 ZWJ·다른 금지 문자를 구분합니다.
  • EmojiZeroWidthJoinerPreservesShortNameChecks와 EmojiZeroWidthJoinerDoesNotChangeSanitization으로 Windows 짧은 이름 판정 및 기존 치환 동작을 검증합니다.
  • AllowsEmojiWithZeroWidthJoiner, GetFileAndRemoveEntryWithEmojiZeroWidthJoiner, GetDirectoryAndRemoveEntryWithEmojiZeroWidthJoiner는 디렉터리 반복 차단 목록 검사 기능의 활성·비활성 상태에서 열거·조회·생성·삭제를 확인합니다. 파일 핸들 테스트는 이동·이름 변경 뒤 원래 데이터와 경로가 유지되는지 확인합니다.
  • 최신 패치 설명에는 더 최신 소스·의존성 체크아웃에 CL 파일을 적용한 Linux 환경에서 ICU 테스트 8개와 FSA 테스트 232개가 통과했다고 기록돼 있습니다. Windows와 macOS는 실행하지 않았다고 명시돼 있습니다.

확인한 CQ 통과 기록은 Patch Set 10(2026-09-11 UTC)입니다. 현재 보고서가 다루는 Patch Set 11의 통과 결과는 확인되지 않았으므로 이전 결과와 구분합니다. 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

관련 이슈와 외부 PR

같은 FSA 파일명 검증을 다루는 CL 8353444는 특정 형식 문자를 비 Apple 플랫폼에서 허용하는 별도의 접근입니다.

배운 점

  • Unicode 형식 문자 전체를 허용하지 않고, 필요한 ZWJ 문맥을 검사하는 방식으로 허용 범위를 제한할 수 있습니다.
  • 파일명 검증 규칙은 열거뿐 아니라 같은 이름을 받는 모든 작업에 적용해야 합니다. 검증을 위해 글자를 지우면 짧은 이름 판정까지 바뀔 수 있습니다.

참고 자료