(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