[src/kservice.c] 修复 rt_vsnprintf 格式化后宽度不正确的问题
[src/kservice.c] 修复 rt_vsnprintf 处理 size 和 buf 为 0 极端情况的 bug (对 0 地址写入) Signed-off-by: MurphyZhao <d2014zjt@163.com>
This commit is contained in:
parent
1b0f7db7c3
commit
0f673df08a
|
@ -668,7 +668,7 @@ static char *print_number(char *buf,
|
|||
|
||||
while (size-- > 0)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = ' ';
|
||||
++ buf;
|
||||
}
|
||||
|
@ -676,11 +676,11 @@ static char *print_number(char *buf,
|
|||
|
||||
if (sign)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
{
|
||||
*buf = sign;
|
||||
-- size;
|
||||
}
|
||||
-- size;
|
||||
++ buf;
|
||||
}
|
||||
|
||||
|
@ -689,16 +689,16 @@ static char *print_number(char *buf,
|
|||
{
|
||||
if (base == 8)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = '0';
|
||||
++ buf;
|
||||
}
|
||||
else if (base == 16)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = '0';
|
||||
++ buf;
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
{
|
||||
*buf = type & LARGE ? 'X' : 'x';
|
||||
}
|
||||
|
@ -712,7 +712,7 @@ static char *print_number(char *buf,
|
|||
{
|
||||
while (size-- > 0)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = c;
|
||||
++ buf;
|
||||
}
|
||||
|
@ -721,7 +721,7 @@ static char *print_number(char *buf,
|
|||
#ifdef RT_PRINTF_PRECISION
|
||||
while (i < precision--)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = '0';
|
||||
++ buf;
|
||||
}
|
||||
|
@ -730,14 +730,14 @@ static char *print_number(char *buf,
|
|||
/* put number in the temporary buffer */
|
||||
while (i-- > 0 && (precision_bak != 0))
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = tmp[i];
|
||||
++ buf;
|
||||
}
|
||||
|
||||
while (size-- > 0)
|
||||
{
|
||||
if (buf <= end)
|
||||
if (buf < end)
|
||||
*buf = ' ';
|
||||
++ buf;
|
||||
}
|
||||
|
@ -769,7 +769,7 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
#endif
|
||||
|
||||
str = buf;
|
||||
end = buf + size - 1;
|
||||
end = buf + size;
|
||||
|
||||
/* Make sure end is always >= buf */
|
||||
if (end < buf)
|
||||
|
@ -782,7 +782,7 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
{
|
||||
if (*fmt != '%')
|
||||
{
|
||||
if (str <= end)
|
||||
if (str < end)
|
||||
*str = *fmt;
|
||||
++ str;
|
||||
continue;
|
||||
|
@ -863,20 +863,20 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
{
|
||||
while (--field_width > 0)
|
||||
{
|
||||
if (str <= end) *str = ' ';
|
||||
if (str < end) *str = ' ';
|
||||
++ str;
|
||||
}
|
||||
}
|
||||
|
||||
/* get character */
|
||||
c = (rt_uint8_t)va_arg(args, int);
|
||||
if (str <= end) *str = c;
|
||||
if (str < end) *str = c;
|
||||
++ str;
|
||||
|
||||
/* put width */
|
||||
while (--field_width > 0)
|
||||
{
|
||||
if (str <= end) *str = ' ';
|
||||
if (str < end) *str = ' ';
|
||||
++ str;
|
||||
}
|
||||
continue;
|
||||
|
@ -894,21 +894,21 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
{
|
||||
while (len < field_width--)
|
||||
{
|
||||
if (str <= end) *str = ' ';
|
||||
if (str < end) *str = ' ';
|
||||
++ str;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < len; ++i)
|
||||
{
|
||||
if (str <= end) *str = *s;
|
||||
if (str < end) *str = *s;
|
||||
++ str;
|
||||
++ s;
|
||||
}
|
||||
|
||||
while (len < field_width--)
|
||||
{
|
||||
if (str <= end) *str = ' ';
|
||||
if (str < end) *str = ' ';
|
||||
++ str;
|
||||
}
|
||||
continue;
|
||||
|
@ -931,7 +931,7 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
continue;
|
||||
|
||||
case '%':
|
||||
if (str <= end) *str = '%';
|
||||
if (str < end) *str = '%';
|
||||
++ str;
|
||||
continue;
|
||||
|
||||
|
@ -953,12 +953,12 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
break;
|
||||
|
||||
default:
|
||||
if (str <= end) *str = '%';
|
||||
if (str < end) *str = '%';
|
||||
++ str;
|
||||
|
||||
if (*fmt)
|
||||
{
|
||||
if (str <= end) *str = *fmt;
|
||||
if (str < end) *str = *fmt;
|
||||
++ str;
|
||||
}
|
||||
else
|
||||
|
@ -995,8 +995,14 @@ rt_int32_t rt_vsnprintf(char *buf,
|
|||
#endif
|
||||
}
|
||||
|
||||
if (str <= end) *str = '\0';
|
||||
else *end = '\0';
|
||||
if (size > 0)
|
||||
{
|
||||
if (str < end) *str = '\0';
|
||||
else
|
||||
{
|
||||
end[-1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
/* the trailing null byte doesn't count towards the total
|
||||
* ++str;
|
||||
|
|
Loading…
Reference in New Issue