Zero out high bytes of 80-bit ldnan master
authorH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Wed, 23 Nov 2016 15:32:39 +0000 (16:32 +0100)
committerH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Wed, 23 Nov 2016 15:32:39 +0000 (16:32 +0100)
1. Backport of dd6885360b15e763e0706dc28555eea328de432d

   fix garbage filtering with 80-bit long doubles

   The test had several problems that resulted in the excess
   bytes not getting zeroed out. This caused random contents in
   $Config{longdblinfbytes}, observed on Debian with GCC 6.2.0 (but not
   5.4.1).

   Bug-Debian: https://bugs.debian.org/844752

2. Backport of 6b2c7479d6d33249c2385d8a36d8ee9e61e1a519

   also zero out high bytes of 80-bit ldnan

   These are currently zero anyway, but things are probably not guaranteed
   to stay so.

U/perl/infnan.U

index b09e1f0..7a248cd 100644 (file)
@@ -54,8 +54,8 @@ $cat >try.c <<EOP
 #define DOUBLESIZE $doublesize
 #$d_longdbl HAS_LONG_DOUBLE
 #ifdef HAS_LONG_DOUBLE
-#define LONGDBLSIZE $longdblsize
-#define LONGDBLKIND $longdblkind
+#define LONG_DOUBLESIZE $longdblsize
+#define LONG_DOUBLEKIND $longdblkind
 #endif
 #$i_math I_MATH
 #ifdef I_MATH
@@ -92,16 +92,15 @@ int main(int argc, char *argv[]) {
 #ifdef HAS_LONG_DOUBLE
    long double ldinf = (long double)exp(1e9);
    long double ldnan = (long double)sqrt(-1.0);
-#endif
-  if (argc == 2) {
-    switch (argv[1][0]) {
-    case '1': bytes(&dinf, sizeof(dinf)); break;
-    case '2': bytes(&dnan, sizeof(dnan)); break;
-#ifdef HAS_LONG_DOUBLE
 # if LONG_DOUBLEKIND == 3 || LONG_DOUBLEKIND == 4
 /* the 80-bit long doubles might have garbage in their excess bytes */
     memset((char *)&ldinf + 10, '\0', LONG_DOUBLESIZE - 10);
+    memset((char *)&ldnan + 10, '\0', LONG_DOUBLESIZE - 10);
 # endif
+  if (argc == 2) {
+    switch (argv[1][0]) {
+    case '1': bytes(&dinf, sizeof(dinf)); break;
+    case '2': bytes(&dnan, sizeof(dnan)); break;
     case '3': bytes(&ldinf, sizeof(ldinf)); break;
     case '4': bytes(&ldnan, sizeof(ldnan)); break;
 #endif