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

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

commit 9375d67106f8df9eb9d7b360b2bef052fe67d3d4
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Oct 5 20:52:46 2023 +0100

    Improve handling of failures during recycle() methods
---
 .../org/apache/catalina/connector/LocalStrings.properties |  1 +
 java/org/apache/catalina/connector/Request.java           |  7 ++++---
 java/org/apache/catalina/core/ApplicationHttpRequest.java |  8 +++++++-
 java/org/apache/catalina/core/LocalStrings.properties     |  1 +
 java/org/apache/catalina/core/LocalStrings_cs.properties  |  2 ++
 java/org/apache/catalina/core/LocalStrings_es.properties  |  2 ++
 java/org/apache/catalina/core/LocalStrings_fr.properties  |  1 +
 java/org/apache/catalina/core/LocalStrings_ja.properties  |  1 +
 java/org/apache/catalina/core/LocalStrings_ko.properties  |  1 +
 .../apache/catalina/core/LocalStrings_zh_CN.properties    |  1 +
 java/org/apache/tomcat/util/buf/B2CConverter.java         | 11 ++++++++++-
 java/org/apache/tomcat/util/buf/C2BConverter.java         | 15 ++++++++++++++-
 java/org/apache/tomcat/util/buf/LocalStrings.properties   |  3 +++
 webapps/docs/changelog.xml                                |  4 ++++
 14 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/java/org/apache/catalina/connector/LocalStrings.properties 
b/java/org/apache/catalina/connector/LocalStrings.properties
index 2b0e8c6998..1efd59b6b5 100644
--- a/java/org/apache/catalina/connector/LocalStrings.properties
+++ b/java/org/apache/catalina/connector/LocalStrings.properties
@@ -49,6 +49,7 @@ coyoteRequest.attributeEvent=Exception thrown by attributes 
event listener
 coyoteRequest.authenticate.ise=Cannot call authenticate() after the response 
has been committed
 coyoteRequest.changeSessionId=Cannot change session ID. There is no session 
associated with this request.
 coyoteRequest.chunkedPostTooLarge=Parameters were not parsed because the size 
of the posted data was too big. Because this request was a chunked request, it 
could not be processed further. Use the maxPostSize attribute of the connector 
to resolve this if the application should accept large POSTs.
+coyoteRequest.deletePartFailed=Failed to deleted temporary file used for part 
[{0}]
 coyoteRequest.filterAsyncSupportUnknown=Unable to determine if any filters do 
not support async processing
 coyoteRequest.getContextPath.ise=Unable to find match between the canonical 
context path [{0}] and the URI presented by the user agent [{1}]
 coyoteRequest.getInputStream.ise=getReader() has already been called for this 
request
diff --git a/java/org/apache/catalina/connector/Request.java 
b/java/org/apache/catalina/connector/Request.java
index 77f7c18bbc..88bb9bc822 100644
--- a/java/org/apache/catalina/connector/Request.java
+++ b/java/org/apache/catalina/connector/Request.java
@@ -444,8 +444,9 @@ public class Request implements HttpServletRequest {
             for (Part part : parts) {
                 try {
                     part.delete();
-                } catch (IOException ignored) {
-                    // ApplicationPart.delete() never throws an IOEx
+                } catch (Throwable t) {
+                    ExceptionUtils.handleThrowable(t);
+                    log.warn(sm.getString("coyoteRequest.deletePartFailed", 
part.getName()), t);
                 }
             }
             parts = null;
@@ -498,8 +499,8 @@ public class Request implements HttpServletRequest {
         asyncSupported = null;
         if (asyncContext != null) {
             asyncContext.recycle();
+            asyncContext = null;
         }
-        asyncContext = null;
     }
 
 
diff --git a/java/org/apache/catalina/core/ApplicationHttpRequest.java 
b/java/org/apache/catalina/core/ApplicationHttpRequest.java
index 1b93479d32..494f4a41cd 100644
--- a/java/org/apache/catalina/core/ApplicationHttpRequest.java
+++ b/java/org/apache/catalina/core/ApplicationHttpRequest.java
@@ -48,6 +48,7 @@ import org.apache.catalina.connector.RequestFacade;
 import org.apache.catalina.util.ParameterMap;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.catalina.util.URLEncoder;
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.http.Parameters;
@@ -618,7 +619,12 @@ class ApplicationHttpRequest extends 
HttpServletRequestWrapper {
      */
     public void recycle() {
         if (session != null) {
-            session.endAccess();
+            try {
+                session.endAccess();
+            } catch (Throwable t) {
+                ExceptionUtils.handleThrowable(t);
+                
context.getLogger().warn(sm.getString("applicationHttpRequest.sessionEndAccessFail"),
 t);
+            }
         }
     }
 
diff --git a/java/org/apache/catalina/core/LocalStrings.properties 
b/java/org/apache/catalina/core/LocalStrings.properties
index 44cd9a37a5..a43dfd9f25 100644
--- a/java/org/apache/catalina/core/LocalStrings.properties
+++ b/java/org/apache/catalina/core/LocalStrings.properties
@@ -59,6 +59,7 @@ applicationFilterRegistration.nullInitParam=Unable to set 
initialisation paramet
 applicationFilterRegistration.nullInitParams=Unable to set initialisation 
parameters for filter due to null name and/or value. Name [{0}], Value [{1}]
 
 applicationHttpRequest.fragmentInDispatchPath=The fragment in dispatch path 
[{0}] has been removed
+applicationHttpRequest.sessionEndAccessFail=Exception triggered ending access 
to session while recycling request
 
 applicationPushBuilder.methodInvalid=The HTTP method for a push request must 
be both cacheable and safe but [{0}] is not
 applicationPushBuilder.methodNotToken=HTTP methods must be tokens but [{0}] 
contains a non-token character
diff --git a/java/org/apache/catalina/core/LocalStrings_cs.properties 
b/java/org/apache/catalina/core/LocalStrings_cs.properties
index 0128dad5e4..81c77bba79 100644
--- a/java/org/apache/catalina/core/LocalStrings_cs.properties
+++ b/java/org/apache/catalina/core/LocalStrings_cs.properties
@@ -24,6 +24,8 @@ applicationDispatcher.specViolation.response=Původní 
ServletResponse nebo zapo
 
 applicationFilterRegistration.nullInitParams=Není možné nastavit inicializační 
parametry pro filtr kvůli hodnotě null ve jménu či hodnotě. Jméno [{0}], 
Hodnota [{1}]
 
+applicationHttpRequest.sessionEndAccessFail=Výjimka vyvolala ukončení přístupu 
k session během recykllování dotazu
+
 aprListener.initializingFIPS=Inicializace FIPS módu...
 
 containerBase.backgroundProcess.cluster=Výjimka při zpracování procesu na 
pozadí v clusteru [{0}]
diff --git a/java/org/apache/catalina/core/LocalStrings_es.properties 
b/java/org/apache/catalina/core/LocalStrings_es.properties
index dc863717dd..2ba6d5b5b6 100644
--- a/java/org/apache/catalina/core/LocalStrings_es.properties
+++ b/java/org/apache/catalina/core/LocalStrings_es.properties
@@ -52,6 +52,8 @@ applicationFilterConfig.jmxUnregisterFail=Ha fallado el 
desregistro JMX para el
 applicationFilterRegistration.nullInitParam=No puedo poner el parámetro de 
inicialización para el filtro debido a un nombre nulo y/o valor. Nombre [{0}], 
Valor [{1}]
 applicationFilterRegistration.nullInitParams=No puedo poner los parámetros de 
inicialización para el filtro debido a un nombre nulo y/o valor. Nombre [{0}], 
Valor [{1}]
 
+applicationHttpRequest.sessionEndAccessFail=Excepción disparada acabando 
acceso a sesión mientras se reciclaba el requerimiento
+
 applicationServletRegistration.setServletSecurity.iae=Se ha especificado 
restricción Null para el servlet [{0}] desplegado en el contexto con el nombre 
[{1}]
 applicationServletRegistration.setServletSecurity.ise=No se pueden añadir 
restricciones de seguridad al servlet [{0}] desplegado en el contexto con el 
nombre [{1}] ya que el contexto ya ha sido inicializado.
 
diff --git a/java/org/apache/catalina/core/LocalStrings_fr.properties 
b/java/org/apache/catalina/core/LocalStrings_fr.properties
index b5a52542e5..a3d557cba7 100644
--- a/java/org/apache/catalina/core/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/core/LocalStrings_fr.properties
@@ -59,6 +59,7 @@ applicationFilterRegistration.nullInitParam=Impossible de 
fixer le paramètre d'
 applicationFilterRegistration.nullInitParams=Impossible de fixer les 
paramètres d''initialisation du filtre, à cause d''un nom ou d''une valeur 
nulle, nom [{0}], valeur [{1}]
 
 applicationHttpRequest.fragmentInDispatchPath=Le fragment dans le chemin de 
dispatch [{0}] a été enlevé
+applicationHttpRequest.sessionEndAccessFail=Exception lancée durant l'arrêt de 
l'accès à la session durant le recyclage de la requête
 
 applicationPushBuilder.methodInvalid=La méthode HTTP pour une requête push 
doit être à la fois être sans danger et pouvoir être mise en cache, mais [{0}] 
ne correspond pas
 applicationPushBuilder.methodNotToken=Les méthodes HTTP doivent être des 
"token", mais [{0}] contient un caractère invalide dans un token.
diff --git a/java/org/apache/catalina/core/LocalStrings_ja.properties 
b/java/org/apache/catalina/core/LocalStrings_ja.properties
index 6e3757ffd0..675f70f1f9 100644
--- a/java/org/apache/catalina/core/LocalStrings_ja.properties
+++ b/java/org/apache/catalina/core/LocalStrings_ja.properties
@@ -59,6 +59,7 @@ applicationFilterRegistration.nullInitParam=NULLの名前や値のためにフ
 applicationFilterRegistration.nullInitParams=キー [{0}] または値 [{1}] のいずれかが null 
のためフィルターの初期化パラメータを設定できません。
 
 applicationHttpRequest.fragmentInDispatchPath=ディスパッチパス [{0}] 中のフラグメントは除去されました
+applicationHttpRequest.sessionEndAccessFail=リクエストの再利用中に行ったセッションへのアクセス終了処理で例外が送出されました。
 
 applicationPushBuilder.methodInvalid=プッシュリクエストの HTTP 
メソッドはキャッシュ可能、かつ、安全でなければなりません。[{0}] は指定できません。
 applicationPushBuilder.methodNotToken=HTTP メソッド [{0}] にトークンとして利用できない文字が含まれています。
diff --git a/java/org/apache/catalina/core/LocalStrings_ko.properties 
b/java/org/apache/catalina/core/LocalStrings_ko.properties
index d207a034c3..1ff351337a 100644
--- a/java/org/apache/catalina/core/LocalStrings_ko.properties
+++ b/java/org/apache/catalina/core/LocalStrings_ko.properties
@@ -59,6 +59,7 @@ applicationFilterRegistration.nullInitParam=이름 또는 값 또는 둘 다 널
 applicationFilterRegistration.nullInitParams=널인 이름 또는 값 때문에, 필터의 초기화 파라미터를 설정할 
수 없습니다. 이름: [{0}], 값: [{1}]
 
 applicationHttpRequest.fragmentInDispatchPath=디스패치 경로 [{0}](으)로부터 URI 
fragment를 제거했습니다.
+applicationHttpRequest.sessionEndAccessFail=요청을 참조 해제하는 과정에서, 세션에 대한 접근을 종료시키려 
개시하는 중 예외 발생
 
 applicationPushBuilder.methodInvalid=PUSH 요청을 위한 HTTP 메소드는 반드시 캐시 가능하고 안전해야 
하는데, [{0}]은(는) 그렇지 않습니다.
 applicationPushBuilder.methodNotToken=HTTP 메소드들은 토큰들이어야 하지만, [{0}]은(는) 토큰이 아닌 
문자를 포함하고 있습니다.
diff --git a/java/org/apache/catalina/core/LocalStrings_zh_CN.properties 
b/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
index 0f7804b75d..eb47d6ab2f 100644
--- a/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
+++ b/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
@@ -60,6 +60,7 @@ applicationFilterRegistration.nullInitParam=由于名称和/或值为空,无
 
applicationFilterRegistration.nullInitParams=由于name和(或)value为null,无法为过滤器设置初始化参数。name为
 [{0}],value为 [{1}]
 
 applicationHttpRequest.fragmentInDispatchPath=调度路径[{0}]中的片段已被删除
+applicationHttpRequest.sessionEndAccessFail=在回收请求时,异常触发了对会话的结束访问。
 
 applicationPushBuilder.methodInvalid=推送请求的HTTP方法必须既可缓存又安全,但是[{0}]不是
 applicationPushBuilder.methodNotToken=HTTP方法必须是令牌(token),但 [{0}] 包含非令牌字符
diff --git a/java/org/apache/tomcat/util/buf/B2CConverter.java 
b/java/org/apache/tomcat/util/buf/B2CConverter.java
index 935e89310b..68cbd05598 100644
--- a/java/org/apache/tomcat/util/buf/B2CConverter.java
+++ b/java/org/apache/tomcat/util/buf/B2CConverter.java
@@ -26,6 +26,9 @@ import java.nio.charset.CoderResult;
 import java.nio.charset.CodingErrorAction;
 import java.util.Locale;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -33,6 +36,7 @@ import org.apache.tomcat.util.res.StringManager;
  */
 public class B2CConverter {
 
+    private static final Log log = LogFactory.getLog(B2CConverter.class);
     private static final StringManager sm = 
StringManager.getManager(B2CConverter.class);
 
     private static final CharsetCache charsetCache = new CharsetCache();
@@ -96,7 +100,12 @@ public class B2CConverter {
      * Reset the decoder state.
      */
     public void recycle() {
-        decoder.reset();
+        try {
+            decoder.reset();
+        } catch (Throwable t) {
+            ExceptionUtils.handleThrowable(t);
+            log.warn(sm.getString("b2cConverter.decoderResetFail", 
decoder.charset()), t);
+        }
         leftovers.position(0);
     }
 
diff --git a/java/org/apache/tomcat/util/buf/C2BConverter.java 
b/java/org/apache/tomcat/util/buf/C2BConverter.java
index 5cff0f3a78..9c0c34b4c4 100644
--- a/java/org/apache/tomcat/util/buf/C2BConverter.java
+++ b/java/org/apache/tomcat/util/buf/C2BConverter.java
@@ -24,11 +24,19 @@ import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
 import java.nio.charset.CodingErrorAction;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * NIO based character encoder.
  */
 public final class C2BConverter {
 
+    private static final Log log = LogFactory.getLog(C2BConverter.class);
+    private static final StringManager sm = 
StringManager.getManager(C2BConverter.class);
+
     private final CharsetEncoder encoder;
     private ByteBuffer bb = null;
     private CharBuffer cb = null;
@@ -49,7 +57,12 @@ public final class C2BConverter {
      * Reset the encoder state.
      */
     public void recycle() {
-        encoder.reset();
+        try {
+            encoder.reset();
+        } catch (Throwable t) {
+            ExceptionUtils.handleThrowable(t);
+            log.warn(sm.getString("c2bConverter.decoderResetFail", 
encoder.charset()), t);
+        }
         leftovers.position(0);
     }
 
diff --git a/java/org/apache/tomcat/util/buf/LocalStrings.properties 
b/java/org/apache/tomcat/util/buf/LocalStrings.properties
index 576eea58a8..a9ed4914c6 100644
--- a/java/org/apache/tomcat/util/buf/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/buf/LocalStrings.properties
@@ -16,10 +16,13 @@
 asn1Parser.lengthInvalid=Invalid length [{0}] bytes reported when the input 
data length is [{1}] bytes
 asn1Parser.tagMismatch=Expected to find value [{0}] but found value [{1}]
 
+b2cConverter.decoderResetFail=Failed to reset instance of decoder for 
character set [{0}]
 b2cConverter.unknownEncoding=The character encoding [{0}] is not supported
 
 byteBufferUtils.cleaner=Cannot use direct ByteBuffer cleaner, memory leaking 
may occur
 
+c2bConverter.encoderResetFail=Failed to reset instance of encoder for 
character set [{0}]
+
 chunk.overflow=Buffer overflow and no sink is set, limit [{0}] and buffer 
length [{1}]
 
 encodedSolidusHandling.invalid=The value [{0}] is not recognised
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 831bbe63a6..20ef9f669a 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -125,6 +125,10 @@
         <bug>67472</bug>: Send fewer CORS-related headers when CORS is not
         actually being engaged. (schultz)
       </fix>
+      <add>
+        Improve handling of failures within <code>recycle()</code> methods.
+        (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to