在较新版本的glibc上编译时出现段错误(2.3 - > 2.10)

时间:2010-11-10 15:34:13

标签: c linux glibc openssh

我尝试从kdvelectronics网站修改ssh会话日志补丁到sshd。

代码从openssh 4.x到5.x没有太大变化,但是现在当script_open函数调用时(如gdb所说)sshd段错误

Core was generated by `sshd: root [priv]        '.
Program terminated with signal 11, Segmentation fault.
#0  0x00007f687910ae69 in vfprintf () from /lib/libc.so.6
(gdb) bt
#0  0x00007f687910ae69 in vfprintf () from /lib/libc.so.6
#1  0x00007f68791a98c2 in __fprintf_chk () from /lib/libc.so.6
#2  0x000000000044ed03 in script_open ()
#3  0x000000000040ad2c in main ()

崩溃的代码是:

strftime(logname, sizeof(logname), "%F.%T", gmtime(&tvec));

snprintf(fname, sizeof(fname), "%s/openssh.%s.%08x.typescript", SCRIPTDIR, username, rnd);

完整的script.c列表在这里http://pastebin.com/48B39K8s,我已经注释了第50行并从第53行删除了logname变量。

我只是想知道,自2.3以来glibc中的变化是这些函数导致了段错误或者在哪里阅读它。

2 个答案:

答案 0 :(得分:0)

好的,结果很简单。我已将提到的字符串更改为

strftime(logname, FILENAME_MAX+1, "%F.%T", gmtime(&tvec));
snprintf(fname, FILENAME_MAX+1, "%s/openssh.%s.%08x.typescript", SCRIPTDIR, username, rnd);

它很脏,但很有效。

答案 1 :(得分:0)

我相信您的代码崩溃的原因是(在第50行已注释掉)您在第60行使用时已将logname留下未定义的内容。您提到已删除logname第53行的引用以及第50行的注释 - 也许你只是忘了在那种情况下从第60行删除它?