【问题标题】:Is there a C function like sprintf in the Linux kernel?Linux内核中是否有像sprintf这样的C函数?
【发布时间】:2012-09-04 13:15:24
【问题描述】:

Linux内核中是否有sprintf()之类的功能(例如printf()->printk())?

【问题讨论】:

  • 请注意,对于许多用例,seq_file 接口更适合。 (如果您使用seq_path()seq_escape() 工具,请记住包含` in the set of escape'd characters. I've tried to push related bugfixes (in e.g. /proc`)但是获得这样的“极端情况”任何形式的识别都是一个太大的问题,所以如果你引入此类错误,您很可能只需要永远忍受它们。)

标签: c linux-kernel printf


【解决方案1】:

是的。 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/lib/vsprintf.c#n1828

int snprintf(char *buf, size_t size, const char *fmt, ...)
{
    va_list args;
    int i;

    va_start(args, fmt);
    i = vsnprintf(buf, size, fmt, args);
    va_end(args);

    return i;
}
EXPORT_SYMBOL(snprintf);

sprintf() 本身就容易发生缓冲区溢出。 CERT buffer overflowsApple

【讨论】:

  • 我应该包含哪个标题?
  • 这个http://lxr.linux.no/linux+v3.5.3/include/linux/kernel.h#L323位于linux/include/linux/kernel.h
  • 这个和其他一些有用的功能(scnptintfsnprintf等)的实现以及它们的描述在lib/vsprintf.c中。这些函数有一些有用的特性,而它们的用户空间对应函数没有(例如%pS)。
  • 这个答案是错误的。上面提到的代码没有内置到内核中。内核中可用的 sprintf() 版本在 lib/vsprintf.c 我编辑了答案,但被不知道他们在说什么的人拒绝了。
  • 您能否扩展您的答案以提及 kasfprintf() 等选项?
【解决方案2】:

是的,只需包含 linux/kernel.h

【讨论】:

    【解决方案3】:

    是的,例如 here 可以签出

    你可以使用grep来查看它是否在内核的源代码中

    【讨论】:

      【解决方案4】:

      在实时 2.6 内核上运行崩溃确认 sprintf() 已定义,以及它的定义位置。

      崩溃> sym sprintf

      ffffffff81267ba0 (T) sprintf ../debug/kernel-2.6.39/linux-2.6.39-400.210.2.el6uek/lib/vsprintf.c: 1442

      【讨论】:

        【解决方案5】:

        sprintf() 不安全,因为缓冲区溢出。 如果需要将数据从用户空间传递到内核空间,请改用copy_from_user();它的作用类似于copy_to_user(),但方向相反。

        【讨论】:

          猜你喜欢
          • 2018-07-26
          • 1970-01-01
          • 2023-03-06
          • 2013-04-02
          • 2015-12-06
          • 2017-04-08
          • 1970-01-01
          • 2015-04-10
          • 2021-03-28
          相关资源
          最近更新 更多