radiusclient thread-safety
Alex Massover
alex at jajah.com
Sun Feb 28 11:16:02 CET 2010
Hi Alan,
Thank you for reply.
I tested it now with rc_handle per thread but the problem still persists. Even if I protect all calls to libradius with mutex:
pthread_mutex_lock(&mp);
rc_init_handle();
[build send avpair here]
rc_auth();
rc_free_handle();
pthread_mutex_unlock(&mp);
Looks like memory corruption, because if I don't leave thread to leave for a long time, the problem disappears. Probably if thread exits it cleans up stack (or maybe because this way there're no 2 concurrent threads that ran through rc_auth() ).
So I compiled it with -fstack-protector-all, but it didn't fixed the problem.
Here's what I did, in lib/sendserver.c in rc_send_server() I added break, to disable exiting with TIMEOUT_RC, like following:
if (FD_ISSET (sockfd, &readfds))
break;
/*
* Timed out waiting for response. Retry "retry_max" times
* before giving up. If retry_max = 0, don't retry at all.
*/
if (++retries >= retry_max)
{
break; // ########################################## HERE #######################
rc_log(LOG_ERR,
"rc_send_server: no reply from RADIUS server");
close (sockfd);
memset (secret, '\0', sizeof (secret));
return TIMEOUT_RC;
}
And magically it fixed the issue.
That's beyond of my understanding, but looks like
if (FD_ISSET (sockfd, &readfds))
break;
misbehaves (or gets corrupted).
Only rare I get "rc_send_server: select: Bad file descriptor".
What do you think please?
> -----Original Message-----
> From: freeradius-devel-bounces+alex=jajah.com at lists.freeradius.org
> [mailto:freeradius-devel-bounces+alex=jajah.com at lists.freeradius.org]
> On Behalf Of Alan DeKok
> Sent: יום ו 26 פברואר 2010 17:51
> To: FreeRadius developers mailing list
> Subject: Re: radiusclient thread-safety
>
> Alex Massover wrote:
> > Hello,
> >
> > I'm using radiusclient lib from multithreaded application, by having
> a "static rc_handle *rh" and calling rc_auth() from different threads.
>
> It's not thread-safe. There are no mutex locks in the code.
>
> > Can someone enlighten me on the subj please?
>
> Use one rc_handle per child thread.
>
> The code needs pretty significant changes to make it thread-safe.
>
> Alan DeKok.
> -
> List info/subscribe/unsubscribe? See
> http://www.freeradius.org/list/devel.html
>
> This mail was received via Mail-SeCure System.
>
This mail was sent via Mail-SeCure System.
More information about the Freeradius-Devel
mailing list