--- wget-1.10.2/src/http.c.escapechars 2007-02-12 06:18:40.000000000 -0500 +++ wget-1.10.2/src/http.c 2007-02-12 06:18:20.000000000 -0500 @@ -741,6 +741,20 @@ xfree (resp); } +/* Print a single line of response, the characters [b, e). We tried + getting away with + logprintf (LOG_VERBOSE, "%s%.*s\n", prefix, (int) (e - b), b); + but that failed to escape the non-printable characters and, in fact, + caused crashes in UTF-8 locales. */ + +static void +print_response_line(const char *prefix, const char *b, const char *e) +{ + char *copy; + BOUNDED_TO_ALLOCA(b, e, copy); + logprintf (LOG_VERBOSE, "%s%s\n", prefix, escnonprint(copy)); +} + /* Print the server response, line by line, omitting the trailing CRLF from individual header lines, and prefixed with PREFIX. */ @@ -759,9 +773,7 @@ --e; if (b < e && e[-1] == '\r') --e; - /* This is safe even on printfs with broken handling of "%.s" - because resp->headers ends with \0. */ - logprintf (LOG_VERBOSE, "%s%.*s\n", prefix, e - b, b); + print_response_line(prefix, b, e); } }