Control: tag -1 patch

On Sun, Dec 04, 2016 at 05:35:22PM +0200, Niko Tyni wrote:

> The problem itself seems to be that the gdb macros in
>  lib/App/Stacktrace/perl_backtrace_raw.txt
> cast pointers to the C 'int' type, which is broken on 64-bit
> architectures. For instance, in 'perl_backtrace_5_12_x':
>     set $interpreter = (int) Perl_get_context()
> 
> I suppose it used to work on amd64 because perl used low memory addresses
> so things didn't overflow, but that has changed with the latest perl
> upload, presumably due to gcc PIE changes.

The attached patch makes the test suite pass again for me on amd64.

It should probably be tested on other architectures but one way
to achieve that is to just upload it to experimental or sid.

As noted in the commit message, the thread dumping parts are untested,
and I tried not to touch other code paths than the one we're currently
taking. I might well have got something wrong though; the test suite
is unfortunately not very extensive.

I don't see any rdeps in the archive. Axel: if you are actually using
this module for something, testing there would be very welcome.

Upstream should of course be informed too, though they don't seem
very active (last release was in 2011.)
-- 
Niko Tyni   nt...@debian.org
>From 6712a7b680bf5e88cf30a5251b90872418c320f2 Mon Sep 17 00:00:00 2001
From: Niko Tyni <nt...@debian.org>
Date: Tue, 6 Dec 2016 13:56:46 +0200
Subject: [PATCH] Pointers should be long not int

Casting pointers to int types breaks on 64-bit platforms where Perl uses
memory areas with pointers over 32 bits, which seems to be the case for
PIE (position independent executable) builds.

This only touches the code path relevant to Debian; 5.8, 5.10,
and unthreaded code paths are intended to be unaffected.

The changes to thread dumping parts are untested as they are not covered
by the test suite.

Bug-Debian: https://bugs.debian.org/775744
---
 lib/App/Stacktrace/perl_backtrace_raw.txt | 118 +++++++++++++++---------------
 1 file changed, 59 insertions(+), 59 deletions(-)

diff --git a/lib/App/Stacktrace/perl_backtrace_raw.txt b/lib/App/Stacktrace/perl_backtrace_raw.txt
index 9480e4d..41cf4e6 100644
--- a/lib/App/Stacktrace/perl_backtrace_raw.txt
+++ b/lib/App/Stacktrace/perl_backtrace_raw.txt
@@ -60,13 +60,13 @@ define perl_backtrace_an_interp
         printf "interpreter=%#x\n", $interpreter
         if $interpreter
             x/128xw $interpreter
-            print $stackinfo = (int) *((int*) ($INTERPRETER_curstackinfo + (int) $interpreter))
+            print $stackinfo = (long) *((long*) ($INTERPRETER_curstackinfo + (long) $interpreter))
         else
-            print $stackinfo = (int) *((int*) ($INTERPRETER_curstackinfo + (int) $interpreter))
+            print $stackinfo = (long) *((long*) ($INTERPRETER_curstackinfo + (long) $interpreter))
         end
     else
         if $interpreter
-            set $stackinfo = (int) *((int*) ($INTERPRETER_curstackinfo + (int) $interpreter))
+            set $stackinfo = (long) *((long*) ($INTERPRETER_curstackinfo + (long) $interpreter))
         else
             set $stackinfo = 0
         end
@@ -76,13 +76,13 @@ define perl_backtrace_an_interp
             printf "stackinfo=%#x\n", $stackinfo
             if $stackinfo
                 x/128xw $stackinfo
-                print $cxstack = (int) *((int*) ($STACKINFO_cxstack + (int) $stackinfo))
+                print $cxstack = (long) *((long*) ($STACKINFO_cxstack + (long) $stackinfo))
             else
-                print $cxstack = (int) *((int*) ($STACKINFO_cxstack + (int) $stackinfo))
+                print $cxstack = (long) *((long*) ($STACKINFO_cxstack + (long) $stackinfo))
             end
         else
             if $stackinfo
-                set $cxstack = (int) *((int*) ($STACKINFO_cxstack + (int) $stackinfo))
+                set $cxstack = (long) *((long*) ($STACKINFO_cxstack + (long) $stackinfo))
             else
                 set $cxstack = 0
             end
@@ -91,13 +91,13 @@ define perl_backtrace_an_interp
             printf "stackinfo=%#x\n", $stackinfo
             if $stackinfo
                 x/128xw $stackinfo
-                print $cxix = (int) *((int*) ($STACKINFO_cxix + (int) $stackinfo))
+                print $cxix = (int) *((int*) ($STACKINFO_cxix + (long) $stackinfo))
             else
-                print $cxix = (int) *((int*) ($STACKINFO_cxix + (int) $stackinfo))
+                print $cxix = (int) *((int*) ($STACKINFO_cxix + (long) $stackinfo))
             end
         else
             if $stackinfo
-                set $cxix = (int) *((int*) ($STACKINFO_cxix + (int) $stackinfo))
+                set $cxix = (int) *((int*) ($STACKINFO_cxix + (long) $stackinfo))
             else
                 set $cxix = 0
             end
@@ -108,13 +108,13 @@ define perl_backtrace_an_interp
                 printf "cxstack=%#x\n", $cxstack
                 if $cxstack
                     x/128xw $cxstack
-                    print $context = (int) (($CONTEXT_sizeof * $i) + (int) $cxstack)
+                    print $context = (long) (($CONTEXT_sizeof * $i) + (long) $cxstack)
                 else
-                    print $context = (int) (($CONTEXT_sizeof * $i) + (int) $cxstack)
+                    print $context = (long) (($CONTEXT_sizeof * $i) + (long) $cxstack)
                 end
             else
                 if $cxstack
-                    set $context = (int) (($CONTEXT_sizeof * $i) + (int) $cxstack)
+                    set $context = (long) (($CONTEXT_sizeof * $i) + (long) $cxstack)
                 else
                     set $context = 0
                 end
@@ -123,13 +123,13 @@ define perl_backtrace_an_interp
                 printf "context=%#x\n", $context
                 if $context
                     x/128xw $context
-                    print $type = (int) (((int) *((int*) ($CONTEXT_type + (int) $context))) & $CXTYPEMASK)
+                    print $type = (int) (((int) *((int*) ($CONTEXT_type + (long) $context))) & $CXTYPEMASK)
                 else
-                    print $type = (int) (((int) *((int*) ($CONTEXT_type + (int) $context))) & $CXTYPEMASK)
+                    print $type = (int) (((int) *((int*) ($CONTEXT_type + (long) $context))) & $CXTYPEMASK)
                 end
             else
                 if $context
-                    set $type = (int) (((int) *((int*) ($CONTEXT_type + (int) $context))) & $CXTYPEMASK)
+                    set $type = (int) (((int) *((int*) ($CONTEXT_type + (long) $context))) & $CXTYPEMASK)
                 else
                     set $type = 0
                 end
@@ -140,13 +140,13 @@ define perl_backtrace_an_interp
                     printf "context=%#x\n", $context
                     if $context
                         x/128xw $context
-                        print $cop = (int) *((int*) ($CONTEXT_cop + (int) $context))
+                        print $cop = (long) *((long*) ($CONTEXT_cop + (long) $context))
                     else
-                        print $cop = (int) *((int*) ($CONTEXT_cop + (int) $context))
+                        print $cop = (long) *((long*) ($CONTEXT_cop + (long) $context))
                     end
                 else
                     if $context
-                        set $cop = (int) *((int*) ($CONTEXT_cop + (int) $context))
+                        set $cop = (long) *((long*) ($CONTEXT_cop + (long) $context))
                     else
                         set $cop = 0
                     end
@@ -155,13 +155,13 @@ define perl_backtrace_an_interp
                     printf "cop=%#x\n", $cop
                     if $cop
                         x/128xw $cop
-                        print $file = (char*) *(int*) ($COP_file + (int) $cop)
+                        print $file = (char*) *(long*) ($COP_file + (long) $cop)
                     else
-                        print $file = (char*) *(int*) ($COP_file + (int) $cop)
+                        print $file = (char*) *(long*) ($COP_file + (long) $cop)
                     end
                 else
                     if $cop
-                        set $file = (char*) *(int*) ($COP_file + (int) $cop)
+                        set $file = (char*) *(long*) ($COP_file + (long) $cop)
                     else
                         set $file = 0
                     end
@@ -173,13 +173,13 @@ define perl_backtrace_an_interp
                     printf "cop=%#x\n", $cop
                     if $cop
                         x/128xw $cop
-                        print $line = (int) *((int*) ($COP_line + (int) $cop))
+                        print $line = (int) *((int*) ($COP_line + (long) $cop))
                     else
-                        print $line = (int) *((int*) ($COP_line + (int) $cop))
+                        print $line = (int) *((int*) ($COP_line + (long) $cop))
                     end
                 else
                     if $cop
-                        set $line = (int) *((int*) ($COP_line + (int) $cop))
+                        set $line = (int) *((int*) ($COP_line + (long) $cop))
                     else
                         set $line = 0
                     end
@@ -196,13 +196,13 @@ define perl_backtrace_an_interp
             printf "stackinfo=%#x\n", $stackinfo
             if $stackinfo
                 x/128xw $stackinfo
-                print $stackinfo = (int) *((int*) ($STACKINFO_prev + (int) $stackinfo))
+                print $stackinfo = (long) *((long*) ($STACKINFO_prev + (long) $stackinfo))
             else
-                print $stackinfo = (int) *((int*) ($STACKINFO_prev + (int) $stackinfo))
+                print $stackinfo = (long) *((long*) ($STACKINFO_prev + (long) $stackinfo))
             end
         else
             if $stackinfo
-                set $stackinfo = (int) *((int*) ($STACKINFO_prev + (int) $stackinfo))
+                set $stackinfo = (long) *((long*) ($STACKINFO_prev + (long) $stackinfo))
             else
                 set $stackinfo = 0
             end
@@ -214,13 +214,13 @@ define perl_backtrace_a_thread
         printf "thread=%#x\n", $thread
         if $thread
             x/128xw $thread
-            print $tid = (int) *((int*) ($THREAD_tid + (int) $thread))
+            print $tid = (int) *((int*) ($THREAD_tid + (long) $thread))
         else
-            print $tid = (int) *((int*) ($THREAD_tid + (int) $thread))
+            print $tid = (int) *((int*) ($THREAD_tid + (long) $thread))
         end
     else
         if $thread
-            set $tid = (int) *((int*) ($THREAD_tid + (int) $thread))
+            set $tid = (int) *((int*) ($THREAD_tid + (long) $thread))
         else
             set $tid = 0
         end
@@ -229,9 +229,9 @@ define perl_backtrace_a_thread
         printf "thread=%#x\n", $thread
         if $thread
             x/128xw $thread
-            print $statei = (int) *((int*) ($THREAD_state + (int) $thread))
+            print $statei = (int) *((int*) ($THREAD_state + (long) $thread))
         else
-            print $statei = (int) *((int*) ($THREAD_state + (int) $thread))
+            print $statei = (int) *((int*) ($THREAD_state + (long) $thread))
         end
     else
         if $thread
@@ -274,13 +274,13 @@ define perl_backtrace_a_thread
         printf "thread=%#x\n", $thread
         if $thread
             x/128xw $thread
-            print $interpreter = (int) *((int*) ($THREAD_interpreter + (int) $thread))
+            print $interpreter = (int) *((int*) ($THREAD_interpreter + (long) $thread))
         else
-            print $interpreter = (int) *((int*) ($THREAD_interpreter + (int) $thread))
+            print $interpreter = (int) *((int*) ($THREAD_interpreter + (long) $thread))
         end
     else
         if $thread
-            set $interpreter = (int) *((int*) ($THREAD_interpreter + (int) $thread))
+            set $interpreter = (int) *((int*) ($THREAD_interpreter + (long) $thread))
         else
             set $interpreter = 0
         end
@@ -1399,13 +1399,13 @@ define perl_backtrace_5_12_threads
         printf "interpreter=%#x\n", $interpreter
         if $interpreter
             x/128xw $interpreter
-            print $modglobal = (int) *((int*) ($INTERPRETER_modglobal + (int) $interpreter))
+            print $modglobal = (long) *((long*) ($INTERPRETER_modglobal + (long) $interpreter))
         else
-            print $modglobal = (int) *((int*) ($INTERPRETER_modglobal + (int) $interpreter))
+            print $modglobal = (long) *((long*) ($INTERPRETER_modglobal + (long) $interpreter))
         end
     else
         if $interpreter
-            set $modglobal = (int) *((int*) ($INTERPRETER_modglobal + (int) $interpreter))
+            set $modglobal = (long) *((long*) ($INTERPRETER_modglobal + (long) $interpreter))
         else
             set $modglobal = 0
         end
@@ -1417,7 +1417,7 @@ define perl_backtrace_5_12_threads
                 x/128xw $interpreter
                 printf "modglobal=%#x\n", $modglobal
                 x/128xw $modglobal
-                print $my_pool_svp = (int) Perl_hv_fetch((int) $interpreter, (int) $modglobal, $POOL_KEY, $POOL_KEY_LEN, 0)
+                print $my_pool_svp = (long) Perl_hv_fetch((long) $interpreter, (long) $modglobal, $POOL_KEY, $POOL_KEY_LEN, 0)
             else
                 printf "interpreter=%#x\n", $interpreter
                 x/128xw $interpreter
@@ -1439,7 +1439,7 @@ define perl_backtrace_5_12_threads
     else
         if $interpreter
             if $modglobal
-                set $my_pool_svp = (int) Perl_hv_fetch((int) $interpreter, (int) $modglobal, $POOL_KEY, $POOL_KEY_LEN, 0)
+                set $my_pool_svp = (long) Perl_hv_fetch((long) $interpreter, (long) $modglobal, $POOL_KEY, $POOL_KEY_LEN, 0)
             else
                 set $my_pool_svp = 0
             end
@@ -1452,13 +1452,13 @@ define perl_backtrace_5_12_threads
             printf "my_pool_svp=%#x\n", $my_pool_svp
             if $my_pool_svp
                 x/128xw $my_pool_svp
-                print $my_pool_sv = (int) *((int*) (int) $my_pool_svp)
+                print $my_pool_sv = (long) *((long*) (long) $my_pool_svp)
             else
-                print $my_pool_sv = (int) *((int*) (int) $my_pool_svp)
+                print $my_pool_sv = (long) *((long*) (long) $my_pool_svp)
             end
         else
             if $my_pool_svp
-                set $my_pool_sv = (int) *((int*) (int) $my_pool_svp)
+                set $my_pool_sv = (long) *((long*) (long) $my_pool_svp)
             else
                 set $my_pool_sv = 0
             end
@@ -1467,13 +1467,13 @@ define perl_backtrace_5_12_threads
             printf "my_pool_sv=%#x\n", $my_pool_sv
             if $my_pool_sv
                 x/128xw $my_pool_sv
-                print $my_pool_svval = (int) *((int*) ($SV_any + (int) $my_pool_sv))
+                print $my_pool_svval = (long) *((long*) ($SV_any + (long) $my_pool_sv))
             else
-                print $my_pool_svval = (int) *((int*) ($SV_any + (int) $my_pool_sv))
+                print $my_pool_svval = (long) *((long*) ($SV_any + (long) $my_pool_sv))
             end
         else
             if $my_pool_sv
-                set $my_pool_svval = (int) *((int*) ($SV_any + (int) $my_pool_sv))
+                set $my_pool_svval = (long) *((long*) ($SV_any + (long) $my_pool_sv))
             else
                 set $my_pool_svval = 0
             end
@@ -1482,13 +1482,13 @@ define perl_backtrace_5_12_threads
             printf "my_pool_svval=%#x\n", $my_pool_svval
             if $my_pool_svval
                 x/128xw $my_pool_svval
-                print $my_poolp = (int) *((int*) ($SV_uv + (int) $my_pool_svval))
+                print $my_poolp = (long) *((long*) ($SV_uv + (long) $my_pool_svval))
             else
-                print $my_poolp = (int) *((int*) ($SV_uv + (int) $my_pool_svval))
+                print $my_poolp = (long) *((long*) ($SV_uv + (long) $my_pool_svval))
             end
         else
             if $my_pool_svval
-                set $my_poolp = (int) *((int*) ($SV_uv + (int) $my_pool_svval))
+                set $my_poolp = (long) *((long*) ($SV_uv + (long) $my_pool_svval))
             else
                 set $my_poolp = 0
             end
@@ -1497,13 +1497,13 @@ define perl_backtrace_5_12_threads
             printf "my_poolp=%#x\n", $my_poolp
             if $my_poolp
                 x/128xw $my_poolp
-                print $main_thread = $POOLP_main_thread + (int) $my_poolp
+                print $main_thread = $POOLP_main_thread + (long) $my_poolp
             else
-                print $main_thread = $POOLP_main_thread + (int) $my_poolp
+                print $main_thread = $POOLP_main_thread + (long) $my_poolp
             end
         else
             if $my_poolp
-                set $main_thread = $POOLP_main_thread + (int) $my_poolp
+                set $main_thread = $POOLP_main_thread + (long) $my_poolp
             else
                 set $main_thread = 0
             end
@@ -1528,13 +1528,13 @@ define perl_backtrace_5_12_threads
             printf "main_thread=%#x\n", $main_thread
             if $main_thread
                 x/128xw $main_thread
-                print $thread = (int) *((int*) ($THREAD_next + (int) $main_thread))
+                print $thread = (long) *((long*) ($THREAD_next + (long) $main_thread))
             else
-                print $thread = (int) *((int*) ($THREAD_next + (int) $main_thread))
+                print $thread = (long) *((long*) ($THREAD_next + (long) $main_thread))
             end
         else
             if $main_thread
-                set $thread = (int) *((int*) ($THREAD_next + (int) $main_thread))
+                set $thread = (long) *((long*) ($THREAD_next + (long) $main_thread))
             else
                 set $thread = 0
             end
@@ -1545,13 +1545,13 @@ define perl_backtrace_5_12_threads
                 printf "thread=%#x\n", $thread
                 if $thread
                     x/128xw $thread
-                    print $thread = (int) *((int*) ($THREAD_next + (int) $thread))
+                    print $thread = (long) *((long*) ($THREAD_next + (long) $thread))
                 else
-                    print $thread = (int) *((int*) ($THREAD_next + (int) $thread))
+                    print $thread = (long) *((long*) ($THREAD_next + (long) $thread))
                 end
             else
                 if $thread
-                    set $thread = (int) *((int*) ($THREAD_next + (int) $thread))
+                    set $thread = (long) *((long*) ($THREAD_next + (long) $thread))
                 else
                     set $thread = 0
                 end
@@ -1562,7 +1562,7 @@ define perl_backtrace_5_12_threads
     end
 end
 define perl_backtrace_5_12_x
-    set $interpreter = (int) Perl_get_context()
+    set $interpreter = (long) Perl_get_context()
     if $interpreter
         perl_backtrace_5_12_threads
     else
-- 
2.10.2

Reply via email to