Skip to content

Commit d5cbc56

Browse files
authored
Improve checksum validation in DateTimeNames (#6493)
#6063
1 parent 1262ac1 commit d5cbc56

File tree

3 files changed

+231
-34
lines changed

3 files changed

+231
-34
lines changed

components/datetime/src/neo.rs

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,16 @@ where
280280
L: DecimalFormatterLoader,
281281
{
282282
let names = RawDateTimeNames::new_without_number_formatting();
283-
Self::try_new_internal_with_names(provider, provider, loader, prefs, field_set, names)
284-
.map_err(|e| e.0)
283+
Self::try_new_internal_with_names(
284+
provider,
285+
provider,
286+
loader,
287+
prefs,
288+
field_set,
289+
names,
290+
DateTimeNamesMetadata::new_empty(), // OK: this is a constructor
291+
)
292+
.map_err(|e| e.0)
285293
}
286294

287295
#[allow(clippy::result_large_err)] // returning ownership of an argument to the caller
@@ -292,7 +300,14 @@ where
292300
prefs: DateTimeFormatterPreferences,
293301
field_set: CompositeFieldSet,
294302
mut names: RawDateTimeNames<FSet>,
295-
) -> Result<Self, (DateTimeFormatterLoadError, RawDateTimeNames<FSet>)>
303+
mut names_metadata: DateTimeNamesMetadata,
304+
) -> Result<
305+
Self,
306+
(
307+
DateTimeFormatterLoadError,
308+
(RawDateTimeNames<FSet>, DateTimeNamesMetadata),
309+
),
310+
>
296311
where
297312
P0: ?Sized + AllFixedCalendarPatternDataMarkers<C, FSet>,
298313
P1: ?Sized + AllFixedCalendarFormattingDataMarkers<C, FSet>,
@@ -307,7 +322,7 @@ where
307322
);
308323
let selection = match selection {
309324
Ok(selection) => selection,
310-
Err(e) => return Err((DateTimeFormatterLoadError::Data(e), names)),
325+
Err(e) => return Err((DateTimeFormatterLoadError::Data(e), (names, names_metadata))),
311326
};
312327
let result = names.load_for_pattern(
313328
&<FSet::D as TypedDateDataMarkers<C>>::YearNamesV1::bind(provider),
@@ -328,10 +343,16 @@ where
328343
loader, // fixed decimal formatter
329344
prefs,
330345
selection.pattern_items_for_data_loading(),
346+
&mut names_metadata,
331347
);
332348
match result {
333349
Ok(()) => (),
334-
Err(e) => return Err((DateTimeFormatterLoadError::Names(e), names)),
350+
Err(e) => {
351+
return Err((
352+
DateTimeFormatterLoadError::Names(e),
353+
(names, names_metadata),
354+
))
355+
}
335356
};
336357
Ok(Self {
337358
selection,
@@ -561,12 +582,21 @@ where
561582
let calendar = FormattableAnyCalendarLoader::load(loader, kind)?;
562583
let names = RawDateTimeNames::new_without_number_formatting();
563584
Self::try_new_internal_with_calendar_and_names(
564-
provider, provider, loader, prefs, field_set, calendar, names,
585+
provider,
586+
provider,
587+
loader,
588+
prefs,
589+
field_set,
590+
calendar,
591+
names,
592+
DateTimeNamesMetadata::new_empty(), // OK: this is a constructor
565593
)
566594
.map_err(|e| e.0)
567595
}
568596

569597
#[allow(clippy::result_large_err)] // returning ownership of an argument to the caller
598+
#[allow(clippy::too_many_arguments)] // internal function with lots of generics
599+
#[allow(clippy::type_complexity)] // return type has all the parts inside
570600
pub(crate) fn try_new_internal_with_calendar_and_names<P0, P1, L>(
571601
provider_p: &P0,
572602
provider: &P1,
@@ -575,11 +605,16 @@ where
575605
field_set: CompositeFieldSet,
576606
calendar: FormattableAnyCalendar,
577607
mut names: RawDateTimeNames<FSet>,
608+
mut names_metadata: DateTimeNamesMetadata,
578609
) -> Result<
579610
Self,
580611
(
581612
DateTimeFormatterLoadError,
582-
(FormattableAnyCalendar, RawDateTimeNames<FSet>),
613+
(
614+
FormattableAnyCalendar,
615+
RawDateTimeNames<FSet>,
616+
DateTimeNamesMetadata,
617+
),
583618
),
584619
>
585620
where
@@ -599,7 +634,12 @@ where
599634
);
600635
let selection = match selection {
601636
Ok(selection) => selection,
602-
Err(e) => return Err((DateTimeFormatterLoadError::Data(e), (calendar, names))),
637+
Err(e) => {
638+
return Err((
639+
DateTimeFormatterLoadError::Data(e),
640+
(calendar, names, names_metadata),
641+
))
642+
}
603643
};
604644
let result = names.load_for_pattern(
605645
&FormattableAnyCalendarNamesLoader::<<FSet::D as DateDataMarkers>::Year, _>::new(
@@ -626,10 +666,16 @@ where
626666
loader, // fixed decimal formatter
627667
prefs,
628668
selection.pattern_items_for_data_loading(),
669+
&mut names_metadata,
629670
);
630671
match result {
631672
Ok(()) => (),
632-
Err(e) => return Err((DateTimeFormatterLoadError::Names(e), (calendar, names))),
673+
Err(e) => {
674+
return Err((
675+
DateTimeFormatterLoadError::Names(e),
676+
(calendar, names, names_metadata),
677+
))
678+
}
633679
};
634680
Ok(Self {
635681
selection,

components/datetime/src/pattern/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub use formatter::DateTimePatternFormatter;
2020
pub use formatter::FormattedDateTimePattern;
2121
use icu_pattern::SinglePlaceholderPattern;
2222
pub use names::DateTimeNames;
23+
pub(crate) use names::DateTimeNamesMetadata;
2324
pub use names::DayPeriodNameLength;
2425
pub use names::FixedCalendarDateTimeNames;
2526
pub use names::MonthNameLength;

0 commit comments

Comments
 (0)