fix s390x build failure on debian due to wrong type casting
authorFriedrich Beckmann <friedrich.beckmann@gmx.de>
Wed, 24 Jun 2015 21:50:52 +0000 (23:50 +0200)
committerFriedrich Beckmann <friedrich.beckmann@gmx.de>
Wed, 24 Jun 2015 21:58:27 +0000 (23:58 +0200)
    The problem showed up on s390x for the 0.8.5 debian version
    where four graph tests using pdf export failed with the same assertion. The
    problem is due to wrong casting. intptr_t is long int (64 Bit) on s390x
    but nl_langinfo returns 0xd200000000 on s390x where 0 is the integer result.
    This results in wrong but positive height and width values for the paper size.

src/output/measure.c

index 35e5fb3f451814cad4197bda4529b55a34055dc0..358958550199c43f148ba638f9afcf2e56eab03a 100644 (file)
@@ -297,9 +297,12 @@ get_default_paper_size (int *h, int *v)
     return read_paper_conf (getenv ("PAPERCONF"), h, v);
 
 #if HAVE_LC_PAPER
-  /* LC_PAPER is a non-standard glibc extension. */
-  *h = (intptr_t) nl_langinfo(_NL_PAPER_WIDTH) * (72000 / 25.4);
-  *v = (intptr_t) nl_langinfo(_NL_PAPER_HEIGHT) * (72000 / 25.4);
+  /* LC_PAPER is a non-standard glibc extension.
+     The (int)(intptr_t) cast is for 64 Bit Systems where intptr_t
+     translates to 64 Bit long int but the upper 32 Bits have wrong
+     values. The result from nl_langinfo is integer (32 Bit) */
+  *h = (int)(intptr_t) nl_langinfo(_NL_PAPER_WIDTH) * (72000 / 25.4);
+  *v = (int)(intptr_t) nl_langinfo(_NL_PAPER_HEIGHT) * (72000 / 25.4);
   if (*h > 0 && *v > 0)
      return true;
 #endif