OSSCA Chromium

기여 목록 / 8511369

[network] Ignore SSE id fields containing U+0000

DevToolsfixdevtools/devtools-frontendIn Review

SSE parser에서 HTML Standard에 따라 U+0000을 포함한 id 필드를 무시하도록 수정했습니다.

문제 설명

기존 SSE parser는 id 값에 null 문자가 있는지 검사하지 않고 저장해, 유효하지 않은 값으로 이전 event ID를 덮어썼습니다.

해결 내용

  • id 필드의 값에 \0이 없을 때만 저장된 event ID를 갱신하도록 했습니다.
  • 정상 id:42 뒤에 null 문자가 포함된 id를 입력하는 테스트를 추가했습니다.
  • 두 이벤트가 모두 전달되고, 두 번째 이벤트도 ID 42와 자신의 data를 유지하는지 검증했습니다.

전체 코드 diff는 다음과 같습니다.

diff --git a/front_end/core/sdk/ServerSentEventsProtocol.test.ts b/front_end/core/sdk/ServerSentEventsProtocol.test.ts
index f61ff92..b9cee26 100644
--- a/front_end/core/sdk/ServerSentEventsProtocol.test.ts
+++ b/front_end/core/sdk/ServerSentEventsProtocol.test.ts
@@ -127,6 +127,17 @@
     assert.strictEqual(events[1].data, 'bye');
   });

+  it('ignores id fields containing a null character', async () => {
+    await enqueue('id:42\ndata:first\n\nid:bad\0id\ndata:second\n\n');
+
+    assert.lengthOf(events, 2);
+    assert.strictEqual(events[0].eventId, '42');
+    assert.strictEqual(events[0].data, 'first');
+
+    assert.strictEqual(events[1].eventId, '42');
+    assert.strictEqual(events[1].data, 'second');
+  });
+
   it('ignores the retry field', async () => {
     await enqueue('retry:9999\n\n');

diff --git a/front_end/core/sdk/ServerSentEventsProtocol.ts b/front_end/core/sdk/ServerSentEventsProtocol.ts
index ae569ed..6bfe539 100644
--- a/front_end/core/sdk/ServerSentEventsProtocol.ts
+++ b/front_end/core/sdk/ServerSentEventsProtocol.ts
@@ -95,8 +95,10 @@
       this.#data += '\n';
     }
     if (fieldName === 'id') {
-      // We should do a check here whether the id field contains "\0" and ignore it.
-      this.#id = this.#line.substring(fieldValueStart);
+      const id = this.#line.substring(fieldValueStart);
+      if (!id.includes('\0')) {
+        this.#id = id;
+      }
     }
     // Ignore all other fields. Also ignore "retry", we won't forward that to the backend.
   }

테스트 방법

ServerSentEventsProtocol.test.ts에 회귀 테스트 1개를 추가했습니다. Gerrit에서 patchset 3의 CQ 실행 통과를 확인했습니다. 현재 리뷰 중입니다.

배운 점

필드 값이 유효하지 않을 때는 해당 필드만 무시하고, 이전 상태와 이벤트의 다른 데이터를 유지하는지도 함께 검증해야 합니다.

참고 자료