]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scripts/decode_stacktrace.sh: support old bash version
authorSchspa Shi <schspa@gmail.com>
Fri, 29 Apr 2022 21:37:57 +0000 (14:37 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Feb 2024 07:42:31 +0000 (08:42 +0100)
[ Upstream commit 3af8acf6aff2a98731522b52927429760f0b8006 ]

Old bash version don't support associative array variables.  Avoid to use
associative array variables to avoid error.

Without this, old bash version will report error as fellowing
[   15.954042] Kernel panic - not syncing: sysrq triggered crash
[   15.955252] CPU: 1 PID: 167 Comm: sh Not tainted 5.18.0-rc1-00208-gb7d075db2fd5 #4
[   15.956472] Hardware name: Hobot J5 Virtual development board (DT)
[   15.957856] Call trace:
./scripts/decode_stacktrace.sh: line 128: ,dump_backtrace: syntax error: operand expected (error token is ",dump_backtrace")

Link: https://lkml.kernel.org/r/20220409180331.24047-1-schspa@gmail.com
Signed-off-by: Schspa Shi <schspa@gmail.com>
Cc: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Stable-dep-of: efbd63983533 ("scripts/decode_stacktrace.sh: optionally use LLVM utilities")
Signed-off-by: Sasha Levin <sashal@kernel.org>
scripts/decode_stacktrace.sh

index 5bdf610f33d2150d6edefe1f0900368d1cc0d89f..51d48bf65fd76e4166341f4bfb2fb7a81c1757c0 100755 (executable)
@@ -33,8 +33,13 @@ else
        release=""
 fi
 
-declare -A cache
-declare -A modcache
+declare aarray_support=true
+declare -A cache 2>/dev/null
+if [[ $? != 0 ]]; then
+       aarray_support=false
+else
+       declare -A modcache
+fi
 
 find_module() {
        if [[ "$modpath" != "" ]] ; then
@@ -74,7 +79,7 @@ parse_symbol() {
 
        if [[ $module == "" ]] ; then
                local objfile=$vmlinux
-       elif [[ "${modcache[$module]+isset}" == "isset" ]]; then
+       elif [[ $aarray_support == true && "${modcache[$module]+isset}" == "isset" ]]; then
                local objfile=${modcache[$module]}
        else
                local objfile=$(find_module)
@@ -82,7 +87,9 @@ parse_symbol() {
                        echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2
                        return
                fi
-               modcache[$module]=$objfile
+               if [[ $aarray_support == true ]]; then
+                       modcache[$module]=$objfile
+               fi
        fi
 
        # Remove the englobing parenthesis
@@ -102,7 +109,7 @@ parse_symbol() {
        # Use 'nm vmlinux' to figure out the base address of said symbol.
        # It's actually faster to call it every time than to load it
        # all into bash.
-       if [[ "${cache[$module,$name]+isset}" == "isset" ]]; then
+       if [[ $aarray_support == true && "${cache[$module,$name]+isset}" == "isset" ]]; then
                local base_addr=${cache[$module,$name]}
        else
                local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}')
@@ -110,7 +117,9 @@ parse_symbol() {
                        # address not found
                        return
                fi
-               cache[$module,$name]="$base_addr"
+               if [[ $aarray_support == true ]]; then
+                       cache[$module,$name]="$base_addr"
+               fi
        fi
        # Let's start doing the math to get the exact address into the
        # symbol. First, strip out the symbol total length.
@@ -126,11 +135,13 @@ parse_symbol() {
 
        # Pass it to addr2line to get filename and line number
        # Could get more than one result
-       if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then
+       if [[ $aarray_support == true && "${cache[$module,$address]+isset}" == "isset" ]]; then
                local code=${cache[$module,$address]}
        else
                local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null)
-               cache[$module,$address]=$code
+               if [[ $aarray_support == true ]]; then
+                       cache[$module,$address]=$code
+               fi
        fi
 
        # addr2line doesn't return a proper error code if it fails, so