From 7439661cd9f3a8f5884ee1724f1421fd9c1a19d5 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Sat, 13 Aug 2005 18:46:52 +0000 Subject: [PATCH] import fix to ITS#3932 --- CHANGES | 1 + libraries/librewrite/rewrite-int.h | 3 +++ libraries/librewrite/rule.c | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index caf704d3fa..5cdbf8b5ae 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ OpenLDAP 2.2.28 Release Fixed syncrepl SASL bind crash (ITS#3792) Fixed slurpd error messages Fixed libldap infinite referral loop (ITS#2894, ITS#3578) + Fixed librewrite regex concurrency issue (ITS#3932) Use IANA assigned OIDs for recently approved IETF LDAP extensions Build Environment Fixed test020 logging problem (ITS#3811) diff --git a/libraries/librewrite/rewrite-int.h b/libraries/librewrite/rewrite-int.h index ac616e16d0..4b5a60bee2 100644 --- a/libraries/librewrite/rewrite-int.h +++ b/libraries/librewrite/rewrite-int.h @@ -206,6 +206,9 @@ struct rewrite_rule { char *lr_pattern; char *lr_subststring; char *lr_flagstring; +#ifdef USE_REWRITE_LDAP_PVT_THREADS + ldap_pvt_thread_mutex_t lr_mutex; +#endif /* USE_REWRITE_LDAP_PVT_THREADS */ regex_t lr_regex; /* diff --git a/libraries/librewrite/rule.c b/libraries/librewrite/rule.c index e47f1ae2c4..f176d1e208 100644 --- a/libraries/librewrite/rule.c +++ b/libraries/librewrite/rule.c @@ -346,6 +346,14 @@ rewrite_rule_compile( return REWRITE_ERR; } +#ifdef USE_REWRITE_LDAP_PVT_THREADS + if ( ldap_pvt_thread_mutex_init( &rule->lr_mutex ) ) { + regfree( &rule->lr_regex ); + free( rule ); + return REWRITE_ERR; + } +#endif /* USE_REWRITE_LDAP_PVT_THREADS */ + /* * Just to remember them ... */ @@ -418,7 +426,14 @@ recurse:; rule->lr_pattern, string, strcnt + 1 ); op->lo_num_passes++; - if ( regexec( &rule->lr_regex, string, nmatch, match, 0 ) != 0 ) { +#ifdef USE_REWRITE_LDAP_PVT_THREADS + ldap_pvt_thread_mutex_lock( &rule->lr_mutex ); +#endif /* USE_REWRITE_LDAP_PVT_THREADS */ + rc = regexec( &rule->lr_regex, string, nmatch, match, 0 ); +#ifdef USE_REWRITE_LDAP_PVT_THREADS + ldap_pvt_thread_mutex_unlock( &rule->lr_mutex ); +#endif /* USE_REWRITE_LDAP_PVT_THREADS */ + if ( rc != 0 ) { if ( *result == NULL && strcnt > 0 ) { free( string ); string = NULL; @@ -488,6 +503,9 @@ rewrite_rule_destroy( } regfree( &rule->lr_regex ); +#ifdef USE_REWRITE_LDAP_PVT_THREADS + ldap_pvt_thread_mutex_destroy( &rule->lr_mutex ); +#endif /* USE_REWRITE_LDAP_PVT_THREADS */ for ( action = rule->lr_action; action; ) { struct rewrite_action *curraction = action; -- 2.47.2