mirror of https://github.com/openssl/openssl.git
Fix a TLSProxy race condition
TLSProxy starts s_server and specifies the number of client connects it should expect. After that s_server is supposed to close down automatically. However, if another test is then run then TLSProxy will start a new instance of s_server. If the previous instance hasn't closed down yet then the new instance can fail to bind to the socket. Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
2460c7f133
commit
5427976d9e
|
@ -71,6 +71,7 @@ $ENV{OPENSSL_ENGINES} = bldtop_dir("engines");
|
|||
$ENV{OPENSSL_ia32cap} = '~0x200000200000000';
|
||||
|
||||
sub checkmessages($$$$$$);
|
||||
sub clearclient();
|
||||
sub clearall();
|
||||
|
||||
my $chellotickext = 0;
|
||||
|
@ -119,7 +120,7 @@ clearall();
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
$proxy->clientstart();
|
||||
checkmessages(4, "Session resumption session ticket test", 1, 0, 0, 0);
|
||||
|
@ -132,7 +133,7 @@ clearall();
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session." -no_ticket");
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
$proxy->clientstart();
|
||||
checkmessages(5, "Session resumption with ticket capable client without a "
|
||||
|
@ -153,14 +154,14 @@ $proxy->serverconnects(3);
|
|||
$proxy->filter(undef);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session." -sess_out ".$session);
|
||||
$proxy->filter(\&inject_empty_ticket_filter);
|
||||
$proxy->clientstart();
|
||||
#Expected result: ClientHello extension seen; ServerHello extension seen;
|
||||
# NewSessionTicket message seen; Abbreviated handshake.
|
||||
checkmessages(7, "Empty ticket resumption test", 1, 1, 1, 0);
|
||||
clearall();
|
||||
clearclient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
$proxy->filter(undef);
|
||||
$proxy->clientstart();
|
||||
|
@ -252,11 +253,18 @@ sub checkmessages($$$$$$)
|
|||
}
|
||||
}
|
||||
|
||||
sub clearall()
|
||||
|
||||
sub clearclient()
|
||||
{
|
||||
$chellotickext = 0;
|
||||
$shellotickext = 0;
|
||||
$fullhand = 0;
|
||||
$ticketseen = 0;
|
||||
$proxy->clearClient();
|
||||
}
|
||||
|
||||
sub clearall()
|
||||
{
|
||||
clearclient();
|
||||
$proxy->clear();
|
||||
}
|
||||
|
|
|
@ -84,7 +84,8 @@ ok(TLSProxy::Message->success(), "Version tolerance test, TLS 1.3");
|
|||
|
||||
#Test 2: Testing something below SSLv3 should fail
|
||||
$client_version = TLSProxy::Record::VERS_SSL_3_0 - 1;
|
||||
$proxy->restart();
|
||||
$proxy->clear();
|
||||
$proxy->start();
|
||||
ok(TLSProxy::Message->fail(), "Version tolerance test, SSL < 3.0");
|
||||
|
||||
sub vers_tolerance_filter
|
||||
|
|
|
@ -136,7 +136,7 @@ setrmextms(0, 0);
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
$proxy->clientstart();
|
||||
checkmessages(5, "Session resumption extended master secret test", 1, 1, 0);
|
||||
|
@ -152,7 +152,7 @@ setrmextms(1, 0);
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
setrmextms(0, 0);
|
||||
$proxy->clientstart();
|
||||
|
@ -168,7 +168,7 @@ setrmextms(0, 0);
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
setrmextms(1, 0);
|
||||
$proxy->clientstart();
|
||||
|
@ -184,7 +184,7 @@ setrmextms(0, 0);
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
setrmextms(0, 1);
|
||||
$proxy->clientstart();
|
||||
|
@ -200,7 +200,7 @@ setrmextms(0, 1);
|
|||
$proxy->serverconnects(2);
|
||||
$proxy->clientflags("-sess_out ".$session);
|
||||
$proxy->start();
|
||||
$proxy->clear();
|
||||
$proxy->clearClient();
|
||||
$proxy->clientflags("-sess_in ".$session);
|
||||
setrmextms(0, 0);
|
||||
$proxy->clientstart();
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
# Hudson (tjh@cryptsoft.com).
|
||||
|
||||
use strict;
|
||||
use POSIX ":sys_wait_h";
|
||||
|
||||
package TLSProxy::Proxy;
|
||||
|
||||
|
@ -86,6 +87,7 @@ sub new
|
|||
serverflags => "",
|
||||
clientflags => "",
|
||||
serverconnects => 1,
|
||||
serverpid => 0,
|
||||
|
||||
#Public read
|
||||
execute => $execute,
|
||||
|
@ -138,23 +140,31 @@ sub new
|
|||
return bless $self, $class;
|
||||
}
|
||||
|
||||
sub clear
|
||||
sub clearClient
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
$self->{cipherc} = "";
|
||||
$self->{ciphers} = "AES128-SHA";
|
||||
$self->{flight} = 0;
|
||||
$self->{record_list} = [];
|
||||
$self->{message_list} = [];
|
||||
$self->{serverflags} = "";
|
||||
$self->{clientflags} = "";
|
||||
$self->{serverconnects} = 1;
|
||||
|
||||
TLSProxy::Message->clear();
|
||||
TLSProxy::Record->clear();
|
||||
}
|
||||
|
||||
sub clear
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
$self->clearClient;
|
||||
$self->{ciphers} = "AES128-SHA";
|
||||
$self->{serverflags} = "";
|
||||
$self->{serverconnects} = 1;
|
||||
$self->{serverpid} = 0;
|
||||
}
|
||||
|
||||
sub restart
|
||||
{
|
||||
my $self = shift;
|
||||
|
@ -195,6 +205,7 @@ sub start
|
|||
}
|
||||
exec($execcmd);
|
||||
}
|
||||
$self->serverpid($pid);
|
||||
|
||||
$self->clientstart;
|
||||
}
|
||||
|
@ -319,6 +330,13 @@ sub clientstart
|
|||
if(!$self->debug) {
|
||||
select($oldstdout);
|
||||
}
|
||||
$self->serverconnects($self->serverconnects - 1);
|
||||
if ($self->serverconnects == 0) {
|
||||
die "serverpid is zero\n" if $self->serverpid == 0;
|
||||
print "Waiting for server process to close: "
|
||||
.$self->serverpid."\n";
|
||||
waitpid( $self->serverpid, 0);
|
||||
}
|
||||
}
|
||||
|
||||
sub process_packet
|
||||
|
@ -503,4 +521,12 @@ sub message_list
|
|||
}
|
||||
return $self->{message_list};
|
||||
}
|
||||
sub serverpid
|
||||
{
|
||||
my $self = shift;
|
||||
if (@_) {
|
||||
$self->{serverpid} = shift;
|
||||
}
|
||||
return $self->{serverpid};
|
||||
}
|
||||
1;
|
||||
|
|
Loading…
Reference in New Issue