c - C 中 va_list 可能存在缓冲区溢出漏洞?

标签 c overflow buffer variadic-functions

我有以下代码:

int ircsocket_print(char *message, ...)
{
    char buffer[512];
    int iError;
    va_list va;
    va_start(va, message);
    vsprintf(buffer, message, va);
    va_end(va);
    send(ircsocket_connection, buffer, strlen(buffer), 0);
    return 1;
}

而且我想知道这段代码是否容易通过向变量列表提供大小大于 512 的字符数组而导致缓冲区溢出?如果是这样 - 我该如何解决这个问题?

谢谢。

最佳答案

是的,它很脆弱。

您可以这样实现您的功能:

int ircsocket_print(char *message, ...)
{
    char buf[512];
    char *buffer;
    int len;
    va_list va;

    buffer = buf;
    va_start(va, message);
    len = vsnprintf(buffer, 512, message, va);
    va_end(va);

    if (len >= 512)
    {
        buffer = (char*)malloc(len + 1);
        va_start(va, message);
        len = vsnprintf(buffer, len + 1, message, va);
        va_end(va);
    }

    send(ircsocket_connection, buffer, len, 0);

    if (buffer != buf)
        free(buffer);
    return 1;
}

关于c - C 中 va_list 可能存在缓冲区溢出漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215921/

相关文章:

c - 不是一切都在它应该在的地方,为什么会出现段错误?

javascript - 用 "..."替换 overflow hidden

css - 将溢出放入父容器

html - 如何为垂直堆叠的按钮放置滚动条?

C 溢出需要一些指导

c++ - 将缓冲区发送到 boost::asio::buffer 后是否需要删除缓冲区?

c - 如何从文件或输入中去除除十六进制以外的所有内容?

c - glibc/realloc/无效指针

c - 缓冲区在堆栈上是什么样子

我可以缩短我重复使用的函数名称吗?