summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMurphyZhao <[email protected]>2019-03-23 16:36:54 +0800
committerMurphyZhao <[email protected]>2019-03-25 16:50:13 +0800
commit0f673df08ac37f3f1af80943e29b230c5c3f22f0 (patch)
treeff393820f5aa9c5cea44e89c4c65b5414530b462 /src
parent1b0f7db7c36c142dddb417c1cf1deaa5baf9add5 (diff)
[src/kservice.c] 修复 rt_vsnprintf 格式化后宽度不正确的问题
[src/kservice.c] 修复 rt_vsnprintf 处理 size 和 buf 为 0 极端情况的 bug (对 0 地址写入) Signed-off-by: MurphyZhao <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/kservice.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/src/kservice.c b/src/kservice.c
index 3663766225..c940e86d0b 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -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;