#!/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] 删除。
我来说两句