OSSCA Chromium

기여 목록 / 8474691

[password_manager] Use sql::Statement time accessors

SecurityrefactorMerged

비밀번호 메모·보안 경고 테이블과 affiliations DB가 시간 값을 저장하고 읽을 때 손으로 하던 int64 변환을 sql::Statement::ColumnTime()·BindTime()으로 바꿨습니다. sql::Statement 시간 접근자 이행 시리즈(crbug.com/40176243, OSSCA #416)의 세 번째 CL입니다. 3파일 +4/−8, 저장 형식은 바뀌지 않습니다. 2026-09-29에 머지됐습니다(0d3ab367aa34a). ioanap@(+1과 CQ dry run)와 friedrichh@의 +1을 받았고, 제출 요청 뒤 friedrichh@가 CQ를 돌려 한 번에 통과했습니다.

문제 설명

  • issue url: https://crbug.com/40176243
  • sql/statement.h는 시간 컬럼을 ColumnTime()·BindTime()으로 다루라고 하면서, 호출처가 손으로 하던 변환을 옮기라는 TODO를 남겨 두었습니다. 앞선 CL 1(history, 8382856)과 CL 2(net NEL store, 8410045)에 이어 남은 곳을 OWNER 그룹별로 옮기고 있습니다.
  • 이번 범위는 password_manager와 affiliations입니다. 쓰기 쪽은 대부분 이미 BindTime()을 쓰는데 읽기가 옛 방식이라 한 테이블 안에서 비대칭이었습니다. affiliations는 같은 컬럼을 한 함수는 ColumnTime()으로, 다른 함수는 Time::FromInternalValue()로 읽고 있었습니다.

해결 내용

  • password_notes_table.cc: date_created 읽기를 ColumnTime()으로
  • insecure_credentials_table.cc: create_time 읽기를 ColumnTime()으로, InsertOrReplace()의 쓰기를 BindTime()으로
  • affiliation_database.cc: GetAllAffiliationsAndBranding()의 last_update_time 읽기를 ColumnTime()으로
-    base::Time create_time = base::Time::FromDeltaSinceWindowsEpoch(
-        (base::Microseconds(s->ColumnInt64(4))));
+    base::Time create_time = s->ColumnTime(4);
 ...
-  s.BindInt64(2,
-              metadata.create_time.ToDeltaSinceWindowsEpoch().InMicroseconds());
+  s.BindTime(2, metadata.create_time);

발굴 과정

시리즈 계획은 #416 등록 때 세워 두었고, 착수 전에 최신 트리(09-24 main)에서 남은 곳을 다시 검색해 여전히 옛 방식인지, 같은 파일에 겹치는 열린 CL이 없는지 확인했습니다. 계획에는 3곳으로 적었지만 다시 세어 보니 insecure_credentials_table.cc의 읽기 1곳이 더 있어 4곳이었습니다. 리뷰어는 두 디렉터리 모두의 OWNER인 ioanap@ 한 명으로 잡았습니다.

테스트 방법

동작 불변 리팩토링이라 새 테스트는 없고 기존 테스트 통과가 검증입니다.

  • 등가성: sql/statement.cc의 구현을 직접 확인했습니다. BindTime()은 ToDeltaSinceWindowsEpoch().InMicroseconds()를 저장하고 ColumnTime()은 FromDeltaSinceWindowsEpoch(Microseconds(...))로 되돌립니다. Time::FromInternalValue()도 Windows epoch 기준 마이크로초라 같은 값입니다.
  • components_unittests 증분 빌드 5스텝 13초(전날 밤 트리를 최신화하며 전체 빌드를 해 둔 덕분)
  • PasswordNotesTable*:InsecureCredentialsTable*:*LoginDatabase*:AffiliationDatabase*:*AffiliationBackend* 212/212 통과
  • presubmit 0 경고

배운 점

  • 시리즈 CL은 착수 직전에 남은 곳을 다시 센다. 계획할 때의 grep 패턴이 여러 줄에 걸친 읽기를 놓칠 수 있습니다.
  • 밤사이 트리를 최신 main으로 동기화하고 자주 쓰는 테스트 바이너리를 미리 빌드해 두면, 다음 날 작은 CL은 몇 초짜리 증분 빌드로 끝납니다.

참고 자료