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

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

commit d6db22e411307c97ddf78315c15d5889356eca38
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 b278705d74..077cf46136 100644
--- a/java/org/apache/catalina/connector/LocalStrings.properties
+++ b/java/org/apache/catalina/connector/LocalStrings.properties
@@ -50,6 +50,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 cc9a515f96..aa67ec5df5 100644
--- a/java/org/apache/catalina/connector/Request.java
+++ b/java/org/apache/catalina/connector/Request.java
@@ -443,8 +443,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 14f0855b9e..11779d364f 100644
--- a/java/org/apache/catalina/core/ApplicationHttpRequest.java
+++ b/java/org/apache/catalina/core/ApplicationHttpRequest.java
@@ -44,6 +44,7 @@ import org.apache.catalina.Session;
 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;
@@ -600,7 +601,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 d3d47814d0..e737d23ff8 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
 
 applicationServletRegistration.setServletSecurity.iae=Null constraint 
specified for servlet [{0}] deployed to context with name [{1}]
 applicationServletRegistration.setServletSecurity.ise=Security constraints 
can''t be added to servlet [{0}] deployed to context with name [{1}] as the 
context has already been initialised
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 cd627970f9..a71a9c24f4 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
 
 applicationServletRegistration.setServletSecurity.iae=Contrainte nulle 
spécifiée pour le Servlet [{0}] déployé dans le contexte avec le nom [{1}]
 applicationServletRegistration.setServletSecurity.ise=Les contraintes de 
sécurité ne peuvent pas être ajoutées au Servlet [{0}] déployé dans le contexte 
[{1}] car le contexte a déjà été initialisé
diff --git a/java/org/apache/catalina/core/LocalStrings_ja.properties 
b/java/org/apache/catalina/core/LocalStrings_ja.properties
index 7faf8abedc..a64d0ff851 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=リクエストの再利用中に行ったセッションへのアクセス終了処理で例外が送出されました。
 
 applicationServletRegistration.setServletSecurity.iae=サーブレット [{0}] 
に指定されたNULL制約が、名前 [{1}] のコンテキストに配備されました
 applicationServletRegistration.setServletSecurity.ise=コンテキストが既に初期化されているため、名前 
[{1}] のコンテキストに配備されたサーブレット [{0}] にセキュリティ制約を追加できません
diff --git a/java/org/apache/catalina/core/LocalStrings_ko.properties 
b/java/org/apache/catalina/core/LocalStrings_ko.properties
index 6ed9a1005d..a2a79cccec 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=요청을 참조 해제하는 과정에서, 세션에 대한 접근을 종료시키려 
개시하는 중 예외 발생
 
 applicationServletRegistration.setServletSecurity.iae=[{1}](이)라는 이름의 컨텍스트에 배치된 
서블릿 [{0}]을(를) 위해, 널 constraint가 지정되었습니다.
 applicationServletRegistration.setServletSecurity.ise=컨텍스트가 이미 초기화되었기에, 
[{1}](이)라는 이름의 컨텍스트에 배치된 서블릿 [{0}]에 security constraint들이 추가될 수 없습니다.
diff --git a/java/org/apache/catalina/core/LocalStrings_zh_CN.properties 
b/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
index 534134732a..5cd9cab237 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=在回收请求时,异常触发了对会话的结束访问。
 
 
applicationServletRegistration.setServletSecurity.iae=为部署到名为[{1}]的上下文的Servlet[{0}]指定的空约束
 
applicationServletRegistration.setServletSecurity.ise=无法将安全性约束添加到已部署到名称为[{1}]的上下文的servlet
 [{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 af6b3c5b65..7fc668fb0f 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 73a337dcfa..b7b31b6502 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