diff --git a/src/objects/js-locale.cc b/src/objects/js-locale.cc index 98ce154336..6c3f284e71 100644 --- a/src/objects/js-locale.cc +++ b/src/objects/js-locale.cc @@ -425,8 +425,13 @@ MaybeHandle JSLocale::Maximize(Isolate* isolate, // Base name is not changed result = source; } - DCHECK(U_SUCCESS(status)); - DCHECK(!result.isBogus()); + if (U_FAILURE(status) || result.isBogus()) { + // Due to https://unicode-org.atlassian.net/browse/ICU-21639 + // Valid but super long locale will fail. Just throw here for now. + THROW_NEW_ERROR(isolate, + NewRangeError(MessageTemplate::kLocaleBadParameters), + JSLocale); + } return Construct(isolate, result); } @@ -455,8 +460,13 @@ MaybeHandle JSLocale::Minimize(Isolate* isolate, // Base name is not changed result = source; } - DCHECK(U_SUCCESS(status)); - DCHECK(!result.isBogus()); + if (U_FAILURE(status) || result.isBogus()) { + // Due to https://unicode-org.atlassian.net/browse/ICU-21639 + // Valid but super long locale will fail. Just throw here for now. + THROW_NEW_ERROR(isolate, + NewRangeError(MessageTemplate::kLocaleBadParameters), + JSLocale); + } return Construct(isolate, result); } diff --git a/test/intl/regress-1224869.js b/test/intl/regress-1224869.js new file mode 100644 index 0000000000..2d30ac5dc5 --- /dev/null +++ b/test/intl/regress-1224869.js @@ -0,0 +1,18 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var l = new Intl.Locale("en-US-4106-4104-4102-4100-4098-4096-4094-4092-4090-4088-4086-4084-4082-4080-4078-4076-4074-4072-4070-4068-4066-4064-4062-4060-4058-4056-4054-4052-4050-4048-4049"); + +// Ensure won't DCHECK in debug build +try { + l.maximize(); +} catch(e) { +} + +l2 = new Intl.Locale("en-US-4106-4104-4102-4100-4098-4096-4094-4092-4090-4088-4086-4084-4082-4080-4078-4076-4074-4072-4070-4068-4066-4064-4062-4060-4058-4056-4054-4052-4050-4048-4049"); +// Ensure won't DCHECK in debug build +try { + l2.minimize(); +} catch(e) { +}