gnu: glibc/linux: Fix runtime crashes on i686 systems.
* gnu/packages/patches/glibc-memchr-overflow-i686.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/commencement.scm (glibc-final-with-bootstrap-bash)[native-inputs]: Add the patch conditionally for i686 systems. * gnu/packages/base.scm (glibc/linux)[native-inputs]: Add the patch conditionally for i686 systems. [arguments]: Apply the patch conditionally on i686 systems.master
parent
e18e17ea4e
commit
b2fd8f6367
|
@ -612,6 +612,7 @@ dist_patch_DATA = \
|
|||
%D%/packages/patches/glibc-bootstrap-system.patch \
|
||||
%D%/packages/patches/glibc-ldd-x86_64.patch \
|
||||
%D%/packages/patches/glibc-locales.patch \
|
||||
%D%/packages/patches/glibc-memchr-overflow-i686.patch \
|
||||
%D%/packages/patches/glibc-o-largefile.patch \
|
||||
%D%/packages/patches/glibc-versioned-locpath.patch \
|
||||
%D%/packages/patches/glog-gcc-5-demangling.patch \
|
||||
|
|
|
@ -666,6 +666,16 @@ store.")
|
|||
;; 4.7.1.
|
||||
((" -lgcc_s") ""))
|
||||
|
||||
;; Apply patch only on i686.
|
||||
;; TODO: Move the patch to 'patches' in the next update cycle.
|
||||
,@(if (string-prefix? "i686" (or (%current-target-system)
|
||||
(%current-system)))
|
||||
`(zero? (system* "patch" "-p1" "--force"
|
||||
"--input"
|
||||
(assoc-ref native-inputs
|
||||
"glibc-memchr-overflow-i686.patch")))
|
||||
'())
|
||||
|
||||
;; Have `system' use that Bash.
|
||||
(substitute* "sysdeps/posix/system.c"
|
||||
(("#define[[:blank:]]+SHELL_PATH.*$")
|
||||
|
@ -709,7 +719,15 @@ store.")
|
|||
;; install the message catalogs, with 'msgfmt'.
|
||||
(native-inputs `(("texinfo" ,texinfo)
|
||||
("perl" ,perl)
|
||||
("gettext" ,gettext-minimal)))
|
||||
("gettext" ,gettext-minimal)
|
||||
|
||||
;; Apply this patch only on i686 to avoid a full rebuild.
|
||||
;; TODO: Move to 'patches' in the next update cycle.
|
||||
,@(if (string-prefix? "i686" (or (%current-target-system)
|
||||
(%current-system)))
|
||||
`(("glibc-memchr-overflow-i686.patch"
|
||||
,(search-patch "glibc-memchr-overflow-i686.patch")))
|
||||
'())))
|
||||
|
||||
(native-search-paths
|
||||
;; Search path for packages that provide locale data. This is useful
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
(define-module (gnu packages commencement)
|
||||
#:use-module ((guix licenses)
|
||||
#:select (gpl3+ lgpl2.0+ public-domain))
|
||||
#:use-module (gnu packages)
|
||||
#:use-module (gnu packages bootstrap)
|
||||
#:use-module (gnu packages base)
|
||||
#:use-module (gnu packages bash)
|
||||
|
@ -509,7 +510,14 @@ the bootstrap environment."
|
|||
(propagated-inputs `(("kernel-headers" ,(kernel-headers-boot0))))
|
||||
(native-inputs
|
||||
`(("texinfo" ,texinfo-boot0)
|
||||
("perl" ,perl-boot0)))
|
||||
("perl" ,perl-boot0)
|
||||
;; Apply this patch only on i686 to avoid a full rebuild.
|
||||
;; TODO: Remove in the next update cycle.
|
||||
,@(if (string-prefix? "i686" (or (%current-target-system)
|
||||
(%current-system)))
|
||||
`(("glibc-memchr-overflow-i686.patch"
|
||||
,(search-patch "glibc-memchr-overflow-i686.patch")))
|
||||
'())))
|
||||
(inputs
|
||||
`(;; The boot inputs. That includes the bootstrap libc. We don't want
|
||||
;; it in $CPATH, hence the 'pre-configure' phase above.
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
Extracted from glibc upstream git repository. Changes to the ChangeLog have
|
||||
been removed. This patch is needed to fix spurious segmentation faults on
|
||||
i686.
|
||||
|
||||
From 3abeeec5f46ff036bd9df60bb096e20314ccd078 Mon Sep 17 00:00:00 2001
|
||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Tue, 14 Mar 2017 14:16:13 -0300
|
||||
Subject: [PATCH] Fix i686 memchr overflow calculation (BZ#21182)
|
||||
|
||||
This patch fixes the regression added by 23d2770 for final address
|
||||
overflow calculation. The subtraction of the considered size (16)
|
||||
at line 120 is at wrong place, for sizes less than 16 subsequent
|
||||
overflow check will not take in consideration an invalid size (since
|
||||
the subtraction will be negative). Also, the lea instruction also
|
||||
does not raise the carry flag (CF) that is used in subsequent jbe
|
||||
to check for overflow.
|
||||
|
||||
The fix is to follow x86_64 logic from 3daef2c where the overflow
|
||||
is first check and a sub instruction is issued. In case of resulting
|
||||
negative size, CF will be set by the sub instruction and a NULL
|
||||
result will be returned. The patch also add similar tests reported
|
||||
in bug report.
|
||||
|
||||
Checked on i686-linux-gnu and x86_64-linux-gnu.
|
||||
|
||||
* string/test-memchr.c (do_test): Add BZ#21182 checks for address
|
||||
near end of a page.
|
||||
* sysdeps/i386/i686/multiarch/memchr-sse2.S (__memchr): Fix
|
||||
overflow calculation.
|
||||
---
|
||||
string/test-memchr.c | 6 ++++++
|
||||
sysdeps/i386/i686/multiarch/memchr-sse2.S | 2 +-
|
||||
3 files changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/string/test-memchr.c b/string/test-memchr.c
|
||||
index 2403c9242b..669e092e7d 100644
|
||||
--- a/string/test-memchr.c
|
||||
+++ b/string/test-memchr.c
|
||||
@@ -210,6 +210,12 @@ test_main (void)
|
||||
do_test (0, i, i + 1, i + 1, 0);
|
||||
}
|
||||
|
||||
+ /* BZ#21182 - wrong overflow calculation for i686 implementation
|
||||
+ with address near end of the page. */
|
||||
+ for (i = 2; i < 16; ++i)
|
||||
+ /* page_size is in fact getpagesize() * 2. */
|
||||
+ do_test (page_size / 2 - i, i, i, 1, 0x9B);
|
||||
+
|
||||
do_random_tests ();
|
||||
return ret;
|
||||
}
|
||||
diff --git a/sysdeps/i386/i686/multiarch/memchr-sse2.S b/sysdeps/i386/i686/multiarch/memchr-sse2.S
|
||||
index 910679cfc0..e41f324a77 100644
|
||||
--- a/sysdeps/i386/i686/multiarch/memchr-sse2.S
|
||||
+++ b/sysdeps/i386/i686/multiarch/memchr-sse2.S
|
||||
@@ -117,7 +117,6 @@ L(crosscache):
|
||||
|
||||
# ifndef USE_AS_RAWMEMCHR
|
||||
jnz L(match_case2_prolog1)
|
||||
- lea -16(%edx), %edx
|
||||
/* Calculate the last acceptable address and check for possible
|
||||
addition overflow by using satured math:
|
||||
edx = ecx + edx
|
||||
@@ -125,6 +124,7 @@ L(crosscache):
|
||||
add %ecx, %edx
|
||||
sbb %eax, %eax
|
||||
or %eax, %edx
|
||||
+ sub $16, %edx
|
||||
jbe L(return_null)
|
||||
lea 16(%edi), %edi
|
||||
# else
|
||||
--
|
||||
2.12.2
|
||||
|
Reference in New Issue