The strl2ic() and strl2uic() primitives used to convert string to
integers could return 10 times the value read if they stopped on
non-digit because of a mis-placed loop exit.
static inline unsigned int __strl2uic(const char *s, int len)
{
unsigned int i = 0;
- unsigned int j;
+ unsigned int j, k;
while (len-- > 0) {
j = (*s++) - '0';
- i = i * 10;
+ k = i * 10;
if (j > 9)
break;
- i += j;
+ i = k + j;
}
return i;
}
int strl2ic(const char *s, int len)
{
int i = 0;
- int j;
+ int j, k;
if (len > 0) {
if (*s != '-') {
/* positive number */
while (len-- > 0) {
j = (*s++) - '0';
- i = i * 10;
+ k = i * 10;
if (j > 9)
break;
- i += j;
+ i = k + j;
}
} else {
/* negative number */
s++;
while (--len > 0) {
j = (*s++) - '0';
- i = i * 10;
+ k = i * 10;
if (j > 9)
break;
- i -= j;
+ i = k - j;
}
}
}