Skip to content

Commit 58c1bd6

Browse files
Connor ClarkDevtools-frontend LUCI CQ
authored andcommitted
[RPP] Prevent infinite loop for some inputs to handleLinkResponseHeader
Fixed: 431239629 Change-Id: I161d0391f4e5c734e14b12482e6cce40096bb3be Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6729654 Reviewed-by: Paul Irish <[email protected]> Commit-Queue: Paul Irish <[email protected]> Auto-Submit: Connor Clark <[email protected]>
1 parent d857714 commit 58c1bd6

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

front_end/models/trace/insights/NetworkDependencyTree.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,12 @@ describe('generatePreconnectedOrigins', () => {
376376
const result = Trace.Insights.Models.NetworkDependencyTree.handleLinkResponseHeader(linkHeader);
377377
assert.deepEqual(result, [{url: 'https://example.com', headerText: '<https://example.com>; rel="preconnect"'}]);
378378
});
379+
380+
it('should not loop infinitely on a malformed link part at the end', () => {
381+
const linkHeader = '<https://a.com>; rel=preconnect, <https://b.com';
382+
const result = Trace.Insights.Models.NetworkDependencyTree.handleLinkResponseHeader(linkHeader);
383+
assert.deepEqual(result, [{url: 'https://a.com', headerText: '<https://a.com>; rel=preconnect'}]);
384+
});
379385
});
380386
});
381387

front_end/models/trace/insights/NetworkDependencyTree.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,14 +429,24 @@ export function handleLinkResponseHeader(linkHeaderValue: string): Array<{url: s
429429
}
430430
const preconnectedOrigins: Array<{url: string, headerText: string}> = [];
431431

432-
// const headerTextParts = linkHeaderValue.split(',');
433-
434432
for (let i = 0; i < linkHeaderValue.length;) {
435433
const firstUrlEnd = linkHeaderValue.indexOf('>', i);
434+
if (firstUrlEnd === -1) {
435+
break;
436+
}
437+
436438
const commaIndex = linkHeaderValue.indexOf(',', firstUrlEnd);
437439
const partEnd = commaIndex !== -1 ? commaIndex : linkHeaderValue.length;
438440
const part = linkHeaderValue.substring(i, partEnd);
439441

442+
// This shouldn't be necessary, but we had a bug that created an infinite loop so
443+
// let's guard against that.
444+
// See crbug.com/431239629
445+
if (partEnd + 1 <= i) {
446+
console.warn('unexpected infinite loop, bailing');
447+
break;
448+
}
449+
440450
i = partEnd + 1;
441451

442452
const preconnectedOrigin = handleLinkResponseHeaderPart(part.trim());

0 commit comments

Comments
 (0)