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

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


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 95a05b6a2c Minor fixes from code review
95a05b6a2c is described below

commit 95a05b6a2c62de58a10b1f539e640895d9eb1884
Author: remm <[email protected]>
AuthorDate: Wed Jun 10 16:42:47 2026 +0200

    Minor fixes from code review
---
 .../catalina/ant/jmx/JMXAccessorConditionBase.java   |  3 ++-
 .../catalina/ant/jmx/JMXAccessorCreateTask.java      |  6 ++++--
 .../catalina/ant/jmx/JMXAccessorEqualsCondition.java |  1 -
 .../apache/catalina/ant/jmx/JMXAccessorGetTask.java  |  4 +++-
 .../catalina/ant/jmx/JMXAccessorInvokeTask.java      |  3 +++
 .../catalina/ant/jmx/JMXAccessorQueryTask.java       |  5 +++--
 .../apache/catalina/ant/jmx/JMXAccessorSetTask.java  |  4 +++-
 .../org/apache/catalina/ant/jmx/JMXAccessorTask.java |  7 +++----
 .../catalina/ant/jmx/JMXAccessorUnregisterTask.java  |  8 +++++---
 .../catalina/authenticator/BasicAuthenticator.java   |  6 ++++--
 .../org/apache/catalina/authenticator/Constants.java | 12 ++++++------
 .../catalina/authenticator/DigestAuthenticator.java  |  3 +--
 .../catalina/authenticator/SingleSignOnEntry.java    |  3 ++-
 .../catalina/authenticator/SpnegoAuthenticator.java  |  2 +-
 .../jaspic/PersistentProviderRegistrations.java      |  7 ++++---
 .../jaspic/SimpleServerAuthContext.java              |  9 +++++++--
 .../apache/catalina/connector/CoyotePrincipal.java   | 20 ++++++++++++++++++++
 java/org/apache/catalina/connector/CoyoteReader.java |  3 +++
 java/org/apache/catalina/connector/CoyoteWriter.java |  1 -
 java/org/apache/catalina/connector/Request.java      |  5 ++++-
 java/org/apache/catalina/connector/Response.java     |  6 ++++++
 .../apache/catalina/connector/ResponseFacade.java    |  8 ++------
 java/org/apache/catalina/core/AccessLogAdapter.java  |  8 ++++++--
 java/org/apache/catalina/realm/GenericPrincipal.java | 19 +++++++++++++++++++
 .../buildutil/translate/BackportTranslations.java    |  5 ++++-
 .../apache/tomcat/buildutil/translate/Import.java    |  1 +
 26 files changed, 116 insertions(+), 43 deletions(-)

diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
index e114f25439..7f64bbc81b 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java
@@ -22,6 +22,7 @@ import java.net.MalformedURLException;
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
 
+import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.ProjectComponent;
 import org.apache.tools.ant.taskdefs.condition.Condition;
 
@@ -233,7 +234,7 @@ public abstract class JMXAccessorConditionBase extends 
ProjectComponent implemen
                 return result.toString();
             }
         } catch (Exception e) {
-            // ignore access or connection open errors
+            throw new BuildException("Cannot access JMX value for condition", 
e);
         }
         return null;
     }
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java
index be1fa8ee2f..18bc588615 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java
@@ -139,12 +139,14 @@ public class JMXAccessorCreateTask extends 
JMXAccessorTask {
 
     @Override
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
         if (getName() == null) {
             throw new BuildException("Must specify a 'name'");
         }
         if ((className == null)) {
-            throw new BuildException("Must specify a 'className' for get");
+            throw new BuildException("Must specify a 'className' for create");
+        }
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
         }
         jmxCreate(jmxServerConnection, getName());
         return null;
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java
index a58fef60b4..b8d2c87ecc 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java
@@ -74,7 +74,6 @@ public class JMXAccessorEqualsCondition extends 
JMXAccessorConditionBase {
         if (getName() == null || getAttribute() == null) {
             throw new BuildException("Must specify an MBean name and attribute 
for equals condition");
         }
-        // FIXME check url or host/parameter
         String jmxValue = accessJMXValue();
         if (jmxValue != null) {
             return jmxValue.equals(value);
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java
index 4ad5b6c011..78fe5dfece 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java
@@ -89,13 +89,15 @@ public class JMXAccessorGetTask extends JMXAccessorTask {
 
     @Override
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
         if (getName() == null) {
             throw new BuildException("Must specify a 'name'");
         }
         if ((attribute == null)) {
             throw new BuildException("Must specify a 'attribute' for get");
         }
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
+        }
         return jmxGet(jmxServerConnection, getName());
     }
 
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java
index 7fa478cb35..f1d0c50eb7 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java
@@ -156,6 +156,9 @@ public class JMXAccessorInvokeTask extends JMXAccessorTask {
         if ((operation == null)) {
             throw new BuildException("Must specify a 'operation' for call");
         }
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
+        }
         return jmxInvoke(jmxServerConnection, getName());
     }
 
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java
index 600f17751a..7e70bb7287 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java
@@ -90,12 +90,13 @@ public class JMXAccessorQueryTask extends JMXAccessorTask {
 
     @Override
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
         if (getName() == null) {
             throw new BuildException("Must specify a 'name'");
         }
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
+        }
         return jmxQuery(jmxServerConnection, getName());
-
     }
 
 
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java
index 08fae8da40..b09de55dd7 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java
@@ -151,13 +151,15 @@ public class JMXAccessorSetTask extends JMXAccessorTask {
 
     @Override
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
         if (getName() == null) {
             throw new BuildException("Must specify a 'name'");
         }
         if ((attribute == null || value == null)) {
             throw new BuildException("Must specify a 'attribute' and 'value' 
for set");
         }
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
+        }
         return jmxSet(jmxServerConnection, getName());
     }
 
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java
index bee239ac2f..8629b91c0c 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java
@@ -436,6 +436,7 @@ public class JMXAccessorTask extends 
BaseRedirectorHelperTask {
             environment = new HashMap<>();
             environment.put(JMXConnector.CREDENTIALS, credentials);
         }
+        // FIXME: Referencing JMXConnector instead of MBeanServerConnection is 
needed to close the connection
         return JMXConnectorFactory.connect(new JMXServiceURL(urlForJMX), 
environment).getMBeanServerConnection();
 
     }
@@ -515,7 +516,6 @@ public class JMXAccessorTask extends 
BaseRedirectorHelperTask {
      * @return the JMX connection
      */
     protected MBeanServerConnection getJMXConnection() throws 
MalformedURLException, IOException {
-
         MBeanServerConnection jmxServerConnection = null;
         if (isUseRef()) {
             Object pref;
@@ -552,8 +552,7 @@ public class JMXAccessorTask extends 
BaseRedirectorHelperTask {
      * @exception Exception if an error occurs
      */
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
-        if ((jmxServerConnection == null)) {
+        if (jmxServerConnection == null) {
             throw new BuildException("Must open a connection!");
         } else if (isEcho()) {
             handleOutput("JMX Connection ref=" + ref + " is open!");
@@ -562,7 +561,7 @@ public class JMXAccessorTask extends 
BaseRedirectorHelperTask {
     }
 
     /**
-     * Convert string to datatype FIXME How we can transfer values from ant 
project reference store (ref)?
+     * Convert string to datatype.
      *
      * @param value     The value
      * @param valueType The type
diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java 
b/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java
index ed09b0fb09..ad7e47ac00 100644
--- a/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java
+++ b/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java
@@ -59,11 +59,13 @@ public class JMXAccessorUnregisterTask extends 
JMXAccessorTask {
 
     @Override
     public String jmxExecute(MBeanServerConnection jmxServerConnection) throws 
Exception {
-
         if (getName() == null) {
             throw new BuildException("Must specify a 'name'");
         }
-        return jmxUuregister(jmxServerConnection, getName());
+        if (jmxServerConnection == null) {
+            throw new BuildException("Must open a connection!");
+        }
+        return jmxUnregister(jmxServerConnection, getName());
     }
 
 
@@ -77,7 +79,7 @@ public class JMXAccessorUnregisterTask extends 
JMXAccessorTask {
      *
      * @throws Exception An error occurred
      */
-    protected String jmxUuregister(MBeanServerConnection jmxServerConnection, 
String name) throws Exception {
+    protected String jmxUnregister(MBeanServerConnection jmxServerConnection, 
String name) throws Exception {
         if (isEcho()) {
             handleOutput("Unregister MBean " + name);
         }
diff --git a/java/org/apache/catalina/authenticator/BasicAuthenticator.java 
b/java/org/apache/catalina/authenticator/BasicAuthenticator.java
index f0f76cc8d5..c95498478e 100644
--- a/java/org/apache/catalina/authenticator/BasicAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/BasicAuthenticator.java
@@ -51,7 +51,8 @@ public class BasicAuthenticator extends AuthenticatorBase {
 
 
     /**
-     * Returns the character set used for encoding credentials.
+     * Returns the character set used for encoding credentials, as set by the 
user.
+     * If the charset was null or empty, the effective charset will be 
ISO-8859-1.
      *
      * @return the character set name
      */
@@ -61,7 +62,8 @@ public class BasicAuthenticator extends AuthenticatorBase {
 
 
     /**
-     * Sets the character set used for encoding credentials.
+     * Sets the character set used for encoding credentials. Empty charsets 
will set
+     * ISO-8859-1.
      *
      * @param charsetString the character set name
      */
diff --git a/java/org/apache/catalina/authenticator/Constants.java 
b/java/org/apache/catalina/authenticator/Constants.java
index ecc11979c0..336baaa099 100644
--- a/java/org/apache/catalina/authenticator/Constants.java
+++ b/java/org/apache/catalina/authenticator/Constants.java
@@ -115,16 +115,16 @@ public class Constants {
 
 
     /**
-     * If the <code>cache</code> property of the authenticator is set, and the 
current request is part of a session, the
-     * password used to authenticate this user will be cached under this key 
to avoid the need for repeated calls to
-     * <code>Realm.authenticate()</code>.
+     * When the <code>cache</code> property of the authenticator is set to 
<code>false</code>, the Principal is not cached.
+     * In this case, if the current request is part of a session, the password 
used to authenticate this user will be stored
+     * under this key so the user can be re-authenticated on subsequent 
requests.
      */
     public static final String SESS_PASSWORD_NOTE = 
"org.apache.catalina.session.PASSWORD";
 
     /**
-     * If the <code>cache</code> property of the authenticator is set, and the 
current request is part of a session, the
-     * username used to authenticate this user will be cached under this key 
to avoid the need for repeated calls to
-     * <code>Realm.authenticate()</code>.
+     * When the <code>cache</code> property of the authenticator is set to 
<code>false</code>, the Principal is not cached.
+     * In this case, if the current request is part of a session, the username 
used to authenticate this user will be stored
+     * under this key so the user can be re-authenticated on subsequent 
requests.
      */
     public static final String SESS_USERNAME_NOTE = 
"org.apache.catalina.session.USERNAME";
 
diff --git a/java/org/apache/catalina/authenticator/DigestAuthenticator.java 
b/java/org/apache/catalina/authenticator/DigestAuthenticator.java
index 13050eb7e4..561db5c3ab 100644
--- a/java/org/apache/catalina/authenticator/DigestAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/DigestAuthenticator.java
@@ -705,8 +705,7 @@ public class DigestAuthenticator extends AuthenticatorBase {
             }
 
             // Validate the Realm name
-            String lcRealm = getRealmName(request.getContext());
-            if (!lcRealm.equals(realmName)) {
+            if (!realmName.equals(getRealmName(request.getContext()))) {
                 return false;
             }
 
diff --git a/java/org/apache/catalina/authenticator/SingleSignOnEntry.java 
b/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
index 757e46c312..84457296f2 100644
--- a/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
+++ b/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
@@ -57,7 +57,8 @@ public class SingleSignOnEntry implements Serializable {
     private transient Principal principal = null;
 
     /**
-     * Map of session keys associated with this SSO entry.
+     * Set of session keys associated with this SSO entry. Backed by 
ConcurrentHashMap to take
+     * advantage of its thread safety features.
      */
     private final Map<SingleSignOnSessionKey,SingleSignOnSessionKey> 
sessionKeys = new ConcurrentHashMap<>();
 
diff --git a/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java 
b/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java
index 86ebea7910..a02a61df75 100644
--- a/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java
@@ -333,7 +333,7 @@ public class SpnegoAuthenticator extends AuthenticatorBase {
             }
         }
 
-        // Send response token on success and failure
+        // Send response token since one is available, even for SC_UNAUTHORIZED
         response.setHeader(AUTH_HEADER_NAME,
                 AUTH_HEADER_VALUE_NEGOTIATE + " " + 
Base64.getEncoder().encodeToString(outToken));
 
diff --git 
a/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java
 
b/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java
index 72578885c4..ffaada6ece 100644
--- 
a/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java
+++ 
b/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java
@@ -37,6 +37,7 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.util.security.Escape;
 import org.xml.sax.SAXException;
 
 /**
@@ -133,9 +134,9 @@ public final class PersistentProviderRegistrations {
                 writer.write(">\n");
                 for (Entry<String,String> entry : 
provider.getProperties().entrySet()) {
                     writer.write("    <property name=\"");
-                    writer.write(entry.getKey());
+                    writer.write(Escape.xml(entry.getKey()));
                     writer.write("\" value=\"");
-                    writer.write(entry.getValue());
+                    writer.write(Escape.xml(entry.getValue()));
                     writer.write("\"/>\n");
                 }
                 writer.write("  </provider>\n");
@@ -174,7 +175,7 @@ public final class PersistentProviderRegistrations {
     private static void writeOptional(String name, String value, Writer 
writer) throws IOException {
         if (value != null) {
             writer.write(" " + name + "=\"");
-            writer.write(value);
+            writer.write(Escape.xml(value));
             writer.write("\"");
         }
     }
diff --git 
a/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java 
b/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java
index 5aaaf27786..dbc651d804 100644
--- a/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java
+++ b/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java
@@ -73,8 +73,13 @@ public class SimpleServerAuthContext implements 
ServerAuthContext {
      */
     @Override
     public AuthStatus secureResponse(MessageInfo messageInfo, Subject 
serviceSubject) throws AuthException {
-        ServerAuthModule module = modules.get(((Integer) 
messageInfo.getMap().get("moduleIndex")).intValue());
-        return module.secureResponse(messageInfo, serviceSubject);
+        Object obj = messageInfo.getMap().get("moduleIndex");
+        if (obj instanceof Integer) {
+            ServerAuthModule module = modules.get(((Integer) obj).intValue());
+            return module.secureResponse(messageInfo, serviceSubject);
+        } else {
+            return AuthStatus.SEND_FAILURE;
+        }
     }
 
 
diff --git a/java/org/apache/catalina/connector/CoyotePrincipal.java 
b/java/org/apache/catalina/connector/CoyotePrincipal.java
index 50ea1bc61e..d1b57d6008 100644
--- a/java/org/apache/catalina/connector/CoyotePrincipal.java
+++ b/java/org/apache/catalina/connector/CoyotePrincipal.java
@@ -18,6 +18,7 @@ package org.apache.catalina.connector;
 
 import java.io.Serializable;
 import java.security.Principal;
+import java.util.Objects;
 
 /**
  * Generic implementation of <strong>java.security.Principal</strong> that is 
used to represent principals authenticated
@@ -68,4 +69,23 @@ public class CoyotePrincipal implements Principal, 
Serializable {
     }
 
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        CoyotePrincipal that = (CoyotePrincipal) obj;
+        return Objects.equals(this.name, that.name);
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name);
+    }
+
+
 }
diff --git a/java/org/apache/catalina/connector/CoyoteReader.java 
b/java/org/apache/catalina/connector/CoyoteReader.java
index 1b23f33083..2620226b20 100644
--- a/java/org/apache/catalina/connector/CoyoteReader.java
+++ b/java/org/apache/catalina/connector/CoyoteReader.java
@@ -57,6 +57,9 @@ public class CoyoteReader extends BufferedReader {
      * @param ib The underlying input buffer
      */
     public CoyoteReader(InputBuffer ib) {
+        // BufferedReader requires a non-zero buffer size. All read operations 
are
+        // overridden to delegate directly to InputBuffer, so the parent 
buffer is
+        // never used. Size of 1 minimizes the allocation.
         super(ib, 1);
         this.ib = ib;
     }
diff --git a/java/org/apache/catalina/connector/CoyoteWriter.java 
b/java/org/apache/catalina/connector/CoyoteWriter.java
index 5f036d429a..0cfc488aa8 100644
--- a/java/org/apache/catalina/connector/CoyoteWriter.java
+++ b/java/org/apache/catalina/connector/CoyoteWriter.java
@@ -118,7 +118,6 @@ public class CoyoteWriter extends PrintWriter {
         } catch (IOException ignore) {
             // Ignore
         }
-        error = false;
 
     }
 
diff --git a/java/org/apache/catalina/connector/Request.java 
b/java/org/apache/catalina/connector/Request.java
index 8fd32766e4..a8f355ad9b 100644
--- a/java/org/apache/catalina/connector/Request.java
+++ b/java/org/apache/catalina/connector/Request.java
@@ -1561,6 +1561,9 @@ public class Request implements HttpServletRequest {
      */
     private void notifyAttributeRemoved(String name, Object value) {
         Context context = getContext();
+        if (context == null) {
+            return;
+        }
         Object[] listeners = context.getApplicationEventListeners();
         if (listeners == null || listeners.length == 0) {
             return;
@@ -3268,7 +3271,7 @@ public class Request implements HttpServletRequest {
         int len = 0;
         while (len > -1) {
             len = getStream().read(buffer, 0, CACHED_POST_LEN);
-            if (connector.getMaxPostSize() >= 0 && (body.getLength() + len) > 
connector.getMaxPostSize()) {
+            if (connector.getMaxPostSize() >= 0 && ((long) body.getLength() + 
len) > connector.getMaxPostSize()) {
                 // Too much data
                 checkSwallowInput();
                 throw new 
IllegalStateException(sm.getString("coyoteRequest.chunkedPostTooLarge"));
diff --git a/java/org/apache/catalina/connector/Response.java 
b/java/org/apache/catalina/connector/Response.java
index 090c54e2cb..89996947c1 100644
--- a/java/org/apache/catalina/connector/Response.java
+++ b/java/org/apache/catalina/connector/Response.java
@@ -909,6 +909,9 @@ public class Response implements HttpServletResponse {
         cookies.add(cookie);
 
         String header = generateCookieString(cookie);
+        if (header == null) {
+            return;
+        }
         // if we reached here, no exception, cookie is valid
         addHeader("Set-Cookie", header, 
getContext().getCookieProcessor().getCharset());
     }
@@ -927,6 +930,9 @@ public class Response implements HttpServletResponse {
         final String headername = "Set-Cookie";
         final String startsWith = name + "=";
         String header = generateCookieString(cookie);
+        if (header == null) {
+            return;
+        }
         boolean set = false;
         MimeHeaders headers = getCoyoteResponse().getMimeHeaders();
         int n = headers.size();
diff --git a/java/org/apache/catalina/connector/ResponseFacade.java 
b/java/org/apache/catalina/connector/ResponseFacade.java
index a1e6edfab4..f7e637893d 100644
--- a/java/org/apache/catalina/connector/ResponseFacade.java
+++ b/java/org/apache/catalina/connector/ResponseFacade.java
@@ -184,18 +184,14 @@ public class ResponseFacade implements 
HttpServletResponse {
 
     @Override
     public ServletOutputStream getOutputStream() throws IOException {
-        if (isFinished()) {
-            response.setSuspended(true);
-        }
+        checkFacade();
         return response.getOutputStream();
     }
 
 
     @Override
     public PrintWriter getWriter() throws IOException {
-        if (isFinished()) {
-            response.setSuspended(true);
-        }
+        checkFacade();
         return response.getWriter();
     }
 
diff --git a/java/org/apache/catalina/core/AccessLogAdapter.java 
b/java/org/apache/catalina/core/AccessLogAdapter.java
index 64afeb513e..38a3f62aeb 100644
--- a/java/org/apache/catalina/core/AccessLogAdapter.java
+++ b/java/org/apache/catalina/core/AccessLogAdapter.java
@@ -66,8 +66,12 @@ public class AccessLogAdapter implements AccessLog {
 
     @Override
     public boolean getRequestAttributesEnabled() {
-        // NOOP. Could return logs[0].getRequestAttributesEnabled(), but I do
-        // not see a use case for that.
+        for (AccessLog log : logs) {
+            // Return true if any AccessLog is going to use the attributes
+            if (log.getRequestAttributesEnabled()) {
+                return true;
+            }
+        }
         return false;
     }
 }
diff --git a/java/org/apache/catalina/realm/GenericPrincipal.java 
b/java/org/apache/catalina/realm/GenericPrincipal.java
index 5afcc9b55e..349b1371ac 100644
--- a/java/org/apache/catalina/realm/GenericPrincipal.java
+++ b/java/org/apache/catalina/realm/GenericPrincipal.java
@@ -293,6 +293,25 @@ public class GenericPrincipal implements TomcatPrincipal, 
Serializable {
     }
 
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        GenericPrincipal that = (GenericPrincipal) obj;
+        return Objects.equals(this.name, that.name);
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name);
+    }
+
+
     @Override
     public void logout() throws Exception {
         if (loginContext != null) {
diff --git 
a/java/org/apache/tomcat/buildutil/translate/BackportTranslations.java 
b/java/org/apache/tomcat/buildutil/translate/BackportTranslations.java
index aaa65fd0c1..183a653372 100644
--- a/java/org/apache/tomcat/buildutil/translate/BackportTranslations.java
+++ b/java/org/apache/tomcat/buildutil/translate/BackportTranslations.java
@@ -58,6 +58,10 @@ public class BackportTranslations extends BackportBase {
             }
 
             Properties sourceTranslated = sourceTranslations.get(language);
+            if (sourceTranslated == null) {
+                sourceTranslated = new Properties();
+                sourceTranslations.put(language, sourceTranslated);
+            }
             Properties targetTranslated = targetTranslations.get(language);
             if (targetTranslated == null) {
                 targetTranslated = new Properties();
@@ -66,7 +70,6 @@ public class BackportTranslations extends BackportBase {
 
             for (Object key : targetEnglish.keySet()) {
                 if (sourceTranslated.containsKey(key) && 
targetEnglish.get(key).equals(sourceEnglish.get(key))) {
-
                     targetTranslated.put(key, sourceTranslated.get(key));
                 }
             }
diff --git a/java/org/apache/tomcat/buildutil/translate/Import.java 
b/java/org/apache/tomcat/buildutil/translate/Import.java
index c2f6fef1a5..34136de39c 100644
--- a/java/org/apache/tomcat/buildutil/translate/Import.java
+++ b/java/org/apache/tomcat/buildutil/translate/Import.java
@@ -85,6 +85,7 @@ public class Import {
                 }
                 File outFile = new File(currentPkg.replace('.', 
File.separatorChar),
                         Constants.L10N_PREFIX + language + 
Constants.L10N_SUFFIX);
+                // fos will be closed through w if w is replaced by another one
                 FileOutputStream fos = new FileOutputStream(outFile);
                 w = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
                 org.apache.tomcat.buildutil.Utils.insertLicense(w);


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

Reply via email to