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