Mail archive

Re: [alpine-devel] [PATCH 2/3] init: fix quoting issue for kernel arguments

From: Przemysław Pawełczyk <>
Date: Wed, 30 Nov 2016 00:17:58 +0100

 ---- On Thu, 17 Nov 2016 02:52:51 +0100 Shiz <> wrote ----
> The kernel passes arguments from /proc/cmdline as a single string like
> foo=bar baz="something with spaces". In the latter case, with the added
> single quotes the actual value of ${KOPT_baz} would contain these quotes
> as well, which is not the intention.

Description is a bit wrong. Kernel provides arguments used during boot
via /proc/cmdline as a single text line.

The problem is that

    set -- $(cat /proc/cmdline)

doesn't do what you think it does (or at least what your patch assumes).
There is even a comment earlier:

    # read the kernel options. we need surve things like:
    # acpi_osi="!Windows 2006" xen-pciback.hide=(01:00.0)

to hint that it's not an easy matter.
If you'd perform in POSIX sh:

    ./script acpi_osi="!Windows 2006" xen-pciback.hide='(01:00.0)'

Then $1 would be equal to 'acpi_osi=!Windows 2006'
and $2 would be queal to 'xen-pciback.hide=(01:00.0)'
(single-quoting around value of xen-pciback.hide in ./script call was
necessary to avoid interpreting of parenthesis and raising error).
Both without the single-quotes, of course.
(Actually in bash you'd have to change double-quoting in first argument
to single-quoting too, because otherwise ! is interpreted and you get

But if you do:

    echo 'acpi_osi="!Windows 2006" xen-pciback.hide=(01:00.0)' >cmdline
    ./script $(cat cmdline)


$1 = 'acpi_osi="!Windows'
$2 = '2006"'
$3 = 'xen-pciback.hide=(01:00.0)'
All without the single-quotes, of course.

so it's not what we want.
We don't have information about real argument boundaries.

What we need is to reassemble arguments. Something akin to recreating
"$_at_" from $*. It's quite hard to do in POSIX sh. I spend some time
yesterday and I came up with:

It's not perfect, it's not a beauty, but I think it's very good
approximation of what we need and it works (it handles many cases, but
obviously not all of them - doing it in shell is more than cumbersome).
The code (w/o show current arguments part) should be put after
set -- $(cat /proc/cmdline), and then your patch should be reverted
(i.e. single-quoting in eval KOPT_${i} assignment should be restored).

I hoped to provide such patch, but it's already so late, that I won't do
it today and I am merely informing about the problem.
I'm also starting to doubt that ncopa will happily include additional
150 lines in, even if they work, so it may be better
to get some kind of half-ACK at least before preparing the patch.


> ---
> | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> diff --git a/ b/
> index 78bcbe4..9aa1d3f 100755
> --- a/
> +++ b/
> _at_@ -279,7 +279,7 @@ for opt; do
> for i in $myopts; do
> case "$opt" in
> - $i=*) eval "KOPT_${i}='${opt#*=}'";;
> + $i=*) eval "KOPT_${i}=${opt#*=}";;
> $i) eval "KOPT_${i}=yes";;
> no$i) eval "KOPT_${i}=no";;
> esac
> --
> 2.10.0

Received on Wed Nov 30 2016 - 00:17:58 UTC