This is an automated email from the ASF dual-hosted git repository.

rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 60008aaaf7 Code review fixes
60008aaaf7 is described below

commit 60008aaaf73a5e864f382f4667d576ea2d5b2f2a
Author: remm <[email protected]>
AuthorDate: Wed Jul 15 17:06:29 2026 +0200

    Code review fixes
    
    Some refinements for DOMWriter, co authored by OpenCode.
    Similar in XMLWriter.
---
 .../apache/catalina/servlets/DefaultServlet.java   |  8 +++--
 .../catalina/servlets/LocalStrings.properties      |  1 +
 java/org/apache/catalina/util/ContextName.java     |  2 +-
 .../catalina/util/CustomObjectInputStream.java     |  4 +--
 java/org/apache/catalina/util/DOMWriter.java       | 37 +++++++++++++++++++---
 .../org/apache/catalina/util/ErrorPageSupport.java | 12 +++----
 .../org/apache/catalina/util/ExactRateLimiter.java |  2 +-
 java/org/apache/catalina/util/IOTools.java         |  2 +-
 java/org/apache/catalina/util/Introspection.java   |  5 +--
 java/org/apache/catalina/util/NetMask.java         | 23 +++++++++++---
 java/org/apache/catalina/util/NetMaskSet.java      |  2 +-
 java/org/apache/catalina/util/RateLimiterBase.java |  2 +-
 java/org/apache/catalina/util/ResourceSet.java     | 26 ++++++++++++---
 java/org/apache/catalina/util/ServerInfo.java      |  2 +-
 java/org/apache/catalina/util/SessionConfig.java   |  2 +-
 .../catalina/util/SessionIdGeneratorBase.java      |  2 +-
 java/org/apache/catalina/util/Strftime.java        |  2 +-
 .../apache/catalina/util/TimeBucketCounter.java    |  2 +-
 java/org/apache/catalina/util/XMLWriter.java       | 14 ++++++--
 19 files changed, 114 insertions(+), 36 deletions(-)

diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java 
b/java/org/apache/catalina/servlets/DefaultServlet.java
index 0d8a1b1f8e..0642052c06 100644
--- a/java/org/apache/catalina/servlets/DefaultServlet.java
+++ b/java/org/apache/catalina/servlets/DefaultServlet.java
@@ -2128,8 +2128,12 @@ public class DefaultServlet extends HttpServlet {
                     log(sm.getString("defaultServlet.globalXSLTTooBig", 
f.getAbsolutePath()));
                 } else {
                     try (FileInputStream fis = new FileInputStream(f)) {
-                        byte[] b = new byte[(int) f.length()];
-                        IOTools.readFully(fis, b);
+                        int xsltLength = (int) globalXsltFileSize;
+                        byte[] b = new byte[xsltLength];
+                        if (xsltLength != IOTools.readFully(fis, b)) {
+                            log(sm.getString("defaultServlet.truncatedXSLT", 
f.getAbsolutePath()));
+                            return null;
+                        }
                         return new StreamSource(new ByteArrayInputStream(b));
                     }
                 }
diff --git a/java/org/apache/catalina/servlets/LocalStrings.properties 
b/java/org/apache/catalina/servlets/LocalStrings.properties
index 2628a1e8e2..896d0c0aa1 100644
--- a/java/org/apache/catalina/servlets/LocalStrings.properties
+++ b/java/org/apache/catalina/servlets/LocalStrings.properties
@@ -53,6 +53,7 @@ defaultServlet.resource.lastModified=Last Modified
 defaultServlet.resource.name=Name
 defaultServlet.resource.size=Size
 defaultServlet.skipfail=Read failed because only [{0}] bytes were available 
but needed to skip [{1}] bytes to reach the start of the requested range
+defaultServlet.truncatedXSLT=The global XSLT file [{0}] was truncated
 defaultServlet.unknownBomConfig=Unrecognised value of [{0}] provided for 
useBomIfPresent initialization parameter
 defaultServlet.wrongByteCountForRange=An invalid amount [{0}] of bytes were 
received for range with length [{1}]
 defaultServlet.xslError=XSL transformer error
diff --git a/java/org/apache/catalina/util/ContextName.java 
b/java/org/apache/catalina/util/ContextName.java
index 18c224c431..34d2e38f5b 100644
--- a/java/org/apache/catalina/util/ContextName.java
+++ b/java/org/apache/catalina/util/ContextName.java
@@ -100,7 +100,7 @@ public final class ContextName {
     /**
      * Construct an instance from a path and version.
      *
-     * @param path    Context path to use
+     * @param path    Context path to use, which must not contain a version 
marker
      * @param version Context version to use
      */
     public ContextName(String path, String version) {
diff --git a/java/org/apache/catalina/util/CustomObjectInputStream.java 
b/java/org/apache/catalina/util/CustomObjectInputStream.java
index 80f869b997..79b3de1ed6 100644
--- a/java/org/apache/catalina/util/CustomObjectInputStream.java
+++ b/java/org/apache/catalina/util/CustomObjectInputStream.java
@@ -73,8 +73,8 @@ public final class CustomObjectInputStream extends 
ObjectInputStream {
      * @param log                     The logger to use to report any issues. 
It may only be null if the filterMode does
      *                                    not require logging
      * @param allowedClassNamePattern The regular expression to use to filter 
deserialized classes. The fully qualified
-     *                                    class name must match this pattern 
for deserialization to be allowed if
-     *                                    filtering is enabled.
+     *                                    class name must match this pattern 
for deserialization to be allowed.
+     *                                    If null, filtering will be disabled.
      * @param warnOnFailure           Should any failures be logged?
      *
      * @exception IOException if an input/output error occurs
diff --git a/java/org/apache/catalina/util/DOMWriter.java 
b/java/org/apache/catalina/util/DOMWriter.java
index 6218dfb4e2..8f47594394 100644
--- a/java/org/apache/catalina/util/DOMWriter.java
+++ b/java/org/apache/catalina/util/DOMWriter.java
@@ -112,7 +112,6 @@ public class DOMWriter {
             case Node.PROCESSING_INSTRUCTION_NODE:
                 out.print("<?");
                 out.print(node.getLocalName());
-
                 String piData = node.getNodeValue();
                 if (piData != null && !piData.isEmpty()) {
                     out.print(' ');
@@ -122,15 +121,45 @@ public class DOMWriter {
                     int start = 0;
                     int end = piData.indexOf("?>");
                     while (end >= 0) {
-                        out.print(piData.substring(start, end + 1));
-                        out.print(' ');
-                        start = end + 1;
+                        out.print(piData.substring(start, end));
+                        out.print("? >");
+                        start = end + 2;
                         end = piData.indexOf("?>", start);
                     }
                     out.print(piData.substring(start));
                 }
                 out.print("?>");
                 break;
+
+            // print comment
+            case Node.COMMENT_NODE:
+                out.print("<!--");
+                String commentValue = node.getNodeValue();
+                if (commentValue != null) {
+                    // The only illegal sequence in comment data is --> which
+                    // would terminate the comment early. Break it with a 
space.
+                    int start = 0;
+                    int end = commentValue.indexOf("-->");
+                    while (end >= 0) {
+                        out.print(commentValue.substring(start, end));
+                        out.print("- >");
+                        start = end + 3;
+                        end = commentValue.indexOf("-->", start);
+                    }
+                    out.print(commentValue.substring(start));
+                }
+                out.print("-->");
+                break;
+
+            // print document fragment (just its children)
+            case Node.DOCUMENT_FRAGMENT_NODE:
+                printChildren(node);
+                break;
+
+            default:
+                // Unhandled node types (ENTITY_NODE, NOTATION_NODE,
+                // ATTRIBUTE_NODE) are silently skipped.
+                break;
         }
 
         if (type == Node.ELEMENT_NODE) {
diff --git a/java/org/apache/catalina/util/ErrorPageSupport.java 
b/java/org/apache/catalina/util/ErrorPageSupport.java
index 7e85599f55..af87b33a02 100644
--- a/java/org/apache/catalina/util/ErrorPageSupport.java
+++ b/java/org/apache/catalina/util/ErrorPageSupport.java
@@ -97,18 +97,18 @@ public class ErrorPageSupport {
 
 
     /**
-     * Find the ErrorPage, if any, for the given exception type, searching up 
the
+     * Find the ErrorPage, if any, for the given exception, searching up the
      * exception's class hierarchy.
      *
-     * @param exceptionType The exception instance
+     * @param exception The exception instance
      *
-     * @return The ErrorPage for the exception type, or {@code null} if none 
is configured
+     * @return The ErrorPage for the exception, or {@code null} if none is 
configured
      */
-    public ErrorPage find(Throwable exceptionType) {
-        if (exceptionType == null) {
+    public ErrorPage find(Throwable exception) {
+        if (exception == null) {
             return null;
         }
-        Class<?> clazz = exceptionType.getClass();
+        Class<?> clazz = exception.getClass();
         String name = clazz.getName();
         while (!Object.class.equals(clazz)) {
             ErrorPage errorPage = exceptionPages.get(name);
diff --git a/java/org/apache/catalina/util/ExactRateLimiter.java 
b/java/org/apache/catalina/util/ExactRateLimiter.java
index 246b5e8a77..8fb5cd9eb4 100644
--- a/java/org/apache/catalina/util/ExactRateLimiter.java
+++ b/java/org/apache/catalina/util/ExactRateLimiter.java
@@ -19,7 +19,7 @@ package org.apache.catalina.util;
 import java.util.concurrent.ScheduledExecutorService;
 
 /**
- * A RateLimiter that compromises efficiency for accuracy in order to provide 
exact rate limiting.
+ * A RateLimiter that trades efficiency for accuracy in order to provide exact 
rate limiting.
  */
 public class ExactRateLimiter extends RateLimiterBase {
 
diff --git a/java/org/apache/catalina/util/IOTools.java 
b/java/org/apache/catalina/util/IOTools.java
index c6cd67ccf8..e16cf76054 100644
--- a/java/org/apache/catalina/util/IOTools.java
+++ b/java/org/apache/catalina/util/IOTools.java
@@ -94,7 +94,7 @@ public class IOTools {
      * @param is  The source to read from
      * @param buf The buffer to write to
      *
-     * @return The number of bytes read
+     * @return The number of bytes actually read
      *
      * @throws IOException If an I/O error occurs during the read
      */
diff --git a/java/org/apache/catalina/util/Introspection.java 
b/java/org/apache/catalina/util/Introspection.java
index 8dc41fbcd3..5a27ca39b8 100644
--- a/java/org/apache/catalina/util/Introspection.java
+++ b/java/org/apache/catalina/util/Introspection.java
@@ -41,8 +41,9 @@ public class Introspection {
 
 
     /**
-     * Extract the Java Bean property name from the setter name. Note: This 
method assumes that the method name has
-     * already been checked for correctness.
+     * Extract the Java Bean property name from the setter name. Note: This
+     * method assumes that the method name starts with "set" and has a length
+     * greater than 3.
      *
      * @param setter The setter method
      *
diff --git a/java/org/apache/catalina/util/NetMask.java 
b/java/org/apache/catalina/util/NetMask.java
index 51c53769c8..8b5f7e02ce 100644
--- a/java/org/apache/catalina/util/NetMask.java
+++ b/java/org/apache/catalina/util/NetMask.java
@@ -19,6 +19,7 @@ package org.apache.catalina.util;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Arrays;
+import java.util.Objects;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -296,13 +297,27 @@ public final class NetMask {
             return false;
         }
         NetMask other = (NetMask) o;
-        return nrBytes == other.nrBytes && lastByteShift == 
other.lastByteShift &&
-                Arrays.equals(netaddr, other.netaddr);
+        if (foundPort != other.foundPort) {
+            return false;
+        }
+        if (nrBytes != other.nrBytes || lastByteShift != other.lastByteShift) {
+            return false;
+        }
+        if (!Arrays.equals(netaddr, other.netaddr)) {
+            return false;
+        }
+        if (foundPort) {
+            return Objects.equals(portPattern, other.portPattern);
+        }
+        return true;
     }
 
     @Override
     public int hashCode() {
-        return 31 * Arrays.hashCode(netaddr) + lastByteShift;
+        int result = 31 * (31 * Arrays.hashCode(netaddr) + nrBytes) + 
lastByteShift;
+        if (foundPort) {
+            result = 31 * result + portPattern.hashCode();
+        }
+        return result;
     }
-
 }
diff --git a/java/org/apache/catalina/util/NetMaskSet.java 
b/java/org/apache/catalina/util/NetMaskSet.java
index 91d7067b05..6a1e6cd042 100644
--- a/java/org/apache/catalina/util/NetMaskSet.java
+++ b/java/org/apache/catalina/util/NetMaskSet.java
@@ -104,7 +104,7 @@ public class NetMaskSet {
     }
 
     /**
-     * removes all entries from the set
+     * Removes all entries from the set.
      */
     public void clear() {
         netmasks.clear();
diff --git a/java/org/apache/catalina/util/RateLimiterBase.java 
b/java/org/apache/catalina/util/RateLimiterBase.java
index cfd8b4fc6b..5ff2f7cb27 100644
--- a/java/org/apache/catalina/util/RateLimiterBase.java
+++ b/java/org/apache/catalina/util/RateLimiterBase.java
@@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import jakarta.servlet.FilterConfig;
 
 /**
- * Base implementation of {@link RateLimiter}, provides runtime data 
maintenance mechanism monitor.
+ * Base implementation of {@link RateLimiter}, provides a runtime data 
maintenance mechanism and monitor.
  */
 public abstract class RateLimiterBase implements RateLimiter {
 
diff --git a/java/org/apache/catalina/util/ResourceSet.java 
b/java/org/apache/catalina/util/ResourceSet.java
index f7a82f7451..8fcc5cdc81 100644
--- a/java/org/apache/catalina/util/ResourceSet.java
+++ b/java/org/apache/catalina/util/ResourceSet.java
@@ -19,6 +19,7 @@ package org.apache.catalina.util;
 
 import java.io.Serial;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 
@@ -89,15 +90,15 @@ public final class ResourceSet<T> extends HashSet<T> {
 
 
     /**
-     * The current lock state of this parameter map.
+     * The current lock state of this set.
      */
     private boolean locked = false;
 
 
     /**
-     * Return the locked state of this parameter map.
+     * Return the locked state of this set.
      *
-     * @return the locked state of this parameter map
+     * @return the locked state of this set
      */
     public boolean isLocked() {
         return this.locked;
@@ -105,7 +106,7 @@ public final class ResourceSet<T> extends HashSet<T> {
 
 
     /**
-     * Set the locked state of this parameter map.
+     * Set the locked state of this set.
      *
      * @param locked The new locked state
      */
@@ -221,6 +222,23 @@ public final class ResourceSet<T> extends HashSet<T> {
     }
 
 
+    @Override
+    public java.util.Spliterator<T> spliterator() {
+        if (locked) {
+            java.util.Spliterator<T> base = super.spliterator();
+            return new java.util.Spliterator<T>() {
+                @Override public boolean 
tryAdvance(java.util.function.Consumer<? super T> action) { return 
base.tryAdvance(action); }
+                @Override public java.util.Spliterator<T> trySplit() { return 
null; }
+                @Override public long estimateSize() { return 
base.estimateSize(); }
+                @Override public int characteristics() { return 
base.characteristics() & ~java.util.Spliterator.SORTED; }
+                @Override public void 
forEachRemaining(java.util.function.Consumer<? super T> action) { 
base.forEachRemaining(action); }
+                @Override public Comparator<? super T> getComparator() { 
return base.getComparator(); }
+            };
+        }
+        return super.spliterator();
+    }
+
+
     /**
      * {@inheritDoc}
      *
diff --git a/java/org/apache/catalina/util/ServerInfo.java 
b/java/org/apache/catalina/util/ServerInfo.java
index 5c8090d550..2a1e32f2fe 100644
--- a/java/org/apache/catalina/util/ServerInfo.java
+++ b/java/org/apache/catalina/util/ServerInfo.java
@@ -54,7 +54,7 @@ public class ServerInfo {
     private static final String serverBuilt;
 
     /**
-     * The server built String, in ISO-8604 date format.
+     * The server built String, in ISO-8601 date format.
      */
     private static final String serverBuiltIso;
 
diff --git a/java/org/apache/catalina/util/SessionConfig.java 
b/java/org/apache/catalina/util/SessionConfig.java
index a2106fb817..9c55cf5cbc 100644
--- a/java/org/apache/catalina/util/SessionConfig.java
+++ b/java/org/apache/catalina/util/SessionConfig.java
@@ -77,7 +77,7 @@ public class SessionConfig {
      *
      * @param context The context
      *
-     * @return the parameter name for the session
+     * @return the cookie path for the session
      */
     public static String getSessionCookiePath(Context context) {
 
diff --git a/java/org/apache/catalina/util/SessionIdGeneratorBase.java 
b/java/org/apache/catalina/util/SessionIdGeneratorBase.java
index 45bf5bb34b..5785f4ea8b 100644
--- a/java/org/apache/catalina/util/SessionIdGeneratorBase.java
+++ b/java/org/apache/catalina/util/SessionIdGeneratorBase.java
@@ -277,7 +277,7 @@ public abstract class SessionIdGeneratorBase extends 
LifecycleBase implements Se
             try {
                 result = 
SecureRandom.getInstance(DEFAULT_SECURE_RANDOM_ALGORITHM);
             } catch (NoSuchAlgorithmException e) {
-                
log.error(sm.getString("sessionIdGeneratorBase.randomAlgorithm", 
secureRandomAlgorithm), e);
+                
log.error(sm.getString("sessionIdGeneratorBase.randomAlgorithm", 
DEFAULT_SECURE_RANDOM_ALGORITHM), e);
             }
         }
 
diff --git a/java/org/apache/catalina/util/Strftime.java 
b/java/org/apache/catalina/util/Strftime.java
index c1dd436670..c9b56fab45 100644
--- a/java/org/apache/catalina/util/Strftime.java
+++ b/java/org/apache/catalina/util/Strftime.java
@@ -29,7 +29,7 @@ import java.util.TimeZone;
  * were literals.</li>
  * <li>Certain complicated commands, like those dealing with the week of the 
year probably don't have exactly the same
  * behavior as strftime.</li>
- * <li>These limitations are due to use SimpleDateTime. If the conversion was 
done manually, all these limitations could
+ * <li>These limitations are due to use SimpleDateFormat. If the conversion 
was done manually, all these limitations could
  * be eliminated.</li>
  * <li>The interface looks like a subset of DateFormat. Maybe someday someone 
will make this class extend
  * DateFormat.</li>
diff --git a/java/org/apache/catalina/util/TimeBucketCounter.java 
b/java/org/apache/catalina/util/TimeBucketCounter.java
index 91e96aa150..4f54ade92f 100644
--- a/java/org/apache/catalina/util/TimeBucketCounter.java
+++ b/java/org/apache/catalina/util/TimeBucketCounter.java
@@ -126,7 +126,7 @@ public class TimeBucketCounter extends 
TimeBucketCounterBase {
     /**
      * Returns the ratio to the next power of 2 so that we can adjust the 
value.
      *
-     * @param value of target duration in seconds
+     * @param value of target duration in milliseconds
      *
      * @return the ratio to the next power of 2 so that we can adjust the value
      */
diff --git a/java/org/apache/catalina/util/XMLWriter.java 
b/java/org/apache/catalina/util/XMLWriter.java
index 146136cccc..a2eb721e8f 100644
--- a/java/org/apache/catalina/util/XMLWriter.java
+++ b/java/org/apache/catalina/util/XMLWriter.java
@@ -111,7 +111,7 @@ public class XMLWriter {
      */
     public void writeProperty(String namespace, String name, String value) {
         writeElement(namespace, name, OPENING);
-        buffer.append(value);
+        buffer.append(Escape.xml(value));
         writeElement(namespace, name, CLOSING);
     }
 
@@ -243,7 +243,17 @@ public class XMLWriter {
      * @param data Data to append
      */
     public void writeData(String data) {
-        buffer.append("<![CDATA[").append(data).append("]]>");
+        buffer.append("<![CDATA[");
+        int start = 0;
+        int idx;
+        while ((idx = data.indexOf("]]>", start)) >= 0) {
+            buffer.append(data, start, idx);
+            // We terminate, then append the ]]>, and restart the sequence
+            buffer.append("]]>]]><![CDATA[");
+            start = idx + 3;
+        }
+        buffer.append(data.substring(start));
+        buffer.append("]]>");
     }
 
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to