mirror of
https://git.zx2c4.com/cgit
synced 2024-11-22 16:38:42 +00:00
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:
parent
c94414a4c8
commit
48434780ca
9
html.c
9
html.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user