Skip to content

Commit

Permalink
fix a few leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 13, 2017
1 parent ecb8c20 commit 94d7e87
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
1 change: 0 additions & 1 deletion lib/Mojo/IOLoop/Client.pm
Expand Up @@ -151,7 +151,6 @@ sub _try_tls {
$reactor->remove($handle);

# Start TLS handshake
weaken $self;
my $tls = Mojo::IOLoop::TLS->new($handle)->reactor($self->reactor);
$tls->on(upgrade => sub { $self->_cleanup->emit(connect => pop) });
$tls->on(error => sub { $self->emit(error => pop) });
Expand Down
41 changes: 26 additions & 15 deletions lib/Mojo/IOLoop/TLS.pm
Expand Up @@ -3,6 +3,7 @@ use Mojo::Base 'Mojo::EventEmitter';

use Exporter 'import';
use Mojo::File 'path';
use Scalar::Util 'weaken';

# TLS support requires IO::Socket::SSL
use constant HAS_TLS => $ENV{MOJO_NO_TLS}
Expand All @@ -20,25 +21,41 @@ our @EXPORT_OK = ('HAS_TLS');
my $CERT = path(__FILE__)->dirname->child('resources', 'server.crt')->to_string;
my $KEY = path(__FILE__)->dirname->child('resources', 'server.key')->to_string;

sub DESTROY {
my $self = shift;
return unless my $reactor = $self->reactor;
$reactor->remove($self->{handle}) if $self->{handle};
}
sub DESTROY { shift->_cleanup }

sub negotiate {
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});

return $self->emit(error => 'IO::Socket::SSL 1.94+ required for TLS support')
unless HAS_TLS;

my $handle = $self->{handle};
return $self->emit(error => $IO::Socket::SSL::SSL_ERROR)
unless IO::Socket::SSL->start_SSL($handle, %{$self->_expand($args)});
$self->reactor->io($handle
= $handle => sub { $self->_tls($handle, $args->{server}) });
}

sub new { shift->SUPER::new(handle => shift) }

sub _cleanup {
my $self = shift;
return unless my $reactor = $self->reactor;
$reactor->remove($self->{handle}) if $self->{handle};
return $self;
}

sub _expand {
my ($self, $args) = @_;

weaken $self;
my $tls = {
SSL_ca_file => $args->{tls_ca}
&& -T $args->{tls_ca} ? $args->{tls_ca} : undef,
SSL_error_trap => sub { $self->emit(error => $_[1]) },
SSL_error_trap => sub { $self->_cleanup->emit(error => $_[1]) },
SSL_honor_cipher_order => 1,
SSL_server => $args->{server},
SSL_startHandshake => 0
SSL_server => $args->{server},
SSL_startHandshake => 0
};
$tls->{SSL_cert_file} = $args->{tls_cert} if $args->{tls_cert};
$tls->{SSL_cipher_list} = $args->{tls_ciphers} if $args->{tls_ciphers};
Expand All @@ -59,15 +76,9 @@ sub negotiate {
$tls->{SSL_verifycn_name} = $args->{address};
}

my $handle = $self->{handle};
return $self->emit(error => $IO::Socket::SSL::SSL_ERROR)
unless IO::Socket::SSL->start_SSL($handle, %$tls);
$self->reactor->io($handle
= $handle => sub { $self->_tls($handle, $args->{server}) });
return $tls;
}

sub new { shift->SUPER::new(handle => shift) }

sub _tls {
my ($self, $handle, $server) = @_;

Expand Down

0 comments on commit 94d7e87

Please sign in to comment.