【问题标题】:segfaults when compiling on newer version of glibc ( 2.3 -> 2.10 )在较新版本的 glibc ( 2.3 -> 2.10 ) 上编译时出现段错误
【发布时间】:2011-05-07 23:05:43
【问题描述】:

我尝试从 kdvelectronics 站点将 ssh 会话记录补丁修改为 sshd。

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

核心是由 `sshd: root [priv] '生成的。 程序以信号 11 终止,分段错误。 #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 中发生了什么变化,这些函数导致了段错误或在哪里阅读它。

【问题讨论】:

  • glibc 内部的段错误并不意味着它是 glibc 的错。如果你传入一个无效的指针/字符串,就会发生不好的事情。
  • 是的,我明白了,似乎有些地方发生了变化,但很难找到,因为 glibc 更改日志至少可以说是巨大的。

标签: c linux glibc openssh


【解决方案1】:

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

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

Ofc 很脏,但是可以。

【讨论】:

  • 我不认为用 FILENAME_MAX+1 代替 sizeof(logname) 应该有什么不同。您可以根据声明 logname 的方式验证这些值是否相同。我怀疑只是取消注释掉加载日志名的第 50 行 strftime() 是实际修复,而不是对 FILENAME_MAX+1 的更改。
  • 我已将其退回,删除了我所有的评论标志并将 sizeof(...) 更改为它们各自的 FILENAME_MAX+1 定义。是的,它们的值应该是相同的,但不知何故 FILENAME_MAX+1 有所不同,现在 sshd 可以按预期工作。
【解决方案2】:

我相信您的代码崩溃的原因是(注释掉了第 50 行)您在第 60 行使用 logname 时留下了未定义的内容。您提到您从第 53 行删除了 logname 引用连同注释掉第 50 行——在这种情况下,也许您只是忘记将其从第 60 行中删除?

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 2011-07-12
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多