带有回显的分段错误

带有回显的分段错误

我正在使用 echoing 程序测试 Smokeping 的 DNS 探测文档,但对我来说,当通过 Smokeping 执行命令时,这会导致分段错误。我抓住了 Smokeping 试图运行的命令systemctl status smokeping.service,并尝试以我的普通用户和根用户身份运行它:

echoping -w 1 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.com -t AAAA --tcp facebook.com

它退出的原因是:Segmentation fault (core dumped)

strace输出是这里

我的测试盒的发行版是Arch Linux 4.20内核。我也在 LTS 内核 4.19 上对此进行了测试,但也不成功。

有任何想法吗?

编辑:

Smokeping 正在尝试运行的实际命令:

echoping -w 1 -P 0xa0 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.com -t AAAA --tcp facebook.com

(我错过了,-P 0xa0因为我尝试在发布之前省略该标志,但应该在我最近运行的命令之前复制该命令......)

更新:

从核心转储回溯:

$ gdb /usr/bin/echoping core.27236 
GNU gdb (GDB) 8.2.1
...
Reading symbols from /usr/bin/echoping...(no debugging symbols found)...done.
[New LWP 27236]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Core was generated by `echoping -w 1 -P 0xa0 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.c'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f73c938246a in init () from /usr/lib/echoping/dns.so

(gdb) backtrace full
#0  0x00007f73c938246a in init () from /usr/lib/echoping/dns.so
No symbol table info available.
#1  0x0000564855557d58 in main ()
No symbol table info available.

答案1

这只是 中的一个错误echoping(1),您应该去报告它(在检查他们是否尚未在上一个版本中修复它之后)。


util.c其源代码文件中,他们有这个小 cx-er:

char           *
to_upper(char *input)
{
        int             c;
        char           *result;
        result = (char *) malloc(strlen(input));
        for (c = 0; c < strlen(input); c++)
                result[c] = toupper((int)input[c]);
        result[strlen(input)] = '\0';
        return result;
}

请注意如何result[strlen(input)]写入超出使用 分配的缓冲区长度的 1 个字节malloc()

但这还不是全部。他们没有声明正确的原型to_upper()(在 x86-64 上返回 64 位指针),而是让编译器假设它返回 32 位 int 并强制施法它的返回值(char*)plugins/dns/dns.c

char           *
init(const int argc, const char **argv)
{
   ...
                upper_type_name = (char *) to_upper(type_name);

后者确实杀死了它,我认为这并没有曾经在 x86-64 上运行;您唯一的希望是将系统配置为多体系结构并安装echoping为 32 位二进制文​​件; debian 的示例(未测试):

apt-get remove echoping
dpkg --add-architecture i386
apt-get update
apt-get install echoping:i386

apt-get source echoping[我使用了debian 9 中的echoping-6.0.2 源代码。 ]

相关内容