ダッシュ:スクリプトにバッククォートが含まれていないのに、「構文エラー:バッククォート置換のEOF」というエラーが発生するのはなぜですか?

ハロルド・フィッシャー
#!/bin/sh --

for set_trap_sig in HUP INT QUIT ALRM TERM; do
    trap -- '
        trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
        kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done

sleep 15 || exit "$?"

スクリプトにSIGINTを送信するとどうなりますか?

user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution

この問題はダッシュに固有のようです。ash、bash、ksh93では、このエラーは発生しません。私のスクリプトにはバッククォート文字すら含まれていないため、これは特に奇妙です。

$?5行目の末尾の二重引用符を削除すると、エラーはなくなります。

私は愚かなことをしているのですか、それともダッシュが遅れているのですか?そして、はい、私は妄想型統合失調症のようなスクリプトを書いていることを知っています。

編集: UbuntuとDebianの最新バージョンにも影響を与える非常に深刻なバグを確立しました。誰かが回避策を知っていますか?

苔むした

簡略化されたテストケースは次のとおりです。

trap '
        trap    - HUP EXIT || exit "$?"
        kill -s HUP    "$$" || exit "$?" ' HUP INT
kill -HUP $$
$ dash dash-bug
dash-bug: 3: /home2/ahq/dash-bug: Syntax error: EOF in backquote substitution

引用符で囲まれたコードの長さや内容を変更すると、バグが「修正」されるか、ランダムなバイトがどこからともなく出現する、さまざまな興味深い破損が発生する可能性があります。

これは、ダッシュ0.5.9以降で修正されたが、Debian 9.8安定版(ストレッチ)、Ubuntu 18.04(バイオニック)、Ubuntu 18.10(宇宙)のダッシュ0.5.8にまだ存在する解放後使用のバグが原因でした。 。

これはそれを修正しコミットです:

commit 6c3f73bc536082fec38bd36e6c8a121033c68835
Author: Herbert Xu <[email protected]>
Date:   Thu Oct 2 08:26:06 2014 +0800

    [EVAL] Fix use-after-free in dotrap/evalstring

    The function dotrap calls evalstring using the stored trap string.
    If evalstring then unsets that exact trap string then we will end
    up using freed memory.

    This patch fixes it by making evalstring always duplicate the string
    before using it.

    Signed-off-by: Herbert Xu <[email protected]>

回避策は、トラップハンドラーを関数に配置することです。これにより、トラップが設定解除された後にコマンドが実行されないように、トラップが解放された後にアクション文字列を使用しようとします。

sighandler(){
    trap - "$sig" EXIT || exit "$?"
    kill -s "$sig" "$$" || exit "$?"
}
for sig in HUP INT QUIT ALRM TERM; do
    trap "sig=$sig; sighandler" "$sig"
done

kill -s HUP "$$"

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ