guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/01: gnu: glibc/linux: Fix runtime crashes on i686 systems.


From: Ricardo Wurmus
Subject: 01/01: gnu: glibc/linux: Fix runtime crashes on i686 systems.
Date: Sat, 29 Apr 2017 17:32:54 -0400 (EDT)

rekado pushed a commit to branch master
in repository guix.

commit b2fd8f63679aa4f244c36fdca62f23c00b8eded9
Author: Ricardo Wurmus <address@hidden>
Date:   Wed Apr 26 13:03:48 2017 +0200

    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.
---
 gnu/local.mk                                       |  1 +
 gnu/packages/base.scm                              | 20 +++++-
 gnu/packages/commencement.scm                      | 10 ++-
 .../patches/glibc-memchr-overflow-i686.patch       | 74 ++++++++++++++++++++++
 4 files changed, 103 insertions(+), 2 deletions(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index da2e82f..f5574ec 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -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             \
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 9fcca45..6dc9e97 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -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
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 92f6e6c..4fa34c9 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -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.
diff --git a/gnu/packages/patches/glibc-memchr-overflow-i686.patch 
b/gnu/packages/patches/glibc-memchr-overflow-i686.patch
new file mode 100644
index 0000000..0b1b5b9
--- /dev/null
+++ b/gnu/packages/patches/glibc-memchr-overflow-i686.patch
@@ -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 <address@hidden>
+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
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]