activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Lusk (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AMQ-718) Incorrect length specification in loose encoding?
Date Mon, 22 May 2006 17:32:51 GMT
    [ 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


Mime
View raw message