In rlm_perl.c Perl interpreter cloning is controlled by #ifdef USE_ITHREADS.
However, for some unknown reason in perl_xlat() #ifndef WITH_ITHREADS is
used instead. At least my Perl does not have WITH_ITHREADS compile option,
meaning all perl_xlat() calls are handled by same Perl instance.
If you run Freeradius in multithread mode, this causes segfault in libperl
when two threads do perl_xlat() simultaneously.
{
rlm_perl_t *inst= (rlm_perl_t *) instance;
- PerlInterpreter *perl;
char *tmp;
char const *p, *q;
int count;
size_t ret = 0;
STRLEN n_a;
-#ifndef WITH_ITHREADS
- perl = inst->perl;
-#else
- perl = rlm_perl_clone(inst->perl,inst->thread_key);
+#ifdef USE_ITHREADS
+ PerlInterpreter *interp;
+
+ pthread_mutex_lock(&inst->clone_mutex);
+ interp = rlm_perl_clone(inst->perl, inst->thread_key);
{
- dTHXa(perl);
+ dTHXa(interp);
+ PERL_SET_CONTEXT(interp);
}
+ pthread_mutex_unlock(&inst->clone_mutex);
+#else
+ PERL_SET_CONTEXT(inst->perl);
#endif
- PERL_SET_CONTEXT(perl);
{
dSP;
ENTER;SAVETMPS;