From a1529d498e004b3e3b1aa123b57a07435e6d644d Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 11 Dec 2013 00:08:34 -0800 Subject: [PATCH] Fix possible GenericMsgTemplate race condition Fix a potential race condition with GenericMessagingTemplate's inner TemporaryReplyChannel class. Prior to this commit the `hasReceived` member variable was read after calling `replyLatch.countDown()`. Issue: SPR-11206 --- .../messaging/core/GenericMessagingTemplate.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/GenericMessagingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/GenericMessagingTemplate.java index 3e55d27f1a..97dd813ee6 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/GenericMessagingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/GenericMessagingTemplate.java @@ -119,7 +119,6 @@ public class GenericMessagingTemplate extends AbstractDestinationResolvingMessag } } - @SuppressWarnings("unchecked") @Override protected final Message doReceive(MessageChannel channel) { @@ -230,13 +229,14 @@ public class GenericMessagingTemplate extends AbstractDestinationResolvingMessag public boolean send(Message message, long timeout) { this.replyMessage = message; + boolean alreadyReceivedReply = this.hasReceived; this.replyLatch.countDown(); String errorDescription = null; if (this.hasTimedOut) { errorDescription = "Reply message received but the receiving thread has exited due to a timeout"; } - else if (this.hasReceived) { + else if (alreadyReceivedReply) { errorDescription = "Reply message received but the receiving thread has already received a reply"; } else if (this.hasSendFailed) {