Skip to content

Commit 4829f32

Browse files
committed
Restrict features in wildcards
The algorithm for dealing with Unicode property wildcards is to wrap the user-supplied pattern with /miaa. We don't want the user to be able to override the /m and /aa parts. Modifiers that are only specifiable as a modifier in a qr or similar op (like /gc) can't be included in things like (?gc). These normally incur a warning that they are ignored, but the texts of those warnings are misleading when using wildcards, so I chose to just make them illegal. Of course that could be changed to having custom useful warning texts, but I didn't think it was worth it. I also chose to forbid recursion of using nested \p{}, just from fear that it might lead to issues down the road, and it really isn't useful for this limited universe of strings to match against. Because wildcards currently can't handle '}' inside them, only the single letter \p,\P are valid anyway. Similarly, I forbid the '*' quantifier to make it harder for the constructed subpattern to take forever to make any progress and decide to halt. Again, using it would be overkill on the universe of possible match strings.
1 parent 8094711 commit 4829f32

11 files changed

+159
-15
lines changed

charclass_invlists.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419846,7 +419846,7 @@ static const U8 WB_table[23][23] = {
419846419846
* baba9dfc133e3cb770a89aaf0973b1341fa61c2da6c176baf6428898b3b568d8 lib/unicore/extracted/DLineBreak.txt
419847419847
* 6d4a8c945dd7db83ed617cbb7d937de7f4ecf016ff22970d846e996a7c9a2a5d lib/unicore/extracted/DNumType.txt
419848419848
* 5b7c14380d5cceeaffcfbc18db1ed936391d2af2d51f5a41f1a17b692c77e59b lib/unicore/extracted/DNumValues.txt
419849-
* 93f508a690aa8949f213d50b573710f0b4a4e843c17283938035ecf19e0220e2 lib/unicore/mktables
419849+
* a3f3caba903e4d39b6c7aaa7ea4d3a739e745b010ad51cf0e05f34ffa0ac2c04 lib/unicore/mktables
419850419850
* 50b85a67451145545a65cea370dab8d3444fbfe07e9c34cef560c5b7da9d3eef lib/unicore/version
419851419851
* 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
419852419852
* 6bbad21de0848e0236b02f34f5fa0edd3cdae9ba8173cc9469a5513936b9e728 regen/mk_PL_charclass.pl

lib/unicore/mktables

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19251,6 +19251,8 @@ Error('\p{InKana}'); # 'Kana' is not a block so InKana shouldn't compile
1925119251
# Test_WB()
1925219252
Test_WB("$breakable 0020 $breakable 0020 $breakable 0308 $breakable");
1925319253
Test_LB("$nobreak 200B $nobreak 0020 $nobreak 0020 $breakable 2060 $breakable");
19254+
Expect(1, ord(" "), '\p{gc=:(?aa)s:}', ""); # /aa is valid
19255+
Expect(1, ord(" "), '\p{gc=:(?-s)s:}', ""); # /-s is valid
1925419256
EOF_CODE
1925519257

1925619258
# Sort these so get results in same order on different runs of this

lib/unicore/uni_keywords.pl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,7 @@
12951295
# baba9dfc133e3cb770a89aaf0973b1341fa61c2da6c176baf6428898b3b568d8 lib/unicore/extracted/DLineBreak.txt
12961296
# 6d4a8c945dd7db83ed617cbb7d937de7f4ecf016ff22970d846e996a7c9a2a5d lib/unicore/extracted/DNumType.txt
12971297
# 5b7c14380d5cceeaffcfbc18db1ed936391d2af2d51f5a41f1a17b692c77e59b lib/unicore/extracted/DNumValues.txt
1298-
# 93f508a690aa8949f213d50b573710f0b4a4e843c17283938035ecf19e0220e2 lib/unicore/mktables
1298+
# a3f3caba903e4d39b6c7aaa7ea4d3a739e745b010ad51cf0e05f34ffa0ac2c04 lib/unicore/mktables
12991299
# 50b85a67451145545a65cea370dab8d3444fbfe07e9c34cef560c5b7da9d3eef lib/unicore/version
13001300
# 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
13011301
# 6bbad21de0848e0236b02f34f5fa0edd3cdae9ba8173cc9469a5513936b9e728 regen/mk_PL_charclass.pl

op.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ struct pmop {
372372
#define PMf_IS_QR (1U<<(PMf_BASE_SHIFT+15))
373373
#define PMf_USE_RE_EVAL (1U<<(PMf_BASE_SHIFT+16)) /* use re'eval' in scope */
374374

375+
/* Means that this is a subpattern being compiled while processing a \p{}
376+
* wildcard. This isn't called from op.c, but it is passed as a pm flag. */
377+
#define PMf_WILDCARD (1U<<(PMf_BASE_SHIFT+17))
378+
375379
/* See comments at the beginning of these defines about adding bits. The
376380
* highest bit position should be used, so that if PMf_BASE_SHIFT gets
377381
* increased, the #error below will be triggered so that you will be reminded

pod/perldelta.pod

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ XXX For a release on a stable branch, this section aspires to be:
7272

7373
[ List each incompatible change as a =head2 entry ]
7474

75+
=head2 Certain pattern matching features are now prohibited in compiling
76+
Unicode property value wildcard subpatterns
77+
78+
These few features are either inappropriate or interfere with the
79+
algorithm used to accomplish this task. The complete list is in
80+
L<perlunicode/Wildcards in Property Values>.
81+
7582
=head2 Stop pretending C<POSIX::mbstowcs> and C<POSIX::wcstombs> are
7683
supported
7784

pod/perldiag.pod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7331,6 +7331,15 @@ This was deprecated in Perl 5.004, and was made fatal in Perl 5.28.
73317331
(F) You attempted to use a feature of printf that is accessible from
73327332
only C. This usually means there's a better way to do it in Perl.
73337333

7334+
=item Use of %s is not allowed in Unicode property wildcard
7335+
subpatterns in regex; marked by S<<-- HERE> in m/%s/
7336+
7337+
(F) You were using a wildcard subpattern a Unicode property value, and
7338+
the subpattern contained something that is illegal. Not all regular
7339+
expression capabilities are legal in such subpatterns, and this is one.
7340+
Rewrite your subppattern to not use the offending construct.
7341+
See L<perlunicode/Wildcards in Property Values>.
7342+
73347343
=item Use of -l on filehandle%s
73357344

73367345
(W io) A filehandle represents an opened file, and when you opened the file

pod/perlunicode.pod

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,14 +1027,27 @@ C<$/>.
10271027
No modifiers may follow the final delimiter. Instead, use
10281028
L<perlre/(?adlupimnsx-imnsx)> and/or
10291029
L<perlre/(?adluimnsx-imnsx:pattern)> to specify modifiers.
1030+
However, certain modifiers are illegal in your wildcard subpattern.
1031+
The only character set modifier specifiable is C</aa>;
1032+
any other character set, and C<-m>, and C<p>, and C<s> are all illegal.
1033+
Specifying modifiers like C<qr/.../gc> that aren't legal in the
1034+
C<(?...)> notation normally raise a warning, but with wildcard
1035+
subpatterns, their use is an error. The C<m> modifier is ineffective;
1036+
everything that matches will be a single line.
1037+
1038+
By default, your pattern is matched case-insensitively, as if C</i> had
1039+
been specified. You can change this by saying C<(?-i)> in your pattern.
1040+
1041+
There are also certain operations that are illegal. You can't nest
1042+
C<\p{...}> and C<\P{...}> calls within a wildcard subpattern, and C<\G>
1043+
doesn't make sense, so is also prohibited.
1044+
1045+
And the C<*> quantifier (or its equivalent C<(0,}>) is illegal.
10301046

10311047
This feature is not available when the left-hand side is prefixed by
10321048
C<Is_>, nor for any form that is marked as "Discouraged" in
10331049
L<perluniprops/Discouraged>.
10341050

1035-
By default, your pattern is matched case-insensitively, as if C</i> had
1036-
been specified. You can change this by saying C<(?-i)> in your pattern.
1037-
10381051
This experimental feature has been added to begin to implement
10391052
L<https://www.unicode.org/reports/tr18/#Wildcard_Properties>. Using it
10401053
will raise a (default-on) warning in the

regcharclass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2247,7 +2247,7 @@
22472247
* baba9dfc133e3cb770a89aaf0973b1341fa61c2da6c176baf6428898b3b568d8 lib/unicore/extracted/DLineBreak.txt
22482248
* 6d4a8c945dd7db83ed617cbb7d937de7f4ecf016ff22970d846e996a7c9a2a5d lib/unicore/extracted/DNumType.txt
22492249
* 5b7c14380d5cceeaffcfbc18db1ed936391d2af2d51f5a41f1a17b692c77e59b lib/unicore/extracted/DNumValues.txt
2250-
* 93f508a690aa8949f213d50b573710f0b4a4e843c17283938035ecf19e0220e2 lib/unicore/mktables
2250+
* a3f3caba903e4d39b6c7aaa7ea4d3a739e745b010ad51cf0e05f34ffa0ac2c04 lib/unicore/mktables
22512251
* 50b85a67451145545a65cea370dab8d3444fbfe07e9c34cef560c5b7da9d3eef lib/unicore/version
22522252
* 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
22532253
* f9a393e7add8c7c2728356473ce5b52246d51295b2da0c48fb6f0aa21799e2bb regen/regcharclass.pl

regcomp.c

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7399,7 +7399,7 @@ S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx)
73997399
*
74007400
* pm_flags contains the PMf_* flags, typically based on those from the
74017401
* pm_flags field of the related PMOP. Currently we're only interested in
7402-
* PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL.
7402+
* PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL, PMf_WILDCARD.
74037403
*
74047404
* For many years this code had an initial sizing pass that calculated
74057405
* (sometimes incorrectly, leading to security holes) the size needed for the
@@ -10765,6 +10765,24 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1076510765
/* && memCHRs("iogcmsx", *RExC_parse) */
1076610766
/* (?g), (?gc) and (?o) are useless here
1076710767
and must be globally applied -- japhy */
10768+
if ((RExC_pm_flags & PMf_WILDCARD)) {
10769+
if (flagsp == & negflags) {
10770+
if (*RExC_parse == 'm') {
10771+
RExC_parse++;
10772+
/* diag_listed_as: Use of %s is not allowed in Unicode
10773+
property wildcard subpatterns in regex; marked by <--
10774+
HERE in m/%s/ */
10775+
vFAIL("Use of modifier '-m' is not allowed in Unicode"
10776+
" property wildcard subpatterns");
10777+
}
10778+
}
10779+
else {
10780+
if (*RExC_parse == 's') {
10781+
goto modifier_illegal_in_wildcard;
10782+
}
10783+
}
10784+
}
10785+
1076810786
switch (*RExC_parse) {
1076910787

1077010788
/* Code for the imsxn flags */
@@ -10845,6 +10863,10 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1084510863
*(RExC_parse - 1));
1084610864
NOT_REACHED; /*NOTREACHED*/
1084710865
case GLOBAL_PAT_MOD: /* 'g' */
10866+
if (RExC_pm_flags & PMf_WILDCARD) {
10867+
goto modifier_illegal_in_wildcard;
10868+
}
10869+
/*FALLTHROUGH*/
1084810870
case ONCE_PAT_MOD: /* 'o' */
1084910871
if (ckWARN(WARN_REGEXP)) {
1085010872
const I32 wflagbit = *RExC_parse == 'o'
@@ -10866,6 +10888,9 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1086610888
break;
1086710889

1086810890
case CONTINUE_PAT_MOD: /* 'c' */
10891+
if (RExC_pm_flags & PMf_WILDCARD) {
10892+
goto modifier_illegal_in_wildcard;
10893+
}
1086910894
if (ckWARN(WARN_REGEXP)) {
1087010895
if (! (wastedflags & WASTED_C) ) {
1087110896
wastedflags |= WASTED_GC;
@@ -10880,6 +10905,9 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1088010905
}
1088110906
break;
1088210907
case KEEPCOPY_PAT_MOD: /* 'p' */
10908+
if (RExC_pm_flags & PMf_WILDCARD) {
10909+
goto modifier_illegal_in_wildcard;
10910+
}
1088310911
if (flagsp == &negflags) {
1088410912
ckWARNreg(RExC_parse + 1,"Useless use of (?-p)");
1088510913
} else {
@@ -10900,6 +10928,18 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1090010928
case ':':
1090110929
case ')':
1090210930

10931+
if ( (RExC_pm_flags & PMf_WILDCARD)
10932+
&& cs != REGEX_ASCII_MORE_RESTRICTED_CHARSET)
10933+
{
10934+
RExC_parse++;
10935+
/* diag_listed_as: Use of %s is not allowed in Unicode
10936+
property wildcard subpatterns in regex; marked by <--
10937+
HERE in m/%s/ */
10938+
vFAIL2("Use of modifier '%c' is not allowed in Unicode"
10939+
" property wildcard subpatterns",
10940+
has_charset_modifier);
10941+
}
10942+
1090310943
if ((posflags & (RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE)) == RXf_PMf_EXTENDED) {
1090410944
negflags |= RXf_PMf_EXTENDED_MORE;
1090510945
}
@@ -10925,6 +10965,13 @@ S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
1092510965
}
1092610966

1092710967
vFAIL("Sequence (?... not terminated");
10968+
10969+
modifier_illegal_in_wildcard:
10970+
RExC_parse++;
10971+
/* diag_listed_as: Use of %s is not allowed in Unicode property wildcard
10972+
subpatterns in regex; marked by <-- HERE in m/%s/ */
10973+
vFAIL2("Use of modifier '%c' is not allowed in Unicode property wildcard"
10974+
" subpatterns", *(RExC_parse - 1));
1092810975
}
1092910976

1093010977
/*
@@ -12533,6 +12580,23 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
1253312580
do_curly:
1253412581
if ((flags&SIMPLE)) {
1253512582
if (min == 0 && max == REG_INFTY) {
12583+
12584+
/* Going from 0..inf is currently forbidden in wildcard
12585+
* subpatterns. The only reason is to make it harder to
12586+
* write patterns that take a long long time to halt, and
12587+
* because the use of this construct isn't necessary in
12588+
* matching Unicode property values */
12589+
if (RExC_pm_flags & PMf_WILDCARD) {
12590+
RExC_parse++;
12591+
/* diag_listed_as: Use of %s is not allowed in Unicode
12592+
property wildcard subpatterns in regex; marked by
12593+
<-- HERE in m/%s/ */
12594+
vFAIL("Use of quantifier '*' is not allowed in"
12595+
" Unicode property wildcard subpatterns");
12596+
/* Note, don't need to worry about {0,}, as a '}' isn't
12597+
* legal at all in wildcards, so wouldn't get this far
12598+
* */
12599+
}
1253612600
reginsert(pRExC_state, STAR, ret, depth+1);
1253712601
MARK_NAUGHTY(4);
1253812602
RExC_seen |= REG_UNBOUNDED_QUANTIFIER_SEEN;
@@ -13404,13 +13468,26 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
1340413468
/* Special Escapes */
1340513469
case 'A':
1340613470
RExC_seen_zerolen++;
13407-
ret = reg_node(pRExC_state, SBOL);
13408-
/* SBOL is shared with /^/ so we set the flags so we can tell
13409-
* /\A/ from /^/ in split. */
13410-
FLAGS(REGNODE_p(ret)) = 1;
13471+
if (RExC_pm_flags & PMf_WILDCARD) {
13472+
ret = reg_node(pRExC_state, MBOL);
13473+
}
13474+
else {
13475+
ret = reg_node(pRExC_state, SBOL);
13476+
/* SBOL is shared with /^/ so we set the flags so we can tell
13477+
* /\A/ from /^/ in split. */
13478+
FLAGS(REGNODE_p(ret)) = 1;
13479+
}
1341113480
*flagp |= SIMPLE;
1341213481
goto finish_meta_pat;
1341313482
case 'G':
13483+
if (RExC_pm_flags & PMf_WILDCARD) {
13484+
RExC_parse++;
13485+
/* diag_listed_as: Use of %s is not allowed in Unicode property
13486+
wildcard subpatterns in regex; marked by <-- HERE in m/%s/
13487+
*/
13488+
vFAIL("Use of '\\G' is not allowed in Unicode property"
13489+
" wildcard subpatterns");
13490+
}
1341413491
ret = reg_node(pRExC_state, GPOS);
1341513492
RExC_seen |= REG_GPOS_SEEN;
1341613493
*flagp |= SIMPLE;
@@ -13432,12 +13509,22 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
1343213509
vFAIL("\\K not permitted in lookahead/lookbehind");
1343313510
}
1343413511
case 'Z':
13435-
ret = reg_node(pRExC_state, SEOL);
13512+
if (RExC_pm_flags & PMf_WILDCARD) {
13513+
ret = reg_node(pRExC_state, MEOL);
13514+
}
13515+
else {
13516+
ret = reg_node(pRExC_state, SEOL);
13517+
}
1343613518
*flagp |= SIMPLE;
1343713519
RExC_seen_zerolen++; /* Do not optimize RE away */
1343813520
goto finish_meta_pat;
1343913521
case 'z':
13440-
ret = reg_node(pRExC_state, EOS);
13522+
if (RExC_pm_flags & PMf_WILDCARD) {
13523+
ret = reg_node(pRExC_state, MEOL);
13524+
}
13525+
else {
13526+
ret = reg_node(pRExC_state, EOS);
13527+
}
1344113528
*flagp |= SIMPLE;
1344213529
RExC_seen_zerolen++; /* Do not optimize RE away */
1344313530
goto finish_meta_pat;
@@ -17457,6 +17544,15 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
1745717544
{
1745817545
char *e;
1745917546

17547+
if (RExC_pm_flags & PMf_WILDCARD) {
17548+
RExC_parse++;
17549+
/* diag_listed_as: Use of %s is not allowed in Unicode
17550+
property wildcard subpatterns in regex; marked by <--
17551+
HERE in m/%s/ */
17552+
vFAIL3("Use of '\\%c%c' is not allowed in Unicode property"
17553+
" wildcard subpatterns", value, *(RExC_parse - 1));
17554+
}
17555+
1746017556
/* \p means they want Unicode semantics */
1746117557
REQUIRE_UNI_RULES(flagp, 0);
1746217558

@@ -22818,7 +22914,7 @@ STATIC REGEXP *
2281822914
S_compile_wildcard(pTHX_ const char * name, const STRLEN len,
2281922915
const bool ignore_case)
2282022916
{
22821-
U32 flags = PMf_MULTILINE;
22917+
U32 flags = PMf_MULTILINE|PMf_WILDCARD;
2282222918
REGEXP * subpattern_re;
2282322919

2282422920
PERL_ARGS_ASSERT_COMPILE_WILDCARD;

t/re/reg_mesg.t

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,18 @@ my @death =
319319
'/(?[\N{KEYCAP DIGIT NINE}/' => '\N{} here is restricted to one character {#} m/(?[\\N{U+39.FE0F.20E3{#}}/', # [perl #133988]
320320
'/0000000000000000[\N{U+0.00}0000/' => 'Unmatched [ {#} m/0000000000000000[{#}\N{U+0.00}0000/', # [perl #134059]
321321
'/\p{nv=\b5\b}/' => 'Can\'t find Unicode property definition "nv=\\b5\\b" {#} m/\\p{nv=\\b5\\b}{#}/',
322+
'/\p{nv=:(?g)10:}/' => 'Use of modifier \'g\' is not allowed in Unicode property wildcard subpatterns {#} m/(?g{#})10/',
323+
'/\p{gc=:L*:}/' => 'Use of quantifier \'*\' is not allowed in Unicode property wildcard subpatterns {#} m/L*{#}/',
324+
'/\p{gc=:L\G:}/' => 'Use of \'\G\' is not allowed in Unicode property wildcard subpatterns {#} m/L\G{#}/',
325+
'/\p{gc=:(?a)L:}/' => 'Use of modifier \'a\' is not allowed in Unicode property wildcard subpatterns {#} m/(?a){#}L/',
326+
'/\p{gc=:(?u)L:}/' => 'Use of modifier \'u\' is not allowed in Unicode property wildcard subpatterns {#} m/(?u){#}L/',
327+
'/\p{gc=:(?d)L:}/' => 'Use of modifier \'d\' is not allowed in Unicode property wildcard subpatterns {#} m/(?d){#}L/',
328+
'/\p{gc=:(?l)L:}/' => 'Use of modifier \'l\' is not allowed in Unicode property wildcard subpatterns {#} m/(?l){#}L/',
329+
'/\p{gc=:(?-m)L:}/' => 'Use of modifier \'-m\' is not allowed in Unicode property wildcard subpatterns {#} m/(?-m{#})L/',
330+
'/\p{gc=:\pS:}/' => 'Use of \'\\pS\' is not allowed in Unicode property wildcard subpatterns {#} m/\\pS{#}/',
331+
'/\p{gc=:\PS:}/' => 'Use of \'\\PS\' is not allowed in Unicode property wildcard subpatterns {#} m/\\PS{#}/',
332+
'/\p{gc=:[\pS]:}/' => 'Use of \'\\pS\' is not allowed in Unicode property wildcard subpatterns {#} m/[\\pS{#}]/',
333+
'/\p{gc=:[\PS]:}/' => 'Use of \'\\PS\' is not allowed in Unicode property wildcard subpatterns {#} m/[\\PS{#}]/',
322334
);
323335

324336
# These are messages that are death under 'use re "strict"', and may or may
@@ -731,6 +743,7 @@ for my $strict ("", "use re 'strict';") {
731743
else {
732744
no warnings 'experimental::regex_sets';
733745
no warnings 'experimental::re_strict';
746+
no warnings 'experimental::uniprop_wildcards';
734747

735748
warning_is(sub {
736749
my $meaning_of_life;

uni_keywords.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7540,7 +7540,7 @@ MPH_VALt match_uniprop( const unsigned char * const key, const U16 key_len ) {
75407540
* baba9dfc133e3cb770a89aaf0973b1341fa61c2da6c176baf6428898b3b568d8 lib/unicore/extracted/DLineBreak.txt
75417541
* 6d4a8c945dd7db83ed617cbb7d937de7f4ecf016ff22970d846e996a7c9a2a5d lib/unicore/extracted/DNumType.txt
75427542
* 5b7c14380d5cceeaffcfbc18db1ed936391d2af2d51f5a41f1a17b692c77e59b lib/unicore/extracted/DNumValues.txt
7543-
* 93f508a690aa8949f213d50b573710f0b4a4e843c17283938035ecf19e0220e2 lib/unicore/mktables
7543+
* a3f3caba903e4d39b6c7aaa7ea4d3a739e745b010ad51cf0e05f34ffa0ac2c04 lib/unicore/mktables
75447544
* 50b85a67451145545a65cea370dab8d3444fbfe07e9c34cef560c5b7da9d3eef lib/unicore/version
75457545
* 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
75467546
* 6bbad21de0848e0236b02f34f5fa0edd3cdae9ba8173cc9469a5513936b9e728 regen/mk_PL_charclass.pl

0 commit comments

Comments
 (0)