libhv icon indicating copy to clipboard operation
libhv copied to clipboard

输出长日志崩溃

Open wanglxchina opened this issue 8 months ago • 1 comments

vsnprintf用法貌似不对

#include <stdio.h>
#include <stdarg.h>

int vsnprintf(char *str, size_t size, const char *format, va_list ap);
  1. 如果输出的字符串长度小于 size,返回实际写入的字符数(不包括字符串结束符 '\0')。
  2. 如果输出的字符串长度大于等于 size,返回如果有足够空间时本应写入的字符数(不包括字符串结束符 '\0')。这意味着返回值可能会大于 size - 1。

hlog.c下面这段代码没有考虑第二种长度超出size的情况,造成len+=..后len值错误

case 's':
{
    va_list ap;
    va_start(ap, fmt);
    len += vsnprintf(buf + len, bufsize - len, fmt, ap);
    va_end(ap);
}

wanglxchina avatar Apr 25 '25 07:04 wanglxchina

这并不是这一处vsnprintf用法问题,还有其他地方也存在可能因超出bufSize导致崩溃,根本问题在于hlog并不是防御性编码风格主动做了参数检查防止超出bufSize,这样的函数属于契约式编码,要求打印log时调用者必须确保绝不超过bufSize,默认bufSize=16k,可通过logger_set_max_bufsize调整。

House-Men avatar Apr 25 '25 09:04 House-Men