Fix double free in FTP Code

* src/ftp.c(getftp): Don't free `target`. If it is not pointing to
  targetbuf, then it still pointing to its original location of u->dir.
  This location will be free'd later. Doing so now causes a double free
  and hence crashes Wget
* tests/Test-ftp-dir.px: New test to show double free error
* tests/Makefile.am: Add new test
This commit is contained in:
Darshit Shah 2021-03-02 12:03:14 +01:00
parent 51ee45f017
commit f7835691b4
3 changed files with 45 additions and 3 deletions

View File

@ -992,9 +992,6 @@ Error in server response, closing control connection.\n"));
/* 2004-09-20 SMS. */
if (target != targetbuf)
xfree (target);
} /* else */
}
else /* do not CWD */

View File

@ -58,6 +58,7 @@ PX_TESTS = \
Test-E-k-K.px \
Test-E-k.px \
Test-ftp.px \
Test-ftp-dir.px \
Test-ftp-pasv-fail.px \
Test-ftp-bad-list.px \
Test-ftp-recursive.px \

44
tests/Test-ftp-dir.px Executable file
View File

@ -0,0 +1,44 @@
#!/usr/bin/env perl
use strict;
use warnings;
use FTPTest;
###############################################################################
my $afile = <<EOF;
Some text.
EOF
$afile =~ s/\n/\r\n/;
# code, msg, headers, content
my %urls = (
'/dir/afile.txt' => {
content => $afile,
},
);
my $cmdline = $WgetTest::WGETPATH . " -S ftp://localhost:{{port}}//dir/afile.txt";
my $expected_error_code = 0;
my %expected_downloaded_files = (
'afile.txt' => {
content => $afile,
},
);
###############################################################################
my $the_test = FTPTest->new (
input => \%urls,
cmdline => $cmdline,
errcode => $expected_error_code,
output => \%expected_downloaded_files);
exit $the_test->run();
# vim: et ts=4 sw=4