html: fix strcpy bug in convert_query_hexchar

The source and destination strings in strcpy() may not overlap.
Instead, use memmove(), which allows overlap.  This fixes test t0104,
where 'url=foo%2bbar/tree' was being parsed improperly.

Signed-off-by: Mark Lodato <lodatom@gmail.com>
This commit is contained in:
Mark Lodato 2010-08-27 21:02:27 -04:00 committed by Lars Hjemli
parent c94414a4c8
commit 48434780ca

9
html.c
View File

@ -240,19 +240,20 @@ int hextoint(char c)
char *convert_query_hexchar(char *txt) char *convert_query_hexchar(char *txt)
{ {
int d1, d2; int d1, d2, n;
if (strlen(txt) < 3) { n = strlen(txt);
if (n < 3) {
*txt = '\0'; *txt = '\0';
return txt-1; return txt-1;
} }
d1 = hextoint(*(txt+1)); d1 = hextoint(*(txt+1));
d2 = hextoint(*(txt+2)); d2 = hextoint(*(txt+2));
if (d1<0 || d2<0) { if (d1<0 || d2<0) {
strcpy(txt, txt+3); memmove(txt, txt+3, n-3);
return txt-1; return txt-1;
} else { } else {
*txt = d1 * 16 + d2; *txt = d1 * 16 + d2;
strcpy(txt+1, txt+3); memmove(txt+1, txt+3, n-2);
return txt; return txt;
} }
} }