Failing shell code under busybox 1.36.1 that worked with 1.31.1

Harvey harv at gmx.de
Wed Feb 14 18:18:09 UTC 2024


Sorry, posted the wrong version of the pack_args() funtion:
I have payed with possible solutions for so long that I forgot the
restore the original before posting  -blush-

Here is the original version:
------------------------------------------------------------------------

# Packs arguments into a single string.
#
# Input:
#   $1 = name of variable receiving the arguments in such a way that
#        (re)evaluating them provides the original arguments
#   $2... = arguments
# Example:
#   func() {
#     local args
#     pack_args args "$@"
#     send_rpc func_impl "$args"
#   }
#   # (in another process)
#   receive_rpc() {
#     local func="$1"
#     local args="$2"
#     eval $func "$args"
#   }
pack_args()
{
     local _p _resvar=$1 _result= _value
     shift
     for _p
     do
         _result="$_result '${_p//'/'\"'\"'}'"
     done
     eval $_resvar=\${_result\# }
}
------------------------------------------------------------------------

Harvey

Am 14.02.24 um 19:06 schrieb Harvey:
> Hello,
>
> I am part of the team of a small router distribution called fli4l:
> https://www.fli4l.de/doku.php?id=start.
>
> We use buildroot to generate our images. Due to a hardware crash and the
> leaving of our main developer we are facing the dead of our project. But
> there are still some people left and at least we want to try to keep it
> alive 😉
>
> That said - the first we have to try is the update of our buildroot
> base. A lot of work is already done and but we struggle with the busybox
> update, especially with the ash shell contained. When updating to
> Version 1.36.1 we are facing script failures in places that did work
> until busybox 1.31.1.
>
> I have tried to debug the code and it seems that the error is contained
> in a helper include for string handling.
>
> The code is:
> ------------------------------------------------------------------------
> # Packs arguments into a single string.
> #
> # Input:
> #   $1 = name of variable receiving the arguments in such a way that
> #        (re)evaluating them provides the original arguments
> #   $2... = arguments
> # Example:
> #   func() {
> #     local args
> #     pack_args args "$@"
> #     send_rpc func_impl "$args"
> #   }
> #   # (in another process)
> #   receive_rpc() {
> #     local func="$1"
> #     local args="$2"
> #     eval $func "$args"
> #   }
> pack_args()
> {
>      local _p _resvar=$1 _result= _value
>      shift
>      for _p
>      do
>          _result="$_result '${_p//'/'\"'\"'}''"
>      done
>      eval $_resvar=\${_result\# }
> }
> ------------------------------------------------------------------------
>
> The debug trace (using set -x) in V1.31.1 looks like this:
>
> + pack_args exit_trap_0 sync_unlock_all_resources
> + local _p '_resvar=exit_trap_0' '_result=' _value
> + shift
> + _result=' '"'"'sync_unlock_all_resources'"'"
> + eval 'exit_trap_0=${_result#' '}'
> + exit_trap_0=''"'"'sync_unlock_all_resources'"'"
> + exit_trap_num=1
> + return 0
>
> ------------------------------------------------------------------------
> while in V1.36.1 it looks like this:
>
> + pack_args exit_trap_0 sync_unlock_all_resources
> + local _p '_resvar=exit_trap_0' '_result=' _value
> + shift
> + _result=' '"'"'sync_unlock_all_resources'
>                                            ^^^^ missing quote
> + eval 'exit_trap_0=${_result#' '}'
> + exit_trap_0=''"'"'sync_unlock_all_resources'
>                                               ^^^^ missing quote
> + exit_trap_num=1
> + return 0
>
> The eval line then fails with 'Unterminated quoted string'
>
> Unfortunately I can't tell where the difference lies.
>
> I hope someone can help or at least point me in the right direction.
>
> Greetings
> Harvey
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list