mirror of
https://abf.rosa.ru/djam/glibc40.git
synced 2025-02-23 15:52:52 +00:00
CVE vulnerabilities closed
This commit is contained in:
parent
48ad494a7a
commit
3861d3d668
9 changed files with 1020 additions and 1 deletions
124
Avoid-ldbl-96-stack-corruption-from-range-reduction-.patch
Normal file
124
Avoid-ldbl-96-stack-corruption-from-range-reduction-.patch
Normal file
|
@ -0,0 +1,124 @@
|
|||
From 9333498794cde1d5cca518badf79533a24114b6f Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Myers <joseph@codesourcery.com>
|
||||
Date: Wed, 12 Feb 2020 23:31:56 +0000
|
||||
Subject: [PATCH] Avoid ldbl-96 stack corruption from range reduction of
|
||||
pseudo-zero (bug 25487).
|
||||
|
||||
Bug 25487 reports stack corruption in ldbl-96 sinl on a pseudo-zero
|
||||
argument (an representation where all the significand bits, including
|
||||
the explicit high bit, are zero, but the exponent is not zero, which
|
||||
is not a valid representation for the long double type).
|
||||
|
||||
Although this is not a valid long double representation, existing
|
||||
practice in this area (see bug 4586, originally marked invalid but
|
||||
subsequently fixed) is that we still seek to avoid invalid memory
|
||||
accesses as a result, in case of programs that treat arbitrary binary
|
||||
data as long double representations, although the invalid
|
||||
representations of the ldbl-96 format do not need to be consistently
|
||||
handled the same as any particular valid representation.
|
||||
|
||||
This patch makes the range reduction detect pseudo-zero and unnormal
|
||||
representations that would otherwise go to __kernel_rem_pio2, and
|
||||
returns a NaN for them instead of continuing with the range reduction
|
||||
process. (Pseudo-zero and unnormal representations whose unbiased
|
||||
exponent is less than -1 have already been safely returned from the
|
||||
function before this point without going through the rest of range
|
||||
reduction.) Pseudo-zero representations would previously result in
|
||||
the value passed to __kernel_rem_pio2 being all-zero, which is
|
||||
definitely unsafe; unnormal representations would previously result in
|
||||
a value passed whose high bit is zero, which might well be unsafe
|
||||
since that is not a form of input expected by __kernel_rem_pio2.
|
||||
|
||||
Tested for x86_64.
|
||||
---
|
||||
sysdeps/ieee754/ldbl-96/Makefile | 3 +-
|
||||
sysdeps/ieee754/ldbl-96/e_rem_pio2l.c | 12 +++++++
|
||||
sysdeps/ieee754/ldbl-96/test-sinl-pseudo.c | 41 ++++++++++++++++++++++
|
||||
3 files changed, 55 insertions(+), 1 deletion(-)
|
||||
create mode 100644 sysdeps/ieee754/ldbl-96/test-sinl-pseudo.c
|
||||
|
||||
diff --git a/sysdeps/ieee754/ldbl-96/Makefile b/sysdeps/ieee754/ldbl-96/Makefile
|
||||
index 995e90d6da..318628aed6 100644
|
||||
--- a/sysdeps/ieee754/ldbl-96/Makefile
|
||||
+++ b/sysdeps/ieee754/ldbl-96/Makefile
|
||||
@@ -17,5 +17,6 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
|
||||
ifeq ($(subdir),math)
|
||||
-tests += test-canonical-ldbl-96 test-totalorderl-ldbl-96
|
||||
+tests += test-canonical-ldbl-96 test-totalorderl-ldbl-96 test-sinl-pseudo
|
||||
+CFLAGS-test-sinl-pseudo.c += -fstack-protector-all
|
||||
endif
|
||||
diff --git a/sysdeps/ieee754/ldbl-96/e_rem_pio2l.c b/sysdeps/ieee754/ldbl-96/e_rem_pio2l.c
|
||||
index 5f742321ae..bcdf20179f 100644
|
||||
--- a/sysdeps/ieee754/ldbl-96/e_rem_pio2l.c
|
||||
+++ b/sysdeps/ieee754/ldbl-96/e_rem_pio2l.c
|
||||
@@ -210,6 +210,18 @@ __ieee754_rem_pio2l (long double x, long double *y)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ if ((i0 & 0x80000000) == 0)
|
||||
+ {
|
||||
+ /* Pseudo-zero and unnormal representations are not valid
|
||||
+ representations of long double. We need to avoid stack
|
||||
+ corruption in __kernel_rem_pio2, which expects input in a
|
||||
+ particular normal form, but those representations do not need
|
||||
+ to be consistently handled like any particular floating-point
|
||||
+ value. */
|
||||
+ y[1] = y[0] = __builtin_nanl ("");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
/* Split the 64 bits of the mantissa into three 24-bit integers
|
||||
stored in a double array. */
|
||||
exp = j0 - 23;
|
||||
diff --git a/sysdeps/ieee754/ldbl-96/test-sinl-pseudo.c b/sysdeps/ieee754/ldbl-96/test-sinl-pseudo.c
|
||||
new file mode 100644
|
||||
index 0000000000..f59b97769d
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/ieee754/ldbl-96/test-sinl-pseudo.c
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* Test sinl for pseudo-zeros and unnormals for ldbl-96 (bug 25487).
|
||||
+ Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <math.h>
|
||||
+#include <math_ldbl.h>
|
||||
+#include <stdint.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ for (int i = 0; i < 64; i++)
|
||||
+ {
|
||||
+ uint64_t sig = i == 63 ? 0 : 1ULL << i;
|
||||
+ long double ld;
|
||||
+ SET_LDOUBLE_WORDS (ld, 0x4141,
|
||||
+ sig >> 32, sig & 0xffffffffULL);
|
||||
+ /* The requirement is that no stack overflow occurs when the
|
||||
+ pseudo-zero or unnormal goes through range reduction. */
|
||||
+ volatile long double ldr;
|
||||
+ ldr = sinl (ld);
|
||||
+ (void) ldr;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
--
|
||||
2.30.2
|
||||
|
112
Fix-buffer-overrun-in-EUC-KR-conversion-module-bz-24.patch
Normal file
112
Fix-buffer-overrun-in-EUC-KR-conversion-module-bz-24.patch
Normal file
|
@ -0,0 +1,112 @@
|
|||
diff -ur glibc-2.31/iconvdata/euc-kr.c glibc-2.31-diff/iconvdata/euc-kr.c
|
||||
--- glibc-2.31/iconvdata/euc-kr.c 2020-02-01 14:52:50.000000000 +0300
|
||||
+++ glibc-2.31-diff/iconvdata/euc-kr.c 2021-03-30 23:36:33.681417788 +0300
|
||||
@@ -80,11 +80,7 @@
|
||||
\
|
||||
if (ch <= 0x9f) \
|
||||
++inptr; \
|
||||
- /* 0xfe(->0x7e : row 94) and 0xc9(->0x59 : row 41) are \
|
||||
- user-defined areas. */ \
|
||||
- else if (__builtin_expect (ch == 0xa0, 0) \
|
||||
- || __builtin_expect (ch > 0xfe, 0) \
|
||||
- || __builtin_expect (ch == 0xc9, 0)) \
|
||||
+ else if (__glibc_unlikely (ch == 0xa0)) \
|
||||
{ \
|
||||
/* This is illegal. */ \
|
||||
STANDARD_FROM_LOOP_ERR_HANDLER (1); \
|
||||
diff -ur glibc-2.31/iconvdata/ksc5601.h glibc-2.31-diff/iconvdata/ksc5601.h
|
||||
--- glibc-2.31/iconvdata/ksc5601.h 2020-02-01 14:52:50.000000000 +0300
|
||||
+++ glibc-2.31-diff/iconvdata/ksc5601.h 2021-03-30 23:36:33.681417788 +0300
|
||||
@@ -50,15 +50,15 @@
|
||||
unsigned char ch2;
|
||||
int idx;
|
||||
|
||||
+ if (avail < 2)
|
||||
+ return 0;
|
||||
+
|
||||
/* row 94(0x7e) and row 41(0x49) are user-defined area in KS C 5601 */
|
||||
|
||||
if (ch < offset || (ch - offset) <= 0x20 || (ch - offset) >= 0x7e
|
||||
|| (ch - offset) == 0x49)
|
||||
return __UNKNOWN_10646_CHAR;
|
||||
|
||||
- if (avail < 2)
|
||||
- return 0;
|
||||
-
|
||||
ch2 = (*s)[1];
|
||||
if (ch2 < offset || (ch2 - offset) <= 0x20 || (ch2 - offset) >= 0x7f)
|
||||
return __UNKNOWN_10646_CHAR;
|
||||
diff -ur glibc-2.31/iconvdata/Makefile glibc-2.31-diff/iconvdata/Makefile
|
||||
--- glibc-2.31/iconvdata/Makefile 2021-03-30 23:33:00.569141416 +0300
|
||||
+++ glibc-2.31-diff/iconvdata/Makefile 2021-03-30 23:38:51.013024354 +0300
|
||||
@@ -73,7 +73,9 @@
|
||||
ifeq (yes,$(build-shared))
|
||||
tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
|
||||
tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \
|
||||
- bug-iconv10 bug-iconv11 bug-iconv12
|
||||
+ bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \
|
||||
+ bug-iconv13
|
||||
+
|
||||
ifeq ($(have-thread-library),yes)
|
||||
tests += bug-iconv3
|
||||
endif
|
||||
diff --git a/iconvdata/bug-iconv13.c b/iconvdata/bug-iconv13.c
|
||||
new file mode 100644
|
||||
index 0000000000..87aaff398e
|
||||
--- /dev/null
|
||||
+++ b/iconvdata/bug-iconv13.c
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* bug 24973: Test EUC-KR module
|
||||
+ Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <errno.h>
|
||||
+#include <iconv.h>
|
||||
+#include <stdio.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ iconv_t cd = iconv_open ("UTF-8//IGNORE", "EUC-KR");
|
||||
+ TEST_VERIFY_EXIT (cd != (iconv_t) -1);
|
||||
+
|
||||
+ /* 0xfe (->0x7e : row 94) and 0xc9 (->0x49 : row 41) are user-defined
|
||||
+ areas, which are not allowed and should be skipped over due to
|
||||
+ //IGNORE. The trailing 0xfe also is an incomplete sequence, which
|
||||
+ should be checked first. */
|
||||
+ char input[4] = { '\xc9', '\xa1', '\0', '\xfe' };
|
||||
+ char *inptr = input;
|
||||
+ size_t insize = sizeof (input);
|
||||
+ char output[4];
|
||||
+ char *outptr = output;
|
||||
+ size_t outsize = sizeof (output);
|
||||
+
|
||||
+ /* This used to crash due to buffer overrun. */
|
||||
+ TEST_VERIFY (iconv (cd, &inptr, &insize, &outptr, &outsize) == (size_t) -1);
|
||||
+ TEST_VERIFY (errno == EINVAL);
|
||||
+ /* The conversion should produce one character, the converted null
|
||||
+ character. */
|
||||
+ TEST_VERIFY (sizeof (output) - outsize == 1);
|
||||
+
|
||||
+ TEST_VERIFY_EXIT (iconv_close (cd) != -1);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
|
63
Fix-use-after-free-in-glob-when-expanding-user-bug-2.patch
Normal file
63
Fix-use-after-free-in-glob-when-expanding-user-bug-2.patch
Normal file
|
@ -0,0 +1,63 @@
|
|||
From ddc650e9b3dc916eab417ce9f79e67337b05035c Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Schwab <schwab@suse.de>
|
||||
Date: Wed, 19 Feb 2020 17:21:46 +0100
|
||||
Subject: [PATCH] Fix use-after-free in glob when expanding ~user (bug 25414)
|
||||
|
||||
The value of `end_name' points into the value of `dirname', thus don't
|
||||
deallocate the latter before the last use of the former.
|
||||
---
|
||||
posix/glob.c | 25 +++++++++++++------------
|
||||
1 file changed, 13 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/posix/glob.c b/posix/glob.c
|
||||
index cba9cd1819..4580cefb9f 100644
|
||||
--- a/posix/glob.c
|
||||
+++ b/posix/glob.c
|
||||
@@ -827,31 +827,32 @@ __glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
|
||||
{
|
||||
size_t home_len = strlen (p->pw_dir);
|
||||
size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
|
||||
- char *d;
|
||||
+ char *d, *newp;
|
||||
+ bool use_alloca = glob_use_alloca (alloca_used,
|
||||
+ home_len + rest_len + 1);
|
||||
|
||||
- if (__glibc_unlikely (malloc_dirname))
|
||||
- free (dirname);
|
||||
- malloc_dirname = 0;
|
||||
-
|
||||
- if (glob_use_alloca (alloca_used, home_len + rest_len + 1))
|
||||
- dirname = alloca_account (home_len + rest_len + 1,
|
||||
- alloca_used);
|
||||
+ if (use_alloca)
|
||||
+ newp = alloca_account (home_len + rest_len + 1, alloca_used);
|
||||
else
|
||||
{
|
||||
- dirname = malloc (home_len + rest_len + 1);
|
||||
- if (dirname == NULL)
|
||||
+ newp = malloc (home_len + rest_len + 1);
|
||||
+ if (newp == NULL)
|
||||
{
|
||||
scratch_buffer_free (&pwtmpbuf);
|
||||
retval = GLOB_NOSPACE;
|
||||
goto out;
|
||||
}
|
||||
- malloc_dirname = 1;
|
||||
}
|
||||
- d = mempcpy (dirname, p->pw_dir, home_len);
|
||||
+ d = mempcpy (newp, p->pw_dir, home_len);
|
||||
if (end_name != NULL)
|
||||
d = mempcpy (d, end_name, rest_len);
|
||||
*d = '\0';
|
||||
|
||||
+ if (__glibc_unlikely (malloc_dirname))
|
||||
+ free (dirname);
|
||||
+ dirname = newp;
|
||||
+ malloc_dirname = !use_alloca;
|
||||
+
|
||||
dirlen = home_len + rest_len;
|
||||
dirname_modified = 1;
|
||||
}
|
||||
--
|
||||
2.30.2
|
||||
|
107
arm-CVE-2020-6096-Fix-multiarch-memcpy-for-negative-.patch
Normal file
107
arm-CVE-2020-6096-Fix-multiarch-memcpy-for-negative-.patch
Normal file
|
@ -0,0 +1,107 @@
|
|||
From beea361050728138b82c57dda0c4810402d342b9 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Anisimov <a.anisimov@omprussia.ru>
|
||||
Date: Wed, 8 Jul 2020 14:18:31 +0200
|
||||
Subject: [PATCH] arm: CVE-2020-6096: Fix multiarch memcpy for negative length
|
||||
[BZ #25620]
|
||||
|
||||
Unsigned branch instructions could be used for r2 to fix the wrong
|
||||
behavior when a negative length is passed to memcpy.
|
||||
This commit fixes the armv7 version.
|
||||
---
|
||||
sysdeps/arm/armv7/multiarch/memcpy_impl.S | 22 +++++++++++-----------
|
||||
1 file changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/sysdeps/arm/armv7/multiarch/memcpy_impl.S b/sysdeps/arm/armv7/multiarch/memcpy_impl.S
|
||||
index bf4ac7077f..379bb56fc9 100644
|
||||
--- a/sysdeps/arm/armv7/multiarch/memcpy_impl.S
|
||||
+++ b/sysdeps/arm/armv7/multiarch/memcpy_impl.S
|
||||
@@ -268,7 +268,7 @@ ENTRY(memcpy)
|
||||
|
||||
mov dst, dstin /* Preserve dstin, we need to return it. */
|
||||
cmp count, #64
|
||||
- bge .Lcpy_not_short
|
||||
+ bhs .Lcpy_not_short
|
||||
/* Deal with small copies quickly by dropping straight into the
|
||||
exit block. */
|
||||
|
||||
@@ -351,10 +351,10 @@ ENTRY(memcpy)
|
||||
|
||||
1:
|
||||
subs tmp2, count, #64 /* Use tmp2 for count. */
|
||||
- blt .Ltail63aligned
|
||||
+ blo .Ltail63aligned
|
||||
|
||||
cmp tmp2, #512
|
||||
- bge .Lcpy_body_long
|
||||
+ bhs .Lcpy_body_long
|
||||
|
||||
.Lcpy_body_medium: /* Count in tmp2. */
|
||||
#ifdef USE_VFP
|
||||
@@ -378,7 +378,7 @@ ENTRY(memcpy)
|
||||
add src, src, #64
|
||||
vstr d1, [dst, #56]
|
||||
add dst, dst, #64
|
||||
- bge 1b
|
||||
+ bhs 1b
|
||||
tst tmp2, #0x3f
|
||||
beq .Ldone
|
||||
|
||||
@@ -412,7 +412,7 @@ ENTRY(memcpy)
|
||||
ldrd A_l, A_h, [src, #64]!
|
||||
strd A_l, A_h, [dst, #64]!
|
||||
subs tmp2, tmp2, #64
|
||||
- bge 1b
|
||||
+ bhs 1b
|
||||
tst tmp2, #0x3f
|
||||
bne 1f
|
||||
ldr tmp2,[sp], #FRAME_SIZE
|
||||
@@ -482,7 +482,7 @@ ENTRY(memcpy)
|
||||
add src, src, #32
|
||||
|
||||
subs tmp2, tmp2, #prefetch_lines * 64 * 2
|
||||
- blt 2f
|
||||
+ blo 2f
|
||||
1:
|
||||
cpy_line_vfp d3, 0
|
||||
cpy_line_vfp d4, 64
|
||||
@@ -494,7 +494,7 @@ ENTRY(memcpy)
|
||||
add dst, dst, #2 * 64
|
||||
add src, src, #2 * 64
|
||||
subs tmp2, tmp2, #prefetch_lines * 64
|
||||
- bge 1b
|
||||
+ bhs 1b
|
||||
|
||||
2:
|
||||
cpy_tail_vfp d3, 0
|
||||
@@ -615,8 +615,8 @@ ENTRY(memcpy)
|
||||
1:
|
||||
pld [src, #(3 * 64)]
|
||||
subs count, count, #64
|
||||
- ldrmi tmp2, [sp], #FRAME_SIZE
|
||||
- bmi .Ltail63unaligned
|
||||
+ ldrlo tmp2, [sp], #FRAME_SIZE
|
||||
+ blo .Ltail63unaligned
|
||||
pld [src, #(4 * 64)]
|
||||
|
||||
#ifdef USE_NEON
|
||||
@@ -633,7 +633,7 @@ ENTRY(memcpy)
|
||||
neon_load_multi d0-d3, src
|
||||
neon_load_multi d4-d7, src
|
||||
subs count, count, #64
|
||||
- bmi 2f
|
||||
+ blo 2f
|
||||
1:
|
||||
pld [src, #(4 * 64)]
|
||||
neon_store_multi d0-d3, dst
|
||||
@@ -641,7 +641,7 @@ ENTRY(memcpy)
|
||||
neon_store_multi d4-d7, dst
|
||||
neon_load_multi d4-d7, src
|
||||
subs count, count, #64
|
||||
- bpl 1b
|
||||
+ bhs 1b
|
||||
2:
|
||||
neon_store_multi d0-d3, dst
|
||||
neon_store_multi d4-d7, dst
|
||||
--
|
||||
2.30.2
|
||||
|
189
arm-CVE-2020-6096-fix-memcpy-and-memmove-for-negativ.patch
Normal file
189
arm-CVE-2020-6096-fix-memcpy-and-memmove-for-negativ.patch
Normal file
|
@ -0,0 +1,189 @@
|
|||
From 79a4fa341b8a89cb03f84564fd72abaa1a2db394 Mon Sep 17 00:00:00 2001
|
||||
From: Evgeny Eremin <e.eremin@omprussia.ru>
|
||||
Date: Wed, 8 Jul 2020 14:18:19 +0200
|
||||
Subject: [PATCH] arm: CVE-2020-6096: fix memcpy and memmove for negative
|
||||
length [BZ #25620]
|
||||
|
||||
Unsigned branch instructions could be used for r2 to fix the wrong
|
||||
behavior when a negative length is passed to memcpy and memmove.
|
||||
This commit fixes the generic arm implementation of memcpy amd memmove.
|
||||
---
|
||||
sysdeps/arm/memcpy.S | 24 ++++++++++--------------
|
||||
sysdeps/arm/memmove.S | 24 ++++++++++--------------
|
||||
2 files changed, 20 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/sysdeps/arm/memcpy.S b/sysdeps/arm/memcpy.S
|
||||
index 510e8adaf2..bcfbc51d99 100644
|
||||
--- a/sysdeps/arm/memcpy.S
|
||||
+++ b/sysdeps/arm/memcpy.S
|
||||
@@ -68,7 +68,7 @@ ENTRY(memcpy)
|
||||
cfi_remember_state
|
||||
|
||||
subs r2, r2, #4
|
||||
- blt 8f
|
||||
+ blo 8f
|
||||
ands ip, r0, #3
|
||||
PLD( pld [r1, #0] )
|
||||
bne 9f
|
||||
@@ -82,7 +82,7 @@ ENTRY(memcpy)
|
||||
cfi_rel_offset (r6, 4)
|
||||
cfi_rel_offset (r7, 8)
|
||||
cfi_rel_offset (r8, 12)
|
||||
- blt 5f
|
||||
+ blo 5f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb r3, ip, #32 )
|
||||
@@ -98,9 +98,9 @@ ENTRY(memcpy)
|
||||
#endif
|
||||
|
||||
PLD( pld [r1, #0] )
|
||||
-2: PLD( subs r2, r2, #96 )
|
||||
+2: PLD( cmp r2, #96 )
|
||||
PLD( pld [r1, #28] )
|
||||
- PLD( blt 4f )
|
||||
+ PLD( blo 4f )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r1, #92] )
|
||||
|
||||
@@ -108,9 +108,7 @@ ENTRY(memcpy)
|
||||
4: ldmia r1!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
subs r2, r2, #32
|
||||
stmia r0!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
- bge 3b
|
||||
- PLD( cmn r2, #96 )
|
||||
- PLD( bge 4b )
|
||||
+ bhs 3b
|
||||
|
||||
5: ands ip, r2, #28
|
||||
rsb ip, ip, #32
|
||||
@@ -222,7 +220,7 @@ ENTRY(memcpy)
|
||||
strbge r4, [r0], #1
|
||||
subs r2, r2, ip
|
||||
strb lr, [r0], #1
|
||||
- blt 8b
|
||||
+ blo 8b
|
||||
ands ip, r1, #3
|
||||
beq 1b
|
||||
|
||||
@@ -236,7 +234,7 @@ ENTRY(memcpy)
|
||||
.macro forward_copy_shift pull push
|
||||
|
||||
subs r2, r2, #28
|
||||
- blt 14f
|
||||
+ blo 14f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb ip, ip, #32 )
|
||||
@@ -253,9 +251,9 @@ ENTRY(memcpy)
|
||||
cfi_rel_offset (r10, 16)
|
||||
|
||||
PLD( pld [r1, #0] )
|
||||
- PLD( subs r2, r2, #96 )
|
||||
+ PLD( cmp r2, #96 )
|
||||
PLD( pld [r1, #28] )
|
||||
- PLD( blt 13f )
|
||||
+ PLD( blo 13f )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r1, #92] )
|
||||
|
||||
@@ -280,9 +278,7 @@ ENTRY(memcpy)
|
||||
mov ip, ip, PULL #\pull
|
||||
orr ip, ip, lr, PUSH #\push
|
||||
stmia r0!, {r3, r4, r5, r6, r7, r8, r10, ip}
|
||||
- bge 12b
|
||||
- PLD( cmn r2, #96 )
|
||||
- PLD( bge 13b )
|
||||
+ bhs 12b
|
||||
|
||||
pop {r5 - r8, r10}
|
||||
cfi_adjust_cfa_offset (-20)
|
||||
diff --git a/sysdeps/arm/memmove.S b/sysdeps/arm/memmove.S
|
||||
index 954037ef3a..0d07b76ee6 100644
|
||||
--- a/sysdeps/arm/memmove.S
|
||||
+++ b/sysdeps/arm/memmove.S
|
||||
@@ -85,7 +85,7 @@ ENTRY(memmove)
|
||||
add r1, r1, r2
|
||||
add r0, r0, r2
|
||||
subs r2, r2, #4
|
||||
- blt 8f
|
||||
+ blo 8f
|
||||
ands ip, r0, #3
|
||||
PLD( pld [r1, #-4] )
|
||||
bne 9f
|
||||
@@ -99,7 +99,7 @@ ENTRY(memmove)
|
||||
cfi_rel_offset (r6, 4)
|
||||
cfi_rel_offset (r7, 8)
|
||||
cfi_rel_offset (r8, 12)
|
||||
- blt 5f
|
||||
+ blo 5f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( sbcsne r4, ip, r2 ) @ C is always set here
|
||||
@@ -114,9 +114,9 @@ ENTRY(memmove)
|
||||
#endif
|
||||
|
||||
PLD( pld [r1, #-4] )
|
||||
-2: PLD( subs r2, r2, #96 )
|
||||
+2: PLD( cmp r2, #96 )
|
||||
PLD( pld [r1, #-32] )
|
||||
- PLD( blt 4f )
|
||||
+ PLD( blo 4f )
|
||||
PLD( pld [r1, #-64] )
|
||||
PLD( pld [r1, #-96] )
|
||||
|
||||
@@ -124,9 +124,7 @@ ENTRY(memmove)
|
||||
4: ldmdb r1!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
subs r2, r2, #32
|
||||
stmdb r0!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
- bge 3b
|
||||
- PLD( cmn r2, #96 )
|
||||
- PLD( bge 4b )
|
||||
+ bhs 3b
|
||||
|
||||
5: ands ip, r2, #28
|
||||
rsb ip, ip, #32
|
||||
@@ -237,7 +235,7 @@ ENTRY(memmove)
|
||||
strbge r4, [r0, #-1]!
|
||||
subs r2, r2, ip
|
||||
strb lr, [r0, #-1]!
|
||||
- blt 8b
|
||||
+ blo 8b
|
||||
ands ip, r1, #3
|
||||
beq 1b
|
||||
|
||||
@@ -251,7 +249,7 @@ ENTRY(memmove)
|
||||
.macro backward_copy_shift push pull
|
||||
|
||||
subs r2, r2, #28
|
||||
- blt 14f
|
||||
+ blo 14f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb ip, ip, #32 )
|
||||
@@ -268,9 +266,9 @@ ENTRY(memmove)
|
||||
cfi_rel_offset (r10, 16)
|
||||
|
||||
PLD( pld [r1, #-4] )
|
||||
- PLD( subs r2, r2, #96 )
|
||||
+ PLD( cmp r2, #96 )
|
||||
PLD( pld [r1, #-32] )
|
||||
- PLD( blt 13f )
|
||||
+ PLD( blo 13f )
|
||||
PLD( pld [r1, #-64] )
|
||||
PLD( pld [r1, #-96] )
|
||||
|
||||
@@ -295,9 +293,7 @@ ENTRY(memmove)
|
||||
mov r4, r4, PUSH #\push
|
||||
orr r4, r4, r3, PULL #\pull
|
||||
stmdb r0!, {r4 - r8, r10, ip, lr}
|
||||
- bge 12b
|
||||
- PLD( cmn r2, #96 )
|
||||
- PLD( bge 13b )
|
||||
+ bhs 12b
|
||||
|
||||
pop {r5 - r8, r10}
|
||||
cfi_adjust_cfa_offset (-20)
|
||||
--
|
||||
2.30.2
|
||||
|
258
gconv-Fix-assertion-failure-in-ISO-2022-JP-3-module-.patch
Normal file
258
gconv-Fix-assertion-failure-in-ISO-2022-JP-3-module-.patch
Normal file
|
@ -0,0 +1,258 @@
|
|||
--- a/iconvdata/iso-2022-jp-3.c 2020-02-01 14:52:50.000000000 +0300
|
||||
+++ b/iconvdata/iso-2022-jp-3.c 2021-03-30 23:54:32.962056371 +0300
|
||||
@@ -67,23 +67,34 @@
|
||||
CURRENT_SEL_MASK = 7 << 3
|
||||
};
|
||||
|
||||
-/* During UCS-4 to ISO-2022-JP-3 conversion, the COUNT element of the state
|
||||
- also contains the last two bytes to be output, shifted by 6 bits, and a
|
||||
- one-bit indicator whether they must be preceded by the shift sequence,
|
||||
- in bit 22. */
|
||||
+/* During UCS-4 to ISO-2022-JP-3 conversion, the COUNT element of the
|
||||
+ state also contains the last two bytes to be output, shifted by 6
|
||||
+ bits, and a one-bit indicator whether they must be preceded by the
|
||||
+ shift sequence, in bit 22. During ISO-2022-JP-3 to UCS-4
|
||||
+ conversion, COUNT may also contain a non-zero pending wide
|
||||
+ character, shifted by six bits. This happens for certain inputs in
|
||||
+ JISX0213_1_2004_set and JISX0213_2_set if the second wide character
|
||||
+ in a combining sequence cannot be written because the buffer is
|
||||
+ full. */
|
||||
|
||||
/* Since this is a stateful encoding we have to provide code which resets
|
||||
the output state to the initial state. This has to be done during the
|
||||
flushing. */
|
||||
#define EMIT_SHIFT_TO_INIT \
|
||||
- if ((data->__statep->__count & ~7) != ASCII_set) \
|
||||
+ if (data->__statep->__count != ASCII_set) \
|
||||
{ \
|
||||
if (FROM_DIRECTION) \
|
||||
{ \
|
||||
- /* It's easy, we don't have to emit anything, we just reset the \
|
||||
- state for the input. */ \
|
||||
- data->__statep->__count &= 7; \
|
||||
- data->__statep->__count |= ASCII_set; \
|
||||
+ if (__glibc_likely (outbuf + 4 <= outend)) \
|
||||
+ { \
|
||||
+ /* Write out the last character. */ \
|
||||
+ *((uint32_t *) outbuf) = data->__statep->__count >> 6; \
|
||||
+ outbuf += sizeof (uint32_t); \
|
||||
+ data->__statep->__count = ASCII_set; \
|
||||
+ } \
|
||||
+ else \
|
||||
+ /* We don't have enough room in the output buffer. */ \
|
||||
+ status = __GCONV_FULL_OUTPUT; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
@@ -151,7 +162,21 @@
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
- uint32_t ch = *inptr; \
|
||||
+ uint32_t ch; \
|
||||
+ \
|
||||
+ /* Output any pending character. */ \
|
||||
+ ch = set >> 6; \
|
||||
+ if (__glibc_unlikely (ch != 0)) \
|
||||
+ { \
|
||||
+ put32 (outptr, ch); \
|
||||
+ outptr += 4; \
|
||||
+ /* Remove the pending character, but preserve state bits. */ \
|
||||
+ set &= (1 << 6) - 1; \
|
||||
+ continue; \
|
||||
+ } \
|
||||
+ \
|
||||
+ /* Otherwise read the next input byte. */ \
|
||||
+ ch = *inptr; \
|
||||
\
|
||||
/* Recognize escape sequences. */ \
|
||||
if (__glibc_unlikely (ch == ESC)) \
|
||||
@@ -297,21 +322,25 @@
|
||||
uint32_t u1 = __jisx0213_to_ucs_combining[ch - 1][0]; \
|
||||
uint32_t u2 = __jisx0213_to_ucs_combining[ch - 1][1]; \
|
||||
\
|
||||
+ inptr += 2; \
|
||||
+ \
|
||||
+ put32 (outptr, u1); \
|
||||
+ outptr += 4; \
|
||||
+ \
|
||||
/* See whether we have room for two characters. */ \
|
||||
- if (outptr + 8 <= outend) \
|
||||
+ if (outptr + 4 <= outend) \
|
||||
{ \
|
||||
- inptr += 2; \
|
||||
- put32 (outptr, u1); \
|
||||
- outptr += 4; \
|
||||
put32 (outptr, u2); \
|
||||
outptr += 4; \
|
||||
continue; \
|
||||
} \
|
||||
- else \
|
||||
- { \
|
||||
- result = __GCONV_FULL_OUTPUT; \
|
||||
- break; \
|
||||
- } \
|
||||
+ \
|
||||
+ /* Otherwise store only the first character now, and \
|
||||
+ put the second one into the queue. */ \
|
||||
+ set |= u2 << 6; \
|
||||
+ /* Tell the caller why we terminate the loop. */ \
|
||||
+ result = __GCONV_FULL_OUTPUT; \
|
||||
+ break; \
|
||||
} \
|
||||
\
|
||||
inptr += 2; \
|
||||
--- a/iconvdata/Makefile 2021-03-30 23:51:57.339348822 +0300
|
||||
+++ b/iconvdata/Makefile 2021-03-30 23:56:08.829221682 +0300
|
||||
@@ -74,7 +74,7 @@
|
||||
tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
|
||||
tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \
|
||||
bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \
|
||||
- bug-iconv13
|
||||
+ bug-iconv13 bug-iconv14
|
||||
|
||||
ifeq ($(have-thread-library),yes)
|
||||
tests += bug-iconv3
|
||||
@@ -318,6 +318,8 @@
|
||||
$(addprefix $(objpfx),$(modules.so))
|
||||
$(objpfx)bug-iconv12.out: $(objpfx)gconv-modules \
|
||||
$(addprefix $(objpfx),$(modules.so))
|
||||
+$(objpfx)bug-iconv14.out: $(objpfx)gconv-modules \
|
||||
+ $(addprefix $(objpfx),$(modules.so))
|
||||
|
||||
$(objpfx)iconv-test.out: run-iconv-test.sh $(objpfx)gconv-modules \
|
||||
$(addprefix $(objpfx),$(modules.so)) \
|
||||
diff --git a/iconvdata/bug-iconv14.c b/iconvdata/bug-iconv14.c
|
||||
new file mode 100644
|
||||
index 0000000000..902f140fa9
|
||||
--- /dev/null
|
||||
+++ b/iconvdata/bug-iconv14.c
|
||||
@@ -0,0 +1,127 @@
|
||||
+/* Assertion in ISO-2022-JP-3 due to two-character sequence (bug 27256).
|
||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <iconv.h>
|
||||
+#include <string.h>
|
||||
+#include <errno.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+/* Use an escape sequence to return to the initial state. */
|
||||
+static void
|
||||
+with_escape_sequence (void)
|
||||
+{
|
||||
+ iconv_t c = iconv_open ("UTF-8", "ISO-2022-JP-3");
|
||||
+ TEST_VERIFY_EXIT (c != (iconv_t) -1);
|
||||
+
|
||||
+ char in[] = "\e$(O+D\e(B";
|
||||
+ char *inbuf = in;
|
||||
+ size_t inleft = strlen (in);
|
||||
+ char out[3]; /* Space for one output character. */
|
||||
+ char *outbuf;
|
||||
+ size_t outleft;
|
||||
+
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, &inbuf, &inleft, &outbuf, &outleft), (size_t) -1);
|
||||
+ TEST_COMPARE (errno, E2BIG);
|
||||
+ TEST_COMPARE (inleft, 3);
|
||||
+ TEST_COMPARE (inbuf - in, strlen (in) - 3);
|
||||
+ TEST_COMPARE (outleft, sizeof (out) - 2);
|
||||
+ TEST_COMPARE (outbuf - out, 2);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xc3);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0xa6);
|
||||
+
|
||||
+ /* Return to the initial shift state, producing the pending
|
||||
+ character. */
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, &inbuf, &inleft, &outbuf, &outleft), 0);
|
||||
+ TEST_COMPARE (inleft, 0);
|
||||
+ TEST_COMPARE (inbuf - in, strlen (in));
|
||||
+ TEST_COMPARE (outleft, sizeof (out) - 2);
|
||||
+ TEST_COMPARE (outbuf - out, 2);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xcc);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0x80);
|
||||
+
|
||||
+ /* Nothing should be flushed the second time. */
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, NULL, 0, &outbuf, &outleft), 0);
|
||||
+ TEST_COMPARE (outleft, sizeof (out));
|
||||
+ TEST_COMPARE (outbuf - out, 0);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xcc);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0x80);
|
||||
+
|
||||
+ TEST_COMPARE (iconv_close (c), 0);
|
||||
+}
|
||||
+
|
||||
+/* Use an explicit flush to return to the initial state. */
|
||||
+static void
|
||||
+with_flush (void)
|
||||
+{
|
||||
+ iconv_t c = iconv_open ("UTF-8", "ISO-2022-JP-3");
|
||||
+ TEST_VERIFY_EXIT (c != (iconv_t) -1);
|
||||
+
|
||||
+ char in[] = "\e$(O+D";
|
||||
+ char *inbuf = in;
|
||||
+ size_t inleft = strlen (in);
|
||||
+ char out[3]; /* Space for one output character. */
|
||||
+ char *outbuf;
|
||||
+ size_t outleft;
|
||||
+
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, &inbuf, &inleft, &outbuf, &outleft), (size_t) -1);
|
||||
+ TEST_COMPARE (errno, E2BIG);
|
||||
+ TEST_COMPARE (inleft, 0);
|
||||
+ TEST_COMPARE (inbuf - in, strlen (in));
|
||||
+ TEST_COMPARE (outleft, sizeof (out) - 2);
|
||||
+ TEST_COMPARE (outbuf - out, 2);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xc3);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0xa6);
|
||||
+
|
||||
+ /* Flush the pending character. */
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, NULL, 0, &outbuf, &outleft), 0);
|
||||
+ TEST_COMPARE (outleft, sizeof (out) - 2);
|
||||
+ TEST_COMPARE (outbuf - out, 2);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xcc);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0x80);
|
||||
+
|
||||
+ /* Nothing should be flushed the second time. */
|
||||
+ outbuf = out;
|
||||
+ outleft = sizeof (out);
|
||||
+ TEST_COMPARE (iconv (c, NULL, 0, &outbuf, &outleft), 0);
|
||||
+ TEST_COMPARE (outleft, sizeof (out));
|
||||
+ TEST_COMPARE (outbuf - out, 0);
|
||||
+ TEST_COMPARE (out[0] & 0xff, 0xcc);
|
||||
+ TEST_COMPARE (out[1] & 0xff, 0x80);
|
||||
+
|
||||
+ TEST_COMPARE (iconv_close (c), 0);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ with_escape_sequence ();
|
||||
+ with_flush ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
|
17
glibc.spec
17
glibc.spec
|
@ -132,7 +132,7 @@ Source0: http://ftp.gnu.org/gnu/glibc/%{oname}-%{ver}.tar.xz
|
|||
#Source1: http://ftp.gnu.org/gnu/glibc/%{oname}-%{ver}.tar.xz.sig
|
||||
#endif
|
||||
%endif
|
||||
Release: 8
|
||||
Release: 9
|
||||
License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+
|
||||
Group: System/Libraries
|
||||
Url: http://www.gnu.org/software/libc/
|
||||
|
@ -240,6 +240,20 @@ Patch1035: glibc-2.29-aarch64-buildfix.patch
|
|||
Patch1036: glibc-2.29-strict-aliasing.patch
|
||||
Patch1037: glibc-2.29-SIG_BLOCK.patch
|
||||
|
||||
# CVE-2020-10029
|
||||
Patch1038: Avoid-ldbl-96-stack-corruption-from-range-reduction-.patch
|
||||
Patch1039: math-test-sinl-pseudo-Use-stack-protector-only-if-av.patch
|
||||
Patch1040: arm-CVE-2020-6096-fix-memcpy-and-memmove-for-negativ.patch
|
||||
Patch1041: arm-CVE-2020-6096-Fix-multiarch-memcpy-for-negative-.patch
|
||||
# CVE-2020-1752
|
||||
Patch1042: Fix-use-after-free-in-glob-when-expanding-user-bug-2.patch
|
||||
# CVE-2020-29562
|
||||
Patch1043: iconv-Fix-incorrect-UCS4-inner-loop-bounds-BZ-26923.patch
|
||||
# CVE-2019-25013
|
||||
Patch1044: Fix-buffer-overrun-in-EUC-KR-conversion-module-bz-24.patch
|
||||
# CVE-2021-3326
|
||||
Patch1045: gconv-Fix-assertion-failure-in-ISO-2022-JP-3-module-.patch
|
||||
|
||||
# These generatiors are exeperimentally disabled while
|
||||
# bootstrapping aarch64 to try to get rid of them
|
||||
%ifnarch aarch64
|
||||
|
@ -1722,3 +1736,4 @@ unset LD_LIBRARY_PATH
|
|||
%preun -n locales
|
||||
%{_bindir}/locale_uninstall.sh "ENCODINGS"
|
||||
%endif
|
||||
|
||||
|
|
125
iconv-Fix-incorrect-UCS4-inner-loop-bounds-BZ-26923.patch
Normal file
125
iconv-Fix-incorrect-UCS4-inner-loop-bounds-BZ-26923.patch
Normal file
|
@ -0,0 +1,125 @@
|
|||
--- a/iconv/gconv_simple.c 2020-02-01 14:52:50.000000000 +0300
|
||||
+++ b/iconv/gconv_simple.c 2021-03-30 23:16:40.282635271 +0300
|
||||
@@ -239,11 +239,9 @@
|
||||
int flags = step_data->__flags;
|
||||
const unsigned char *inptr = *inptrp;
|
||||
unsigned char *outptr = *outptrp;
|
||||
- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||
int result;
|
||||
- size_t cnt;
|
||||
|
||||
- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
|
||||
+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4)
|
||||
{
|
||||
uint32_t inval;
|
||||
|
||||
@@ -307,11 +305,9 @@
|
||||
int flags = step_data->__flags;
|
||||
const unsigned char *inptr = *inptrp;
|
||||
unsigned char *outptr = *outptrp;
|
||||
- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||
int result;
|
||||
- size_t cnt;
|
||||
|
||||
- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
|
||||
+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4)
|
||||
{
|
||||
if (__glibc_unlikely (inptr[0] > 0x80))
|
||||
{
|
||||
@@ -613,11 +609,9 @@
|
||||
int flags = step_data->__flags;
|
||||
const unsigned char *inptr = *inptrp;
|
||||
unsigned char *outptr = *outptrp;
|
||||
- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||
int result;
|
||||
- size_t cnt;
|
||||
|
||||
- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
|
||||
+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4)
|
||||
{
|
||||
uint32_t inval;
|
||||
|
||||
@@ -684,11 +678,9 @@
|
||||
int flags = step_data->__flags;
|
||||
const unsigned char *inptr = *inptrp;
|
||||
unsigned char *outptr = *outptrp;
|
||||
- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||
int result;
|
||||
- size_t cnt;
|
||||
|
||||
- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
|
||||
+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4)
|
||||
{
|
||||
if (__glibc_unlikely (inptr[3] > 0x80))
|
||||
{
|
||||
diff -ur glibc-2.31/iconv/Makefile glibc-2.31-diff/iconv/Makefile
|
||||
--- a/iconv/Makefile 2021-03-30 23:07:33.816073365 +0300
|
||||
+++ b/iconv/Makefile 2021-03-30 23:21:05.681886174 +0300
|
||||
@@ -44,7 +44,7 @@
|
||||
CFLAGS-simple-hash.c += -I../locale
|
||||
|
||||
tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6 \
|
||||
- tst-iconv7 tst-iconv-mt
|
||||
+ tst-iconv7 tst-iconv8 tst-iconv-mt tst-iconv-opt
|
||||
|
||||
others = iconv_prog iconvconfig
|
||||
install-others-programs = $(inst_bindir)/iconv
|
||||
|
||||
diff --git a/iconv/tst-iconv8.c b/iconv/tst-iconv8.c
|
||||
new file mode 100644
|
||||
index 0000000000..0b92b19f66
|
||||
--- /dev/null
|
||||
+++ b/iconv/tst-iconv8.c
|
||||
@@ -0,0 +1,50 @@
|
||||
+/* Test iconv behavior on UCS4 conversions with //IGNORE.
|
||||
+ Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+/* Derived from BZ #26923 */
|
||||
+#include <errno.h>
|
||||
+#include <iconv.h>
|
||||
+#include <stdio.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ iconv_t cd = iconv_open ("UTF-8//IGNORE", "ISO-10646/UCS4/");
|
||||
+ TEST_VERIFY_EXIT (cd != (iconv_t) -1);
|
||||
+
|
||||
+ /*
|
||||
+ * Convert sequence beginning with an irreversible character into buffer that
|
||||
+ * is too small.
|
||||
+ */
|
||||
+ char input[12] = "\xe1\x80\xa1" "AAAAAAAAA";
|
||||
+ char *inptr = input;
|
||||
+ size_t insize = sizeof (input);
|
||||
+ char output[6];
|
||||
+ char *outptr = output;
|
||||
+ size_t outsize = sizeof (output);
|
||||
+
|
||||
+ TEST_VERIFY (iconv (cd, &inptr, &insize, &outptr, &outsize) == -1);
|
||||
+ TEST_VERIFY (errno == E2BIG);
|
||||
+
|
||||
+ TEST_VERIFY_EXIT (iconv_close (cd) != -1);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
--
|
||||
2.30.2
|
26
math-test-sinl-pseudo-Use-stack-protector-only-if-av.patch
Normal file
26
math-test-sinl-pseudo-Use-stack-protector-only-if-av.patch
Normal file
|
@ -0,0 +1,26 @@
|
|||
From c10acd40262486dac597001aecc20ad9d3bd0e4a Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Thu, 13 Feb 2020 17:01:15 +0100
|
||||
Subject: [PATCH] math/test-sinl-pseudo: Use stack protector only if available
|
||||
|
||||
This fixes commit 9333498794cde1d5cca518bad ("Avoid ldbl-96 stack
|
||||
corruption from range reduction of pseudo-zero (bug 25487).").
|
||||
---
|
||||
sysdeps/ieee754/ldbl-96/Makefile | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/sysdeps/ieee754/ldbl-96/Makefile b/sysdeps/ieee754/ldbl-96/Makefile
|
||||
index 318628aed6..6030adf7e7 100644
|
||||
--- a/sysdeps/ieee754/ldbl-96/Makefile
|
||||
+++ b/sysdeps/ieee754/ldbl-96/Makefile
|
||||
@@ -18,5 +18,7 @@
|
||||
|
||||
ifeq ($(subdir),math)
|
||||
tests += test-canonical-ldbl-96 test-totalorderl-ldbl-96 test-sinl-pseudo
|
||||
+ifeq ($(have-ssp),yes)
|
||||
CFLAGS-test-sinl-pseudo.c += -fstack-protector-all
|
||||
endif
|
||||
+endif # $(subdir) == math
|
||||
--
|
||||
2.30.2
|
||||
|
Loading…
Add table
Reference in a new issue