=== modified file 'src/ChangeLog' --- src/ChangeLog 2012-01-11 14:27:06 +0000 +++ src/ChangeLog 2012-01-26 21:30:19 +0000 @@ -1,3 +1,8 @@ +2012-01-27 Gijs van Tulder + + * retr.c (fd_read_body): Fix a memory leak with chunked responses. + * http.c (skip_short_body): Fix the same memory leak. + 2012-01-09 Gijs van Tulder * init.c: Disable WARC compression if zlib is disabled. === modified file 'src/http.c' --- src/http.c 2012-01-08 23:03:23 +0000 +++ src/http.c 2012-01-26 21:30:19 +0000 @@ -951,9 +951,12 @@ break; remaining_chunk_size = strtol (line, &endl, 16); + xfree (line); + if (remaining_chunk_size == 0) { - fd_read_line (fd); + line = fd_read_line (fd); + xfree_null (line); break; } } @@ -978,8 +981,13 @@ { remaining_chunk_size -= ret; if (remaining_chunk_size == 0) - if (fd_read_line (fd) == NULL) - return false; + { + char *line = fd_read_line (fd); + if (line == NULL) + return false; + else + xfree (line); + } } /* Safe even if %.*s bogusly expects terminating \0 because === modified file 'src/retr.c' --- src/retr.c 2011-11-04 21:25:00 +0000 +++ src/retr.c 2012-01-26 21:30:19 +0000 @@ -307,11 +307,16 @@ } remaining_chunk_size = strtol (line, &endl, 16); + xfree (line); + if (remaining_chunk_size == 0) { ret = 0; - if (fd_read_line (fd) == NULL) + line = fd_read_line (fd); + if (line == NULL) ret = -1; + else + xfree (line); break; } } @@ -371,11 +376,16 @@ { remaining_chunk_size -= ret; if (remaining_chunk_size == 0) - if (fd_read_line (fd) == NULL) - { - ret = -1; - break; - } + { + char *line = fd_read_line (fd); + if (line == NULL) + { + ret = -1; + break; + } + else + xfree (line); + } } }