Segfault in libperl when doing perl_xlat(). Fix by kvainkainen. Closes #436
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 29 Sep 2013 14:58:48 +0000 (15:58 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 29 Sep 2013 15:16:44 +0000 (16:16 +0100)
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.

src/modules/rlm_perl/rlm_perl.c

index 7b46f7b..57d4c31 100644 (file)
@@ -317,22 +317,25 @@ static ssize_t perl_xlat(void *instance, REQUEST *request, char const *fmt, char
 {
 
        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;