From 03c55b0eab5983dc5bf48890e5a4eeabc6c2fa25 Mon Sep 17 00:00:00 2001 From: John Dennis Date: Sat, 14 Apr 2012 14:13:37 -0400 Subject: [PATCH] resolves: bug#810605 Segfault with freeradius-perl threading --- freeradius-perl.patch | 65 +++++++++++++++++++++++++++++++++++++++++++ freeradius.spec | 7 ++++- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 freeradius-perl.patch diff --git a/freeradius-perl.patch b/freeradius-perl.patch new file mode 100644 index 0000000..8e45142 --- /dev/null +++ b/freeradius-perl.patch @@ -0,0 +1,65 @@ +commit ecb3cd1dbedb764ab98532dae5e0b5bfc9571b00 +Author: Alan T. DeKok +Date: Thu Dec 1 14:21:03 2011 +0100 + + Perl clone should be called sequentially, not in parallel. + + Adding a mutex fixes this. + + Patch from Eike Dehling + +diff --git a/src/modules/rlm_perl/rlm_perl.c b/src/modules/rlm_perl/rlm_perl.c +index 5c82e89..4682ba5 100644 +--- a/src/modules/rlm_perl/rlm_perl.c ++++ b/src/modules/rlm_perl/rlm_perl.c +@@ -77,6 +77,8 @@ typedef struct perl_inst { + char *perl_flags; + PerlInterpreter *perl; + pthread_key_t *thread_key; ++ ++ pthread_mutex_t clone_mutex; + } PERL_INST; + /* + * A mapping of configuration file names to internal variables. +@@ -434,6 +436,8 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance) + */ + + #ifdef USE_ITHREADS ++ pthread_mutex_init(&inst->clone_mutex, NULL); ++ + inst->thread_key = rad_malloc(sizeof(*inst->thread_key)); + memset(inst->thread_key,0,sizeof(*inst->thread_key)); + +@@ -656,8 +660,10 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name) + HV *rad_request_hv; + HV *rad_request_proxy_hv; + HV *rad_request_proxy_reply_hv; +- ++ + #ifdef USE_ITHREADS ++ pthread_mutex_lock(&inst->clone_mutex); ++ + PerlInterpreter *interp; + + interp = rlm_perl_clone(inst->perl,inst->thread_key); +@@ -665,9 +671,12 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name) + dTHXa(interp); + PERL_SET_CONTEXT(interp); + } ++ ++ pthread_mutex_unlock(&inst->clone_mutex); + #else + PERL_SET_CONTEXT(inst->perl); + #endif ++ + { + dSP; + +@@ -974,6 +983,7 @@ static int perl_detach(void *instance) + + #ifdef USE_ITHREADS + rlm_perl_destruct(inst->perl); ++ pthread_mutex_destroy(&inst->clone_mutex); + #else + perl_destruct(inst->perl); + perl_free(inst->perl); diff --git a/freeradius.spec b/freeradius.spec index b14d8e7..ae6be4b 100644 --- a/freeradius.spec +++ b/freeradius.spec @@ -1,7 +1,7 @@ Summary: High-performance and highly configurable free RADIUS server Name: freeradius Version: 2.1.12 -Release: 6%{?dist} +Release: 7%{?dist} License: GPLv2+ and LGPLv2+ Group: System Environment/Daemons URL: http://www.freeradius.org/ @@ -18,6 +18,7 @@ Patch3: freeradius-man.patch Patch4: freeradius-unix-passwd-expire.patch Patch5: freeradius-radeapclient-ipv6.patch Patch6: freeradius-postgres-sql.patch +Patch7: freeradius-perl.patch Obsoletes: freeradius-devel Obsoletes: freeradius-libs @@ -154,6 +155,7 @@ This plugin provides the unixODBC support for the FreeRADIUS server project. %patch4 -p1 -b unix-passwd-expire %patch5 -p1 -b radeapclient-ipv6 %patch6 -p1 -b postgres-sql +%patch7 -p1 -b perl # Some source files mistakenly have execute permissions set find $RPM_BUILD_DIR/freeradius-server-%{version} \( -name '*.c' -o -name '*.h' \) -a -perm /0111 -exec chmod a-x {} + @@ -598,6 +600,9 @@ exit 0 %{_libdir}/freeradius/rlm_sql_unixodbc-%{version}.so %changelog +* Sat Apr 14 2012 John Dennis - 2.1.12-7 +- resolves: bug#810605 Segfault with freeradius-perl threading + * Tue Feb 28 2012 John Dennis - 2.1.12-6 Fixing bugs in RHEL6 rebase, applying fixes here as well resolves: bug#700870 freeradius not compiled with --with-udpfromto