From 9ba4b47bee166f818484c2e2d312cb2e9acc08dc Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 17 Dec 2016 12:57:18 +0100 Subject: [PATCH] Defensive processing of timeout callback and timeout result Issue: SPR-14978 --- .../context/request/async/DeferredResult.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java index b1d5f05353..e2ad4be263 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java @@ -253,13 +253,24 @@ public class DeferredResult { return new DeferredResultProcessingInterceptorAdapter() { @Override public boolean handleTimeout(NativeWebRequest request, DeferredResult deferredResult) { - if (timeoutCallback != null) { - timeoutCallback.run(); + boolean continueProcessing = true; + try { + if (timeoutCallback != null) { + timeoutCallback.run(); + } } - if (timeoutResult != RESULT_NONE) { - setResultInternal(timeoutResult); + finally { + if (timeoutResult != RESULT_NONE) { + continueProcessing = false; + try { + setResultInternal(timeoutResult); + } + catch (Throwable ex) { + logger.debug("Failed to handle timeout result", ex); + } + } } - return true; + return continueProcessing; } @Override public void afterCompletion(NativeWebRequest request, DeferredResult deferredResult) { -- GitLab