--- jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/RequestFilterValve.java.org	2008-10-28 17:33:08.000000000 +0100
+++ jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/RequestFilterValve.java	2008-10-28 17:34:19.000000000 +0100
@@ -30,6 +30,7 @@
 import org.apache.catalina.ValveContext;
 import org.apache.catalina.util.StringManager;
 import org.apache.regexp.RE;
+import org.apache.regexp.REProgram;
 import org.apache.regexp.RESyntaxException;
 import org.apache.tomcat.util.compat.JdkCompat;
 
@@ -104,15 +105,17 @@
 
 
     /**
-     * The set of <code>allow</code> regular expressions we will evaluate.
+     * The set of <code>allow</code> pre-compiled regular expressions we will
+     * evaluate.
      */
-    protected RE allows[] = new RE[0];
+    protected REProgram allows[] = new REProgram[0];
 
 
     /**
-     * The set of <code>deny</code> regular expressions we will evaluate.
+     * The set of <code>deny</code> pre-compiled regular expressions we will
+     * evaluate.
      */
-    protected RE denies[] = new RE[0];
+    protected REProgram denies[] = new REProgram[0];
 
 
     /**
@@ -210,32 +213,32 @@
 
 
     /**
-     * Return an array of regular expression objects initialized from the
-     * specified argument, which must be <code>null</code> or a comma-delimited
-     * list of regular expression patterns.
+     * Return an array of pre-compiled regular expression objects initialized
+     * from the specified argument, which must be <code>null</code> or a
+     * comma-delimited list of regular expression patterns.
      *
      * @param list The comma-separated list of patterns
      *
      * @exception IllegalArgumentException if one of the patterns has
      *  invalid syntax
      */
-    protected RE[] precalculate(String list) {
+    protected REProgram[] precalculate(String list) {
 
         if (list == null)
-            return (new RE[0]);
+            return (new REProgram[0]);
         list = list.trim();
         if (list.length() < 1)
-            return (new RE[0]);
+            return (new REProgram[0]);
         list += ",";
 
-        ArrayList reList = new ArrayList();
+        ArrayList reProgramList = new ArrayList();
         while (list.length() > 0) {
             int comma = list.indexOf(',');
             if (comma < 0)
                 break;
             String pattern = list.substring(0, comma).trim();
             try {
-                reList.add(new RE(pattern));
+                reProgramList.add(new RE(pattern).getProgram());
             } catch (RESyntaxException e) {
                 IllegalArgumentException iae = new IllegalArgumentException
                     (sm.getString("requestFilterValve.syntax", pattern));
@@ -245,8 +248,8 @@
             list = list.substring(comma + 1);
         }
 
-        RE reArray[] = new RE[reList.size()];
-        return ((RE[]) reList.toArray(reArray));
+        REProgram reProgramArray[] = new REProgram[reProgramList.size()];
+        return ((REProgram[]) reProgramList.toArray(reProgramArray));
 
     }
 
@@ -269,9 +272,14 @@
                            ValveContext context)
         throws IOException, ServletException {
 
+        
+        // Create local RE since RE is not thread safe
+        RE re = new RE();
+        
         // Check the deny patterns, if any
         for (int i = 0; i < denies.length; i++) {
-            if (denies[i].match(property)) {
+            re.setProgram(denies[i]);
+            if (re.match(property)) {
                 ServletResponse sres = response.getResponse();
                 if (sres instanceof HttpServletResponse) {
                     HttpServletResponse hres = (HttpServletResponse) sres;
@@ -283,7 +291,8 @@
 
         // Check the allow patterns, if any
         for (int i = 0; i < allows.length; i++) {
-            if (allows[i].match(property)) {
+            re.setProgram(allows[i]);
+            if (re.match(property)) {
                 context.invokeNext(request, response);
                 return;
             }
