]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
import fix to ITS#3932
authorPierangelo Masarati <ando@openldap.org>
Sat, 13 Aug 2005 18:46:52 +0000 (18:46 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sat, 13 Aug 2005 18:46:52 +0000 (18:46 +0000)
CHANGES
libraries/librewrite/rewrite-int.h
libraries/librewrite/rule.c

diff --git a/CHANGES b/CHANGES
index caf704d3fa50b4d4e86e8110866a516853dbc0d8..5cdbf8b5ae825722cf9ceb26f8afeddf1c011250 100644 (file)
--- 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)
index ac616e16d040b5815b0b76b95f21903cfe2fb20d..4b5a60bee262ecabf8ba0e82f2adff61088af4f7 100644 (file)
@@ -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;
 
        /*
index e47f1ae2c4fb331a8a1ca047fc8b3b361d110c6e..f176d1e2087e1bbddb5c495b1d8948d72783463d 100644 (file)
@@ -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;