activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Hadrian Zbarcea (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (AMQ-5381) ActiveMQBytesMessage mishandles restoration of old message contents
Date Thu, 18 Dec 2014 03:09:13 GMT

     [ https://issues.apache.org/jira/browse/AMQ-5381?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Hadrian Zbarcea updated AMQ-5381:
---------------------------------
    Fix Version/s: 5.10.1

> ActiveMQBytesMessage mishandles restoration of old message contents
> -------------------------------------------------------------------
>
>                 Key: AMQ-5381
>                 URL: https://issues.apache.org/jira/browse/AMQ-5381
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: JMS client
>    Affects Versions: 5.9.1, 5.10.0
>            Reporter: Brian D. Johnson
>            Assignee: Timothy Bish
>              Labels: easyfix
>             Fix For: 5.10.1, 5.11.0
>
>
> Changes made in ActiveMQ 5.9.1, AMQ-4887, [[cb5c29d02d02dc7f7fa4f5c1a97bd2a59078bccd|https://github.com/apache/activemq/commit/cb5c29d02d02dc7f7fa4f5c1a97bd2a59078bccd#diff-c0b18b235652457c810fe322bce65e31]]
introduced a bug in {{ActiveMQBytesMessage}} which results in a {{java.util.zip.ZipException:
incorrect header check}} being thrown at {{org.apache.activemq.command.ActiveMQBytesMessage.restoreOldContent(ActiveMQBytesMessage.java:883)}}
when a consumer attempts to reuse a received {{ActiveMQBytesMessage}}.
> This bug is triggered under a unique set of circumstances:
> # A message is published by a JMS client with compression *_disabled_* on its {{ActiveMQConnection}}
> # The message is consumed by a JMS client with compression *_enabled_* on its {{ActiveMQConnection}}
> # The JMS consumer makes the received message writable in order to modify and reuse it:
> {code}
> message.setReadOnlyProperties(false);
> message.setReadOnlyBody(false);
> {code}
> # The JMS consumer modifies the message, triggering a call to {{ActiveMQBytesMessage.initializeWriting()}}
> The problem within {{ActiveMQBytesMessage.initializeWriting()}} is that the method determines
whether the message should be compressed _when it is published_ (based on its current connection)
BEFORE it has restored the message's original content.  In the example above, the message's
original {{compressed}} flag is changed from {{false}} to {{true}}, resulting in {{restoreOldContent()}}
trying to decompress message contents which were never compressed.
> {code}
> private void initializeWriting() throws JMSException {
>         checkReadOnlyBody();
>         if (this.dataOut == null) {
>             this.bytesOut = new ByteArrayOutputStream();
>             OutputStream os = bytesOut;
>             this.dataOut = new DataOutputStream(os);
>         }
>         // should compression be used when publishing this message??
>         ActiveMQConnection connection = getConnection();
>         if (connection != null && connection.isUseCompression()) {
>             compressed = true;
>         }
>         // restore the message's old content
>         restoreOldContent();
> }
> {code}
> -A simple solution would be to move the {{restoreOldContent()}} method call before the
{{connection.isUseCompression()}} conditional in {{ActiveMQBytesMessage.initializeWriting()}}.-
> +Had a chance to look into this problem further.  The best fix would be to only set the
'compressed' flag when the message's 'contents' are stored, instead of whenever the message
is initialized for writing.+



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message