# # this testcase is invalid. The LIST command must succeed. Why? # both ports in question are opened with SO_REUSEADDR # both processes use as the same user # # in order to trigger the failure we would have to # try to bind the same addr:port pair for two different # users. This is not what's happen in this test case. # we can just delete this test case on Solaris. # # Change has not been submitted to upstream I feel it might # be valid test case on other OSes, who knows. It is # rather exotic corner case. # --- a/tests/t/lib/ProFTPD/Tests/Commands/PORT.pm +++ b/tests/t/lib/ProFTPD/Tests/Commands/PORT.pm @@ -55,11 +55,6 @@ my $TESTS = { test_class => [qw(bug forking)], }, - port_eaddrinuse_bug3944 => { - order => ++$order, - test_class => [qw(bug forking)], - }, - }; sub new { @@ -1123,162 +1118,4 @@ sub port_during_xfer_bug3487 { unlink($log_file); } -sub port_eaddrinuse_bug3944 { - my $self = shift; - my $tmpdir = $self->{tmpdir}; - - my $config_file = "$tmpdir/cmds.conf"; - my $pid_file = File::Spec->rel2abs("$tmpdir/cmds.pid"); - my $scoreboard_file = File::Spec->rel2abs("$tmpdir/cmds.scoreboard"); - - my $log_file = test_get_logfile(); - - my $auth_user_file = File::Spec->rel2abs("$tmpdir/cmds.passwd"); - my $auth_group_file = File::Spec->rel2abs("$tmpdir/cmds.group"); - - my $user = 'proftpd'; - my $passwd = 'test'; - my $group = 'ftpd'; - my $home_dir = File::Spec->rel2abs($tmpdir); - my $uid = 500; - my $gid = 500; - - # Make sure that, if we're running as root, that the home directory has - # permissions/privs set for the account we create - if ($< == 0) { - unless (chmod(0755, $home_dir)) { - die("Can't set perms on $home_dir to 0755: $!"); - } - - unless (chown($uid, $gid, $home_dir)) { - die("Can't set owner of $home_dir to $uid/$gid: $!"); - } - } - - auth_user_write($auth_user_file, $user, $passwd, $uid, $gid, $home_dir, - '/bin/bash'); - auth_group_write($auth_group_file, $group, $gid, $user); - - my $timeout = 20; - - my $config = { - PidFile => $pid_file, - ScoreboardFile => $scoreboard_file, - SystemLog => $log_file, - TraceLog => $log_file, - Trace => 'DEFAULT:10', - - AuthUserFile => $auth_user_file, - AuthGroupFile => $auth_group_file, - AuthOrder => 'mod_auth_file.c', - - RootRevoke => 'off', - TimeoutIdle => '30', - - IfModules => { - 'mod_delay.c' => { - DelayEngine => 'off', - }, - }, - }; - - my ($port, $config_user, $config_group) = config_write($config_file, $config); - - my $vhost_addr = '127.0.0.1'; - my $vhost_port = $port - 1; - - if (open(my $fh, ">> $config_file")) { - print $fh < - ServerName "DefaultServer VHost" - Port $vhost_port - -EOC - - unless (close($fh)) { - die("Can't write $config_file: $!"); - } - - } else { - die("Can't open $config_file: $!"); - } - - # Open pipes, for use between the parent and child processes. Specifically, - # the child will indicate when it's done with its test by writing a message - # to the parent. - my ($rfh, $wfh); - unless (pipe($rfh, $wfh)) { - die("Can't open pipe: $!"); - } - - my $ex; - - # Fork child - $self->handle_sigchld(); - defined(my $pid = fork()) or die("Can't fork: $!"); - if ($pid) { - eval { - my $client = ProFTPD::TestSuite::FTP->new('127.0.0.1', $port, 1); - $client->login($user, $passwd); - - my $conn = $client->list_raw(); - if ($conn) { - eval { $conn->close() }; - die("LIST succeeded unexpectedly"); - } - - my $resp_code = $client->response_code(); - my $resp_msg = $client->response_msg(); - - my $expected = 425; - $self->assert($expected == $resp_code, - test_msg("Expected $expected, got $resp_code")); - - $expected = 'Unable to build data connection: Address already in use'; - $self->assert($expected eq $resp_msg, - test_msg("Expected '$expected', got '$resp_msg'")); - - ($resp_code, $resp_msg) = $client->quit(); - - $expected = 221; - $self->assert($expected == $resp_code, - test_msg("Expected $expected, got $resp_code")); - - $expected = 'Goodbye.'; - $self->assert($expected eq $resp_msg, - test_msg("Expected '$expected', got '$resp_msg'")); - }; - - if ($@) { - $ex = $@; - } - - $wfh->print("done\n"); - $wfh->flush(); - - } else { - eval { server_wait($config_file, $rfh, $timeout + 1) }; - if ($@) { - warn($@); - exit 1; - } - - exit 0; - } - - # Stop server - server_stop($pid_file); - - $self->assert_child_ok($pid); - - if ($ex) { - test_append_logfile($log_file); - unlink($log_file); - - die($ex); - } - - unlink($log_file); -} - 1;