libs/web: fix sanitize_utf8(), passes all testcases now

This commit is contained in:
Jo-Philipp Wich 2010-11-12 22:48:17 +00:00
parent 09e71acf6b
commit 8ac568acb0

View file

@ -181,8 +181,6 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
unsigned char *ptr = *s;
unsigned int o = 0, v, n;
//for (o = 0; o < l; o++)
{
/* ascii byte without null */
if ((*(ptr+0) >= 0x01) && (*(ptr+0) <= 0x7F))
{
@ -245,7 +243,6 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
o = 1;
ptr++;
}
}
*s = ptr;
return o;
@ -256,15 +253,28 @@ char * sanitize_utf8(const char *s, unsigned int l)
{
struct template_buffer *buf = buf_init();
unsigned char *ptr = (unsigned char *)s;
unsigned int v, o;
if (!buf)
return NULL;
if (!_validate_utf8(&ptr, l, buf))
for (o = 0; o < l; o++)
{
free(buf->data);
free(buf);
return NULL;
/* ascii char */
if ((*ptr >= 0x01) && (*ptr <= 0x7F))
{
if (!buf_putchar(buf, *ptr++))
break;
}
/* invalid byte or multi byte sequence */
else
{
if (!(v = _validate_utf8(&ptr, l - o, buf)))
break;
o += (v - 1);
}
}
return buf_destroy(buf);