[
https://issues.apache.org/activemq/browse/AMQ-718?page=comments#action_36201 ]
Andrew Lusk commented on AMQ-718:
---------------------------------
FWIW, my understanding is that size-of-payload includes the type byte, but not
the size bytes. Correct? (see int size=1 on OpenWireFormat.java:223).
I think it may be right in one instance and wrong in another.
Using this code as an example, from OpenWireFormat.java:242:
DataOutputStream looseOut = dataOut;
ByteArrayOutputStream baos=null;
if( !sizePrefixDisabled ) {
baos = new ByteArrayOutputStream();
looseOut = new DataOutputStream(baos);
}
looseOut.writeByte(type);
dsm.looseMarshal(this, c, looseOut);
if( !sizePrefixDisabled ) {
looseOut.close();
ByteSequence sequence = baos.toByteSequence();
dataOut.writeInt(sequence.getLength()-4);
dataOut.write(sequence.getData(), sequence.getOffset(),
sequence.getLength());
}
Nowhere was the size written into "baos" yet 4 is being subtracted from its
size to put the size on the wire. In another location in the file (the other
overload of marshal() :
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream ds = new DataOutputStream(baos);
if( !sizePrefixDisabled ) {
ds.writeInt(0); // we don't know the final size yet but
write this here for now.
}
ds.writeByte(type);
dsm.looseMarshal(this, c, ds);
ds.close();
sequence = baos.toByteSequence();
if( !sizePrefixDisabled ) {
size = sequence.getLength()-4;
ByteArrayPacket packet = new ByteArrayPacket(sequence);
PacketData.writeIntBig(packet, size);
}
}
In this case I think this code is right, since the size has been written in to
that sequence.
I'll revert the second case I mentioned and run my tests again.
> Incorrect length specification in loose encoding?
> -------------------------------------------------
>
> Key: AMQ-718
> URL: https://issues.apache.org/activemq/browse/AMQ-718
> Project: ActiveMQ
> Type: Bug
> Components: Transport
> Versions: 4.0, 4.0 RC2, 4.0 RC3
> Reporter: Andrew Lusk
> Assignee: Hiram Chirino
> Fix For: 4.1
>
>
> Unless loose-encoded length is mean to mean something different from
> tight-encoded length, I believe that the length written to the wire for
> loosely-encoded OpenWire messages is off by 4. I imagine this hasn't been
> caught before because most clients synchronously read packets off the wire
> and so can ignore the length specification.
> ---
> activemq-core/src/main/java/org/apache/activemq/openwire/OpenWireFormat.java
> (revision 399408)
> +++
> activemq-core/src/main/java/org/apache/activemq/openwire/OpenWireFormat.java
> (working copy)
> @@ -172,7 +172,7 @@
> sequence = baos.toByteSequence();
>
> if( !sizePrefixDisabled ) {
> - size = sequence.getLength()-4;
> + size = sequence.getLength();
> ByteArrayPacket packet = new
> ByteArrayPacket(sequence);
> PacketData.writeIntBig(packet, size);
> }
> @@ -253,7 +253,7 @@
> if( !sizePrefixDisabled ) {
> looseOut.close();
> ByteSequence sequence = baos.toByteSequence();
> - dataOut.writeInt(sequence.getLength()-4);
> + dataOut.writeInt(sequence.getLength());
> dataOut.write(sequence.getData(), sequence.getOffset(),
> sequence.getLength());
> }
>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://issues.apache.org/activemq/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira