forked from rpms/glibc
Import glibc-2.34-27.fc35 from f35
* Mon Feb 28 2022 Florian Weimer <fweimer@redhat.com> - 2.34-27 - Fix regression (ldd crash) during dependency sorting in ld.so (#2058230) * Mon Feb 28 2022 Florian Weimer <fweimer@redhat.com> - 2.34-26 - Fix localedef compilation of C.UTF-8 (empty LC_MONETARY keywords) (#2058224) Resolves: #2060777 Resolves: #2060778
This commit is contained in:
parent
63da4f7958
commit
e5be379cb0
296
glibc-rh2058224-1.patch
Normal file
296
glibc-rh2058224-1.patch
Normal file
@ -0,0 +1,296 @@
|
||||
commit 2ab8b74567dc0a9a3c98696e6444881997dd6c49
|
||||
Author: Carlos O'Donell <carlos@redhat.com>
|
||||
Date: Thu Feb 3 16:51:59 2022 -0500
|
||||
|
||||
localedef: Update LC_MONETARY handling (Bug 28845)
|
||||
|
||||
ISO C17, POSIX Issue 7, and ISO 30112 all allow the char*
|
||||
types to be empty strings i.e. "", integer or char values to
|
||||
be -1 or CHAR_MAX respectively, with the exception of
|
||||
decimal_point which must be non-empty in ISO C. Note that
|
||||
the defaults for mon_grouping vary, but are functionaly
|
||||
equivalent e.g. "\177" (no further grouping reuqired) vs.
|
||||
"" (no grouping defined for all groups).
|
||||
|
||||
We include a broad comment talking about harmonizing ISO C,
|
||||
POSIX, ISO 30112, and the default C/POSIX locale for glibc.
|
||||
|
||||
We reorder all setting based on locale/categories.def order.
|
||||
|
||||
We soften all missing definitions from errors to warnings when
|
||||
defaults exist.
|
||||
|
||||
Given that ISO C, POSIX and ISO 30112 allow the empty string
|
||||
we change LC_MONETARY handling of mon_decimal_point to allow
|
||||
the empty string. If mon_decimal_point is not defined at all
|
||||
then we pick the existing legacy glibc default value of
|
||||
<U002E> i.e. ".".
|
||||
|
||||
We also set the default for mon_thousands_sep_wc at the
|
||||
same time as mon_thousands_sep, but this is not a change in
|
||||
behaviour, it is always either a matching value or L'\0',
|
||||
but if in the future we change the default to a non-empty
|
||||
string we would need to update both at the same time.
|
||||
|
||||
Tested on x86_64 and i686 without regressions.
|
||||
Tested with install-locale-archive target.
|
||||
Tested with install-locale-files target.
|
||||
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
|
||||
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
|
||||
index 9b9a55bb4766dfcf..17a972e1a7516aa5 100644
|
||||
--- a/locale/programs/ld-monetary.c
|
||||
+++ b/locale/programs/ld-monetary.c
|
||||
@@ -197,21 +197,105 @@ No definition for %s category found"), "LC_MONETARY");
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Generally speaking there are 3 standards the define the default,
|
||||
+ warning, and error behaviour of LC_MONETARY. They are ISO/IEC TR 30112,
|
||||
+ ISO/IEC 9899:2018 (ISO C17), and POSIX.1-2017. Within 30112 we have the
|
||||
+ definition of a standard i18n FDCC-set, which for LC_MONETARY has the
|
||||
+ following default values:
|
||||
+ int_curr_symbol ""
|
||||
+ currency_symbol ""
|
||||
+ mon_decimal_point "<U002C>" i.e. ","
|
||||
+ mon_thousand_sep ""
|
||||
+ mon_grouping "\177" i.e. CHAR_MAX
|
||||
+ positive_sign ""
|
||||
+ negative_sign "<U002E>" i.e. "."
|
||||
+ int_frac_digits -1
|
||||
+ frac_digits -1
|
||||
+ p_cs_precedes -1
|
||||
+ p_sep_by_space -1
|
||||
+ n_cs_precedes -1
|
||||
+ n_sep_by_space -1
|
||||
+ p_sign_posn -1
|
||||
+ n_sign_posn -1
|
||||
+ Under 30112 a keyword that is not provided implies an empty string ""
|
||||
+ for string values or a -1 for integer values, and indicates the value
|
||||
+ is unspecified with no default implied. No errors are considered.
|
||||
+ The exception is mon_grouping which is a string with a terminating
|
||||
+ CHAR_MAX.
|
||||
+ For POSIX Issue 7 we have:
|
||||
+ https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html
|
||||
+ and again values not provided default to "" or -1, and indicate the value
|
||||
+ is not available to the locale. The exception is mon_grouping which is
|
||||
+ a string with a terminating CHAR_MAX. For the POSIX locale the values of
|
||||
+ LC_MONETARY should be:
|
||||
+ int_curr_symbol ""
|
||||
+ currency_symbol ""
|
||||
+ mon_decimal_point ""
|
||||
+ mon_thousands_sep ""
|
||||
+ mon_grouping "\177" i.e. CHAR_MAX
|
||||
+ positive_sign ""
|
||||
+ negative_sign ""
|
||||
+ int_frac_digits -1
|
||||
+ frac_digits -1
|
||||
+ p_cs_precedes -1
|
||||
+ p_sep_by_space -1
|
||||
+ n_cs_precedes -1
|
||||
+ n_sep_by_space -1
|
||||
+ p_sign_posn -1
|
||||
+ n_sign_posn -1
|
||||
+ int_p_cs_precedes -1
|
||||
+ int_p_sep_by_space -1
|
||||
+ int_n_cs_precedes -1
|
||||
+ int_n_sep_by_space -1
|
||||
+ int_p_sign_posn -1
|
||||
+ int_n_sign_posn -1
|
||||
+ Like with 30112, POSIX also considers no error if the keywords are
|
||||
+ missing, only that if the cateory as a whole is missing the referencing
|
||||
+ of the category results in unspecified behaviour.
|
||||
+ For ISO C17 there is no default value provided, but the localeconv
|
||||
+ specification in 7.11.2.1 admits that members of char * type may point
|
||||
+ to "" to indicate a value is not available or is of length zero.
|
||||
+ The exception is decimal_point (not mon_decimal_point) which must be a
|
||||
+ defined non-empty string. The values of char, which are generally
|
||||
+ mapped to integer values in 30112 and POSIX, must be non-negative
|
||||
+ numbers that map to CHAR_MAX when a value is not available in the
|
||||
+ locale.
|
||||
+ In ISO C17 for the "C" locale all values are empty strings "", or
|
||||
+ CHAR_MAX, with the exception of decimal_point which is "." (defined
|
||||
+ in LC_NUMERIC). ISO C17 makes no exception for mon_grouping like
|
||||
+ 30112 and POSIX, but a value of "" is functionally equivalent to
|
||||
+ "\177" since neither defines a grouping (though the latter terminates
|
||||
+ the grouping).
|
||||
+
|
||||
+ Lastly, we must consider the legacy C/POSIX locale that implemented
|
||||
+ as a builtin in glibc and wether a default value mapping to the
|
||||
+ C/POSIX locale may benefit the user from a compatibility perspective.
|
||||
+
|
||||
+ Thus given 30112, POSIX, ISO C, and the builtin C/POSIX locale we
|
||||
+ need to pick appropriate defaults below. */
|
||||
+
|
||||
+ /* The members of LC_MONETARY are handled in the order of their definition
|
||||
+ in locale/categories.def. Please keep them in that order. */
|
||||
+
|
||||
+ /* The purpose of TEST_ELEM is to define a default value for the fields
|
||||
+ in the category if the field was not defined in the cateory. If the
|
||||
+ category was present but we didn't see a definition for the field then
|
||||
+ we also issue a warning, otherwise the only warning you get is the one
|
||||
+ earlier when a default category is created (completely missing category).
|
||||
+ This missing field warning is glibc-specific since no standard requires
|
||||
+ this warning, but we consider it valuable to print a warning for all
|
||||
+ missing fields in the category. */
|
||||
#define TEST_ELEM(cat, initval) \
|
||||
if (monetary->cat == NULL) \
|
||||
{ \
|
||||
if (! nothing) \
|
||||
- record_error (0, 0, _("%s: field `%s' not defined"), \
|
||||
- "LC_MONETARY", #cat); \
|
||||
+ record_warning (_("%s: field `%s' not defined"), \
|
||||
+ "LC_MONETARY", #cat); \
|
||||
monetary->cat = initval; \
|
||||
}
|
||||
|
||||
+ /* Keyword: int_curr_symbol. */
|
||||
TEST_ELEM (int_curr_symbol, "");
|
||||
- TEST_ELEM (currency_symbol, "");
|
||||
- TEST_ELEM (mon_thousands_sep, "");
|
||||
- TEST_ELEM (positive_sign, "");
|
||||
- TEST_ELEM (negative_sign, "");
|
||||
-
|
||||
/* The international currency symbol must come from ISO 4217. */
|
||||
if (monetary->int_curr_symbol != NULL)
|
||||
{
|
||||
@@ -248,41 +332,63 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
|
||||
}
|
||||
}
|
||||
|
||||
- /* The decimal point must not be empty. This is not said explicitly
|
||||
- in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
|
||||
- != "". */
|
||||
+ /* Keyword: currency_symbol */
|
||||
+ TEST_ELEM (currency_symbol, "");
|
||||
+
|
||||
+ /* Keyword: mon_decimal_point */
|
||||
+ /* ISO C17 7.11.2.1.3 explicitly allows mon_decimal_point to be the
|
||||
+ empty string e.g. "". This indicates the value is not available in the
|
||||
+ current locale or is of zero length. However, if the value was never
|
||||
+ defined then we issue a warning and use a glibc-specific default. ISO
|
||||
+ 30112 in the i18n FDCC-Set uses <U002C> ",", and POSIX Issue 7 in the
|
||||
+ POSIX locale uses "". It is specific to glibc that the default is <U002E>
|
||||
+ "."; we retain this existing behaviour for backwards compatibility. */
|
||||
if (monetary->mon_decimal_point == NULL)
|
||||
{
|
||||
if (! nothing)
|
||||
- record_error (0, 0, _("%s: field `%s' not defined"),
|
||||
- "LC_MONETARY", "mon_decimal_point");
|
||||
+ record_warning (_("%s: field `%s' not defined, using defaults"),
|
||||
+ "LC_MONETARY", "mon_decimal_point");
|
||||
monetary->mon_decimal_point = ".";
|
||||
monetary->mon_decimal_point_wc = L'.';
|
||||
}
|
||||
- else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing)
|
||||
+
|
||||
+ /* Keyword: mon_thousands_sep */
|
||||
+ if (monetary->mon_thousands_sep == NULL)
|
||||
{
|
||||
- record_error (0, 0, _("\
|
||||
-%s: value for field `%s' must not be an empty string"),
|
||||
- "LC_MONETARY", "mon_decimal_point");
|
||||
+ if (! nothing)
|
||||
+ record_warning (_("%s: field `%s' not defined, using defaults"),
|
||||
+ "LC_MONETARY", "mon_thousands_sep");
|
||||
+ monetary->mon_thousands_sep = "";
|
||||
+ monetary->mon_thousands_sep_wc = L'\0';
|
||||
}
|
||||
|
||||
+ /* Keyword: mon_grouping */
|
||||
if (monetary->mon_grouping_len == 0)
|
||||
{
|
||||
if (! nothing)
|
||||
- record_error (0, 0, _("%s: field `%s' not defined"),
|
||||
- "LC_MONETARY", "mon_grouping");
|
||||
-
|
||||
+ record_warning (_("%s: field `%s' not defined"),
|
||||
+ "LC_MONETARY", "mon_grouping");
|
||||
+ /* Missing entries are given 1 element in their bytearray with
|
||||
+ a value of CHAR_MAX which indicates that "No further grouping
|
||||
+ is to be performed" (functionally equivalent to ISO C's "C"
|
||||
+ locale default of ""). */
|
||||
monetary->mon_grouping = (char *) "\177";
|
||||
monetary->mon_grouping_len = 1;
|
||||
}
|
||||
|
||||
+ /* Keyword: positive_sign */
|
||||
+ TEST_ELEM (positive_sign, "");
|
||||
+
|
||||
+ /* Keyword: negative_sign */
|
||||
+ TEST_ELEM (negative_sign, "");
|
||||
+
|
||||
#undef TEST_ELEM
|
||||
#define TEST_ELEM(cat, min, max, initval) \
|
||||
if (monetary->cat == -2) \
|
||||
{ \
|
||||
if (! nothing) \
|
||||
- record_error (0, 0, _("%s: field `%s' not defined"), \
|
||||
- "LC_MONETARY", #cat); \
|
||||
+ record_warning (_("%s: field `%s' not defined"), \
|
||||
+ "LC_MONETARY", #cat); \
|
||||
monetary->cat = initval; \
|
||||
} \
|
||||
else if ((monetary->cat < min || monetary->cat > max) \
|
||||
@@ -301,16 +407,11 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
|
||||
TEST_ELEM (p_sign_posn, -1, 4, -1);
|
||||
TEST_ELEM (n_sign_posn, -1, 4, -1);
|
||||
|
||||
- /* The non-POSIX.2 extensions are optional. */
|
||||
- if (monetary->duo_int_curr_symbol == NULL)
|
||||
- monetary->duo_int_curr_symbol = monetary->int_curr_symbol;
|
||||
- if (monetary->duo_currency_symbol == NULL)
|
||||
- monetary->duo_currency_symbol = monetary->currency_symbol;
|
||||
-
|
||||
- if (monetary->duo_int_frac_digits == -2)
|
||||
- monetary->duo_int_frac_digits = monetary->int_frac_digits;
|
||||
- if (monetary->duo_frac_digits == -2)
|
||||
- monetary->duo_frac_digits = monetary->frac_digits;
|
||||
+ /* Keyword: crncystr */
|
||||
+ monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol)
|
||||
+ + 2);
|
||||
+ monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+';
|
||||
+ strcpy (&monetary->crncystr[1], monetary->currency_symbol);
|
||||
|
||||
#undef TEST_ELEM
|
||||
#define TEST_ELEM(cat, alt, min, max) \
|
||||
@@ -328,6 +429,17 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
|
||||
TEST_ELEM (int_p_sign_posn, p_sign_posn, -1, 4);
|
||||
TEST_ELEM (int_n_sign_posn, n_sign_posn, -1, 4);
|
||||
|
||||
+ /* The non-POSIX.2 extensions are optional. */
|
||||
+ if (monetary->duo_int_curr_symbol == NULL)
|
||||
+ monetary->duo_int_curr_symbol = monetary->int_curr_symbol;
|
||||
+ if (monetary->duo_currency_symbol == NULL)
|
||||
+ monetary->duo_currency_symbol = monetary->currency_symbol;
|
||||
+
|
||||
+ if (monetary->duo_int_frac_digits == -2)
|
||||
+ monetary->duo_int_frac_digits = monetary->int_frac_digits;
|
||||
+ if (monetary->duo_frac_digits == -2)
|
||||
+ monetary->duo_frac_digits = monetary->frac_digits;
|
||||
+
|
||||
TEST_ELEM (duo_p_cs_precedes, p_cs_precedes, -1, 1);
|
||||
TEST_ELEM (duo_p_sep_by_space, p_sep_by_space, -1, 2);
|
||||
TEST_ELEM (duo_n_cs_precedes, n_cs_precedes, -1, 1);
|
||||
@@ -350,17 +462,15 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
|
||||
if (monetary->duo_valid_to == 0)
|
||||
monetary->duo_valid_to = 99991231;
|
||||
|
||||
+ /* Keyword: conversion_rate */
|
||||
if (monetary->conversion_rate[0] == 0)
|
||||
{
|
||||
monetary->conversion_rate[0] = 1;
|
||||
monetary->conversion_rate[1] = 1;
|
||||
}
|
||||
|
||||
- /* Create the crncystr entry. */
|
||||
- monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol)
|
||||
- + 2);
|
||||
- monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+';
|
||||
- strcpy (&monetary->crncystr[1], monetary->currency_symbol);
|
||||
+ /* A value for monetary-decimal-point-wc was set when
|
||||
+ monetary_decimal_point was set, likewise for monetary-thousands-sep-wc. */
|
||||
}
|
||||
|
||||
|
62
glibc-rh2058224-2.patch
Normal file
62
glibc-rh2058224-2.patch
Normal file
@ -0,0 +1,62 @@
|
||||
commit 1c7a34567d21fbd3b706c77cd794956b43daefe7
|
||||
Author: Carlos O'Donell <carlos@redhat.com>
|
||||
Date: Thu Feb 3 16:01:52 2022 -0500
|
||||
|
||||
localedata: Do not generate output if warnings were present.
|
||||
|
||||
With LC_MONETARY parsing fixed we can now generate locales
|
||||
without forcing output with '-c'.
|
||||
|
||||
Removing '-c' from localedef invocation is the equivalent of
|
||||
using -Werror for localedef. The glibc locale sources should
|
||||
always be clean and free from warnings.
|
||||
|
||||
We remove '-c' from both test locale generation and the targets
|
||||
used for installing locales e.g. install-locale-archive, and
|
||||
install-locale-files.
|
||||
|
||||
Tested on x86_64 and i686 without regressions.
|
||||
Tested with install-locale-archive target.
|
||||
Tested with install-locale-files target.
|
||||
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
|
||||
diff --git a/localedata/Makefile b/localedata/Makefile
|
||||
index 5830b9d05141cccd..a46da8a9311b00b0 100644
|
||||
--- a/localedata/Makefile
|
||||
+++ b/localedata/Makefile
|
||||
@@ -469,11 +469,11 @@ define build-one-locale
|
||||
endef
|
||||
|
||||
$(INSTALL-SUPPORTED-LOCALE-ARCHIVE): install-locales-dir
|
||||
- @flags="-c"; \
|
||||
+ @flags=""; \
|
||||
$(build-one-locale)
|
||||
|
||||
$(INSTALL-SUPPORTED-LOCALE-FILES): install-locales-dir
|
||||
- @flags="-c --no-archive --no-hard-links"; \
|
||||
+ @flags="--no-archive --no-hard-links"; \
|
||||
$(build-one-locale)
|
||||
|
||||
tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP
|
||||
diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh
|
||||
index c7e2e160ae1506f8..a25d27f3e6986675 100644
|
||||
--- a/localedata/gen-locale.sh
|
||||
+++ b/localedata/gen-locale.sh
|
||||
@@ -54,8 +54,14 @@ modifier=`echo $locfile|sed 's|[^.]*[.]\([^@ ]*\)\(@[^ ]*\)\?/LC_CTYPE|\2|'`
|
||||
|
||||
echo "Generating locale $locale.$charmap: this might take a while..."
|
||||
|
||||
-# Run quietly and force output.
|
||||
-flags="--quiet -c"
|
||||
+# Do not force output with '-c', all locales should compile without
|
||||
+# warning or errors. There is likewise no need to run quietly with
|
||||
+# '--quiet' since all locales should compile without additional
|
||||
+# diagnostics. If there are messages printed then we want to see
|
||||
+# them, fix them, and the associated error or warning. During
|
||||
+# development it may be beneficialy to put '--quiet -c' here to allow
|
||||
+# you to develop in-progress locales.
|
||||
+flags=""
|
||||
|
||||
# For SJIS the charmap is SHIFT_JIS. We just want the locale to have
|
||||
# a slightly nicer name instead of using "*.SHIFT_SJIS", but that
|
37
glibc-rh2058230.patch
Normal file
37
glibc-rh2058230.patch
Normal file
@ -0,0 +1,37 @@
|
||||
Early backport of upstream patch under discussion:
|
||||
|
||||
[PATCH v3] elf: Fix DFS sorting algorithm for LD_TRACE_LOADED_OBJECTS
|
||||
with missing libraries (BZ #28868)
|
||||
<https://sourceware.org/pipermail/libc-alpha/2022-February/136641.html>
|
||||
|
||||
The tests are still being discussed upstream and are not backported
|
||||
here.
|
||||
|
||||
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
|
||||
index 237d9636c5be780c..9e30c6c3f6c58783 100644
|
||||
--- a/elf/dl-deps.c
|
||||
+++ b/elf/dl-deps.c
|
||||
@@ -489,6 +489,8 @@ _dl_map_object_deps (struct link_map *map,
|
||||
|
||||
for (nlist = 0, runp = known; runp; runp = runp->next)
|
||||
{
|
||||
+ /* _dl_sort_maps ignores l_faked object, so it is save to not considere
|
||||
+ them for nlist. */
|
||||
if (__builtin_expect (trace_mode, 0) && runp->map->l_faked)
|
||||
/* This can happen when we trace the loading. */
|
||||
--map->l_searchlist.r_nlist;
|
||||
diff --git a/elf/dl-sort-maps.c b/elf/dl-sort-maps.c
|
||||
index a274ed66cc987735..72f4ff0e6eda3377 100644
|
||||
--- a/elf/dl-sort-maps.c
|
||||
+++ b/elf/dl-sort-maps.c
|
||||
@@ -140,7 +140,9 @@ static void
|
||||
dfs_traversal (struct link_map ***rpo, struct link_map *map,
|
||||
bool *do_reldeps)
|
||||
{
|
||||
- if (map->l_visited)
|
||||
+ /* _dl_map_object_deps filter l_faked objects when calculating the
|
||||
+ number of maps before calling _dl_sort_maps, ignore them as well. */
|
||||
+ if (map->l_visited || map->l_faked)
|
||||
return;
|
||||
|
||||
map->l_visited = 1;
|
11
glibc.spec
11
glibc.spec
@ -148,7 +148,7 @@ end \
|
||||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: 25%{?dist}
|
||||
Release: 27%{?dist}
|
||||
|
||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||
# libraries.
|
||||
@ -375,6 +375,9 @@ Patch170: glibc-upstream-2.34-104.patch
|
||||
Patch171: glibc-upstream-2.34-105.patch
|
||||
Patch172: glibc-upstream-2.34-106.patch
|
||||
Patch173: glibc-upstream-2.34-107.patch
|
||||
Patch174: glibc-rh2058224-1.patch
|
||||
Patch175: glibc-rh2058224-2.patch
|
||||
Patch176: glibc-rh2058230.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
@ -2418,6 +2421,12 @@ fi
|
||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||
|
||||
%changelog
|
||||
* Mon Feb 28 2022 Florian Weimer <fweimer@redhat.com> - 2.34-27
|
||||
- Fix regression (ldd crash) during dependency sorting in ld.so (#2058230)
|
||||
|
||||
* Mon Feb 28 2022 Florian Weimer <fweimer@redhat.com> - 2.34-26
|
||||
- Fix localedef compilation of C.UTF-8 (empty LC_MONETARY keywords) (#2058224)
|
||||
|
||||
* Thu Feb 3 2022 Florian Weimer <fweimer@redhat.com> - 2.34-25
|
||||
- Sync with upstream branch release/2.34/master,
|
||||
commit 6eaf10cbb78d22eae7999d9de55f6b93999e0860:
|
||||
|
Loading…
Reference in New Issue
Block a user