Skip to content

Commit 09d2d7d

Browse files
FrankYFTangmibrunin
authored andcommitted
[Backport] Security bug 412149700
Cherry-pick of patch originally reviewed on https://chromium-review.googlesource.com/c/v8/v8/+/6654498: Change fatal to exception due to lack of resources Other Intl object address the same issue in https://issues.chromium.org/issues/42200234 (cherry picked from commit 1d82eec693c3a322b94b9fbc0cd09a6bbcabc752) Fixed: 412149700 Change-Id: Ieca48451cd81efc7f9cb52d8cc806bc4c6f01323 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6599691 Commit-Queue: Frank Tang <[email protected]> Reviewed-by: Jakob Kummerow <[email protected]> Cr-Original-Commit-Position: refs/heads/main@{#100658} Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6654498 Commit-Queue: Gyuyoung Kim (xWF) <[email protected]> Reviewed-by: Frank Tang <[email protected]> Cr-Commit-Position: refs/branch-heads/13.2@{#98} Cr-Branched-From: 24068c59cedad9ee976ddc05431f5f497b1ebd71-refs/heads/13.2.152@{#1} Cr-Branched-From: 6054ba94db0969220be4f94dc1677fc4696bdc4f-refs/heads/main@{#97085} Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/659330 Reviewed-by: Moss Heim <[email protected]>
1 parent fd7bd19 commit 09d2d7d

10 files changed

+43
-55
lines changed

chromium/v8/src/objects/js-break-iterator.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ MaybeHandle<JSV8BreakIterator> JSV8BreakIterator::New(
4343
MAYBE_RETURN(maybe_locale_matcher, MaybeHandle<JSV8BreakIterator>());
4444
Intl::MatcherOption matcher = maybe_locale_matcher.FromJust();
4545

46-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
47-
Intl::ResolveLocale(isolate, JSV8BreakIterator::GetAvailableLocales(),
48-
requested_locales, matcher, {});
49-
if (maybe_resolve_locale.IsNothing()) {
46+
Intl::ResolvedLocale r;
47+
if (!Intl::ResolveLocale(isolate, JSV8BreakIterator::GetAvailableLocales(),
48+
requested_locales, matcher, {})
49+
.To(&r)) {
5050
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
5151
}
52-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
5352

5453
// Extract type from options
5554
enum class Type { CHARACTER, WORD, SENTENCE, LINE };

chromium/v8/src/objects/js-collator.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,16 @@ MaybeHandle<JSCollator> JSCollator::New(Isolate* isolate, DirectHandle<Map> map,
354354
// https://tc39.github.io/ecma402/#sec-intl-collator-internal-slots
355355
//
356356
// 16. Let relevantExtensionKeys be %Collator%.[[RelevantExtensionKeys]].
357-
std::set<std::string> relevant_extension_keys{"co", "kn", "kf"};
358357

359358
// 17. Let r be ResolveLocale(%Collator%.[[AvailableLocales]],
360359
// requestedLocales, opt, %Collator%.[[RelevantExtensionKeys]],
361360
// localeData).
362-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
363-
Intl::ResolveLocale(isolate, JSCollator::GetAvailableLocales(),
364-
requested_locales, matcher, relevant_extension_keys);
365-
if (maybe_resolve_locale.IsNothing()) {
361+
Intl::ResolvedLocale r;
362+
if (!Intl::ResolveLocale(isolate, JSCollator::GetAvailableLocales(),
363+
requested_locales, matcher, {"co", "kn", "kf"})
364+
.To(&r)) {
366365
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
367366
}
368-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
369367

370368
// 18. Set collator.[[Locale]] to r.[[locale]].
371369
icu::Locale icu_locale = r.icu_locale;

chromium/v8/src/objects/js-date-time-format.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,20 +2244,19 @@ MaybeHandle<JSDateTimeFormat> JSDateTimeFormat::CreateDateTimeFormat(
22442244
// ecma402/#sec-intl.datetimeformat-internal-slots
22452245
// The value of the [[RelevantExtensionKeys]] internal slot is
22462246
// « "ca", "nu", "hc" ».
2247-
std::set<std::string> relevant_extension_keys = {"nu", "ca", "hc"};
22482247

22492248
// 10. Let localeData be %DateTimeFormat%.[[LocaleData]].
22502249
// 11. Let r be ResolveLocale( %DateTimeFormat%.[[AvailableLocales]],
22512250
// requestedLocales, opt, %DateTimeFormat%.[[RelevantExtensionKeys]],
22522251
// localeData).
22532252
//
2254-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale = Intl::ResolveLocale(
2255-
isolate, JSDateTimeFormat::GetAvailableLocales(), requested_locales,
2256-
locale_matcher, relevant_extension_keys);
2257-
if (maybe_resolve_locale.IsNothing()) {
2253+
Intl::ResolvedLocale r;
2254+
if (!Intl::ResolveLocale(isolate, JSDateTimeFormat::GetAvailableLocales(),
2255+
requested_locales, locale_matcher,
2256+
{"nu", "ca", "hc"})
2257+
.To(&r)) {
22582258
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
22592259
}
2260-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
22612260

22622261
icu::Locale icu_locale = r.icu_locale;
22632262
DCHECK(!icu_locale.isBogus());

chromium/v8/src/objects/js-display-names.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,14 @@ MaybeHandle<JSDisplayNames> JSDisplayNames::New(Isolate* isolate,
437437
// ecma402/#sec-Intl.DisplayNames-internal-slots
438438
// The value of the [[RelevantExtensionKeys]] internal slot is
439439
// « ».
440-
std::set<std::string> relevant_extension_keys = {};
441440
// 9. Let r be ResolveLocale(%DisplayNames%.[[AvailableLocales]],
442441
// requestedLocales, opt, %DisplayNames%.[[RelevantExtensionKeys]]).
443-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
444-
Intl::ResolveLocale(isolate, JSDisplayNames::GetAvailableLocales(),
445-
requested_locales, matcher, relevant_extension_keys);
446-
if (maybe_resolve_locale.IsNothing()) {
442+
Intl::ResolvedLocale r;
443+
if (!Intl::ResolveLocale(isolate, JSDisplayNames::GetAvailableLocales(),
444+
requested_locales, matcher, {})
445+
.To(&r)) {
447446
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
448447
}
449-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
450448

451449
icu::Locale icu_locale = r.icu_locale;
452450

chromium/v8/src/objects/js-duration-format.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,12 @@ MaybeHandle<JSDurationFormat> JSDurationFormat::New(
286286
// 9. Let r be ResolveLocale(%DurationFormat%.[[AvailableLocales]],
287287
// requestedLocales, opt, %DurationFormat%.[[RelevantExtensionKeys]],
288288
// %DurationFormat%.[[LocaleData]]).
289-
std::set<std::string> relevant_extension_keys{"nu"};
290289
Intl::ResolvedLocale r;
291-
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
292-
isolate, r,
293-
Intl::ResolveLocale(isolate, JSDurationFormat::GetAvailableLocales(),
294-
requested_locales, matcher, relevant_extension_keys),
295-
Handle<JSDurationFormat>());
290+
if (!Intl::ResolveLocale(isolate, JSDurationFormat::GetAvailableLocales(),
291+
requested_locales, matcher, {"nu"})
292+
.To(&r)) {
293+
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
294+
}
296295

297296
// 10. Let locale be r.[[locale]].
298297
icu::Locale r_locale = r.icu_locale;

chromium/v8/src/objects/js-list-format.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ MaybeHandle<JSListFormat> JSListFormat::New(Isolate* isolate,
8888

8989
// 10. Let r be ResolveLocale(%ListFormat%.[[AvailableLocales]],
9090
// requestedLocales, opt, undefined, localeData).
91-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
92-
Intl::ResolveLocale(isolate, JSListFormat::GetAvailableLocales(),
93-
requested_locales, matcher, {});
94-
if (maybe_resolve_locale.IsNothing()) {
91+
Intl::ResolvedLocale r;
92+
if (!Intl::ResolveLocale(isolate, JSListFormat::GetAvailableLocales(),
93+
requested_locales, matcher, {})
94+
.To(&r)) {
9595
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
9696
}
97-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
97+
9898
DirectHandle<String> locale_str =
9999
isolate->factory()->NewStringFromAsciiChecked(r.locale.c_str());
100100

chromium/v8/src/objects/js-number-format.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,14 +1105,12 @@ MaybeHandle<JSNumberFormat> JSNumberFormat::New(Isolate* isolate,
11051105
// 10. Let r be ResolveLocale(%NumberFormat%.[[AvailableLocales]],
11061106
// requestedLocales, opt, %NumberFormat%.[[RelevantExtensionKeys]],
11071107
// localeData).
1108-
std::set<std::string> relevant_extension_keys{"nu"};
1109-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
1110-
Intl::ResolveLocale(isolate, JSNumberFormat::GetAvailableLocales(),
1111-
requested_locales, matcher, relevant_extension_keys);
1112-
if (maybe_resolve_locale.IsNothing()) {
1108+
Intl::ResolvedLocale r;
1109+
if (!Intl::ResolveLocale(isolate, JSNumberFormat::GetAvailableLocales(),
1110+
requested_locales, matcher, {"nu"})
1111+
.To(&r)) {
11131112
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
11141113
}
1115-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
11161114

11171115
icu::Locale icu_locale = r.icu_locale;
11181116
UErrorCode status = U_ZERO_ERROR;

chromium/v8/src/objects/js-plural-rules.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,12 @@ MaybeHandle<JSPluralRules> JSPluralRules::New(Isolate* isolate,
105105
// 11. Let r be ResolveLocale(%PluralRules%.[[AvailableLocales]],
106106
// requestedLocales, opt, %PluralRules%.[[RelevantExtensionKeys]],
107107
// localeData).
108-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
109-
Intl::ResolveLocale(isolate, JSPluralRules::GetAvailableLocales(),
110-
requested_locales, matcher, {});
111-
if (maybe_resolve_locale.IsNothing()) {
108+
Intl::ResolvedLocale r;
109+
if (!Intl::ResolveLocale(isolate, JSPluralRules::GetAvailableLocales(),
110+
requested_locales, matcher, {})
111+
.To(&r)) {
112112
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
113113
}
114-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
115114
DirectHandle<String> locale_str =
116115
isolate->factory()->NewStringFromAsciiChecked(r.locale.c_str());
117116

chromium/v8/src/objects/js-relative-time-format.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,12 @@ MaybeHandle<JSRelativeTimeFormat> JSRelativeTimeFormat::New(
109109
// ResolveLocale(%RelativeTimeFormat%.[[AvailableLocales]],
110110
// requestedLocales, opt,
111111
// %RelativeTimeFormat%.[[RelevantExtensionKeys]], localeData).
112-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
113-
Intl::ResolveLocale(isolate, JSRelativeTimeFormat::GetAvailableLocales(),
114-
requested_locales, matcher, {"nu"});
115-
if (maybe_resolve_locale.IsNothing()) {
112+
Intl::ResolvedLocale r;
113+
if (!Intl::ResolveLocale(isolate, JSRelativeTimeFormat::GetAvailableLocales(),
114+
requested_locales, matcher, {"nu"})
115+
.To(&r)) {
116116
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
117117
}
118-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
119118

120119
UErrorCode status = U_ZERO_ERROR;
121120

chromium/v8/src/objects/js-segmenter.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ MaybeHandle<JSSegmenter> JSSegmenter::New(Isolate* isolate,
5454

5555
// 11. Let r be ResolveLocale(%Segmenter%.[[AvailableLocales]],
5656
// requestedLocales, opt, %Segmenter%.[[RelevantExtensionKeys]]).
57-
Maybe<Intl::ResolvedLocale> maybe_resolve_locale =
58-
Intl::ResolveLocale(isolate, JSSegmenter::GetAvailableLocales(),
59-
requested_locales, matcher, {});
60-
if (maybe_resolve_locale.IsNothing()) {
57+
Intl::ResolvedLocale r;
58+
if (!Intl::ResolveLocale(isolate, JSSegmenter::GetAvailableLocales(),
59+
requested_locales, matcher, {})
60+
.To(&r)) {
6161
THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kIcuError));
6262
}
63-
Intl::ResolvedLocale r = maybe_resolve_locale.FromJust();
6463

6564
// 12. Set segmenter.[[Locale]] to the value of r.[[locale]].
6665
DirectHandle<String> locale_str =

0 commit comments

Comments
 (0)