5250 2025-06-06 11:35 采纳率: 0%
浏览 11

fortify扫描提示vsnprintf函数的format参数可能存在溢出,该怎么修复

fortify扫描提示vsnprintf函数的format参数可能存在溢出,该怎么修复
我的代码如下

static void Log(const char * logentry, ...)
{
    char logbuffer[MAX_LEN];
    va_list argsPtr;

    char sanitized_fmt[MAX_LEN];
    const char *src = logentry;
    char *dst = sanitized_fmt;
    int fmt_len = 0;

    while (*src != '\0' && fmt_len < MAX_LEN - 1) {
        if (*src == '%') {
            if (*(src+1) == 's' || *(src+1) == 'd' ||
                *(src+1) == 'f' || *(src+1) == 'c' ||
                *(src+1) == 'u' || *(src+1) == '%') {
                *dst++ = *src++;
                *dst++ = *src++;
                fmt_len += 2;
            }
            else {
                *dst++ = '%';
                *dst++ = 's';
                src += (*(src+1) ? 2 : 1);
                fmt_len += 2;
            }
        }
        else {
            *dst++ = *src++;
            fmt_len++;
        }
    }
    *dst = '\0';

    va_start(argsPtr, logentry);
    vsnprintf(logbuffer, MAX_LEN, sanitized_fmt, argsPtr);
    va_end(argsPtr);

    openlog("portmonitor", LOG_PID, SYSLOG_FACILITY);
    syslog(SYSLOG_LEVEL, "%s", logbuffer);
    closelog();
}

我已经对logentry进行了处理,但是fortify扫描时仍旧发出告警,vsnprintf() format string buffer overflow  我到底该怎么修改可以让这个不再告警呢

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-06-06 11:35
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解决方案

    Fortify扫描提示vsnprintf函数的format参数可能存在溢出,这是因为vsnprintf函数的format参数可能会超过其所能处理的最大长度,从而导致溢出。

    要修复这个问题,可以使用vsnprintf函数的第二个参数来指定输出字符串的最大长度,例如:

    static void Log(const char * logentry, ...)
    {
        va_list args;
        va_start(args, logentry);
        int len = vsnprintf(NULL, 0, logentry, args);
        va_end(args);
    
        if (len < 0) {
            // handle error
        }
    
        char buffer[1024]; // 1024 is a reasonable size for a log buffer
        vsnprintf(buffer, sizeof(buffer), logentry, args);
        // do something with the log buffer
    }
    

    在上面的代码中,我们首先使用va_list和va_start来获取变长参数的列表,然后使用vsnprintf函数来计算输出字符串的长度。最后,我们使用vsnprintf函数将logentry格式化到buffer中,并将buffer作为输出结果。

    这样可以确保vsnprintf函数的format参数不会溢出,并且可以避免可能的安全问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月6日