On 04.12.20 18:56, Stoiko Ivanov wrote:
> if an error happens before AnyEvent::Handle registers the cleanup
> callback, we should shutdown the socket, when handling it.
> 
> Co-Authored-by: Dominik Csapak <d.csa...@proxmox.com>
> Signed-off-by: Stoiko Ivanov <s.iva...@proxmox.com>
> ---
>  PVE/APIServer/AnyEvent.pm | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/APIServer/AnyEvent.pm b/PVE/APIServer/AnyEvent.pm
> index af2fde8..a679006 100644
> --- a/PVE/APIServer/AnyEvent.pm
> +++ b/PVE/APIServer/AnyEvent.pm
> @@ -1535,6 +1535,11 @@ sub check_host_access {
>  
>      my $cip = Net::IP->new($clientip);
>  
> +    if (!$cip) {
> +     self->dprint("client IP not parsable: $@");
> +     return 0;
> +    }
> +
>      my $match_allow = 0;
>      my $match_deny = 0;
>  
> @@ -1567,10 +1572,13 @@ sub check_host_access {
>  sub accept_connections {
>      my ($self) = @_;
>  
> -    my $hdl_err;
> +    my ($clientfh, $early_err, $hdl_err);

ah OK, ignore my regards to "$early_err" in the previous comment, I thought it 
was pre-exsiting...

>      eval {
>  
> -     while (my $clientfh = $self->accept()) {
> +     while (1) {
> +         $early_err = 1;
> +         $clientfh = $self->accept();
> +         last if !$clientfh;

what use has above change? Why not keeping it as is, you can still declare 
$clientfh
earlier to extend it's scope:

> +     while ($clientfh = $self->accept()) {


>  
>           my $reqstate = { keep_alive => $self->{keep_alive} };
>  
> @@ -1582,14 +1590,19 @@ sub accept_connections {
>           if (my $sin = getpeername($clientfh)) {
>               my ($pfamily, $pport, $phost) = 
> PVE::Tools::unpack_sockaddr_in46($sin);
>               ($reqstate->{peer_port}, $reqstate->{peer_host}) = ($pport,  
> Socket::inet_ntop($pfamily, $phost));
> +         } else {
> +             shutdown($clientfh, 1);

Do we still plan to send anything? I.e., was `1` (SHUT_RD) used because of 
caution or
are there more explicit reasons for not using `2` (SHUT_RDWR)? Can be fine, but 
would
be good to know.

> +             next;
>           }
>  
>           if (!$self->{trusted_env} && 
> !$self->check_host_access($reqstate->{peer_host})) {
>               print "$$: ABORT request from $reqstate->{peer_host} - access 
> denied\n" if $self->{debug};
>               $reqstate->{log}->{code} = 403;
>               $self->log_request($reqstate);
> +             shutdown($clientfh, 1);

same as above

>               next;
>           }
> +         $early_err = 0;
>  
>           $hdl_err = 1;
>           $self->{conn_count}++;
> @@ -1625,6 +1638,7 @@ sub accept_connections {
>  
>      if (my $err = $@) {
>       syslog('err', $err);
> +     shutdown($clientfh, 1) if $early_err || $hdl_err;

same as above, and maybe we could do with just one such flag variables, 
reducing the combination
matrix a bit.

>       if ($hdl_err) {
>           if ($self->{conn_count} <= 0) {
>               my $msg = "connection count <= 0 not decrementing!\n";
> 




_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to