(RADIATOR) cpu-hog bug in AuthRADIUS.pm

Hugh Irvine hugh at open.com.au
Fri Dec 14 18:58:32 CST 2001


Hello Damir -

Many thanks again for another valuable contribution.

I have forwarded your mail to Mike.

regards

Hugh


On Sat, 15 Dec 2001 01:11, Damir Dzeko wrote:
> Hello,
>
> I noticed a cpu-hog bug in radiator which caused it to use up
> all available cpu power to run these system calls in a loop:
>
>   poll(0xFFBEF678, 1, 1000)                       = 1
>   recvfrom(8, 0x009163F0, 8192, 0, 0xFFBEF338, 0xFFBEF330) Err#9 EBADF
>   time()                                          = 1008323763
>
> I traced the problem and found a loop in AuthRADIUS.pm that
> calls select and does not check it's return value properly.
>
> Here is the diff-output of changes I've made to original
> AuthRADIUS.pm. Maybe it's not all correct but it at least
> solves the cpu-hog problem.
>
> --- AuthRADIUS.pm,orig  Fri Dec 14 13:44:21 2001
> +++ AuthRADIUS.pm       Fri Dec 14 15:05:54 2001
> @@ -248,16 +248,21 @@
>         # will be handled: If the remote server is down
>         # you may get a serious performance hit
>         # Wait for activity on the reply socket or timeouts
> -       my ($waitfor, $found);
> +       my ($waitfor, $found, $err_in, $err_out);
>         vec($waitfor, fileno($self->getSock()), 1) = 1;
> +       $err_in = $waitfor;
>         delete $p->{RadiusResult};
>         while (! defined $p->{RadiusResult})
>         {
>             # Wait up to a second for activity on the socket
> -           select($found=$waitfor, undef, undef, 1)
> -            && &handle_radius_socket_read
> -                   (fileno($self->getSock()),
> -                    $self->getSock());
> +           select($found=$waitfor, undef, $err_out=$err_in, 1);
> +           # ddzeko added error check
> +           if ($err_out) {
> +             $self->log($main::LOG_DEBUG, "AuthRADIUS: network error");
> +             return ($main::REJECT, 'Network error');
> +           } elsif ($found) {
> +             &handle_radius_socket_read(fileno($self->getSock()),
> $self->getSock()); +           }
>             &Radius::Select::process_timeouts();
>         }
>         return ($p->{RadiusResult});
>
> ===
> Archive at http://www.open.com.au/archives/radiator/
> Announcements on radiator-announce at open.com.au
> To unsubscribe, email 'majordomo at open.com.au' with
> 'unsubscribe radiator' in the body of the message.

-- 
Radiator: the most portable, flexible and configurable RADIUS server
anywhere. Available on *NIX, *BSD, Windows 95/98/2000, NT, MacOS X.
-
Nets: internetwork inventory and management - graphical, extensible,
flexible with hardware, software, platform and database independence.
===
Archive at http://www.open.com.au/archives/radiator/
Announcements on radiator-announce at open.com.au
To unsubscribe, email 'majordomo at open.com.au' with
'unsubscribe radiator' in the body of the message.


More information about the radiator mailing list