Fwd: (RADIATOR) cpu-hog bug in AuthRADIUS.pm
Mike McCauley
mikem at open.com.au
Wed Dec 19 06:44:17 CST 2001
Hello Damir,
thanks for this patch. I have rolled it in (with some minor changes) for the
next release.
We really appreciate your contributions.
Cheers.
> ---------- Forwarded Message ----------
>
> Subject: (RADIATOR) cpu-hog bug in AuthRADIUS.pm
> Date: 14 Dec 2001 15:11:51 +0100
> From: Damir Dzeko <damir.dzeko at iskon.hr>
> To: radiator at open.com.au
>
> 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.
>
> -------------------------------------------------------
--
Mike McCauley mikem at open.com.au
Open System Consultants Pty. Ltd Unix, Perl, Motif, C++, WWW
24 Bateman St Hampton, VIC 3188 Australia http://www.open.com.au
Phone +61 3 9598-0985 Fax +61 3 9598-0955
Radiator: the most portable, flexible and configurable RADIUS server
anywhere. SQL, proxy, DBM, files, LDAP, NIS+, password, NT, Emerald,
Platypus, Freeside, TACACS+, PAM, external, Active Directory etc etc
on Unix, Win95/8, 2000, NT, MacOS 9, MacOS X
===
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