]> git.sur5r.net Git - openldap/blobdiff - libraries/librewrite/rule.c
fix ITS#3932 - regex/rewrite concurrency issue
[openldap] / libraries / librewrite / rule.c
index b3fba216e94aa8b9c1718ea5f5a74dbab97447d4..9be1d844cb91677d793a1c0c66f67ea22a3d2d53 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,15 @@ 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 && string != arg ) {
                        free( string );
                }
@@ -487,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;