mirror of
https://abf.rosa.ru/djam/glibc.git
synced 2025-02-24 07:22:47 +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
|
#Source1: http://ftp.gnu.org/gnu/glibc/%{oname}-%{ver}.tar.xz.sig
|
||||||
#endif
|
#endif
|
||||||
%endif
|
%endif
|
||||||
Release: 8
|
Release: 9
|
||||||
License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+
|
License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+
|
||||||
Group: System/Libraries
|
Group: System/Libraries
|
||||||
Url: http://www.gnu.org/software/libc/
|
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
|
Patch1036: glibc-2.29-strict-aliasing.patch
|
||||||
Patch1037: glibc-2.29-SIG_BLOCK.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
|
# These generatiors are exeperimentally disabled while
|
||||||
# bootstrapping aarch64 to try to get rid of them
|
# bootstrapping aarch64 to try to get rid of them
|
||||||
%ifnarch aarch64
|
%ifnarch aarch64
|
||||||
|
@ -1722,3 +1736,4 @@ unset LD_LIBRARY_PATH
|
||||||
%preun -n locales
|
%preun -n locales
|
||||||
%{_bindir}/locale_uninstall.sh "ENCODINGS"
|
%{_bindir}/locale_uninstall.sh "ENCODINGS"
|
||||||
%endif
|
%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