lwip_itoa: check 'bufsize' instead of ignoring it; ensure code is not stolen from GPL

This commit is contained in:
goldsimon 2017-04-20 21:57:03 +02:00
parent 3770adccfd
commit 131d656c23

View File

@ -197,26 +197,47 @@ lwip_strnicmp(const char* str1, const char* str2, size_t len)
void void
lwip_itoa(char* result, size_t bufsize, int number) lwip_itoa(char* result, size_t bufsize, int number)
{ {
const int base = 10; char *res = result;
char* ptr = result, *ptr1 = result, tmp_char; char *tmp = result;
int tmp_value; size_t res_left = bufsize;
LWIP_UNUSED_ARG(bufsize); size_t result_len;
int n = (number > 0) ? number : -number;
do { /* handle invalid bufsize */
tmp_value = number; if (bufsize < 2) {
number /= base; if (bufsize == 1) {
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - number * base)]; *result = 0;
} while(number); }
return;
}
/* Apply negative sign */ /* ensure output string is zero terminated */
if (tmp_value < 0) { result[bufsize-1] = 0;
*ptr++ = '-'; result_len = 1;
/* create the string in a temporary buffer since we don't know how long
it will get */
tmp = &result[bufsize-2];
while ((n != 0) && (result_len < (result_len - 1))) {
char val = '0' + (n % 10);
*tmp = val;
tmp--;
n = n / 10;
result_len++;
} }
*ptr-- = '\0';
while(ptr1 < ptr) { /* output sign first */
tmp_char = *ptr; if (number < 0) {
*ptr--= *ptr1; *res = '-';
*ptr1++ = tmp_char; res++;
res_left--;
} }
if (result_len > res_left) {
/* buffer is too small */
result[0] = '.';
result[1] = 0;
return;
}
/* copy from temporary buffer to output buffer */
memmove(res, tmp+1, result_len);
} }
#endif #endif