[ 
https://issues.apache.org/jira/browse/THRIFT-882?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12904944#action_12904944
 ] 

Mathias Herberts commented on THRIFT-882:
-----------------------------------------

The handling of non array backed buffers will change any existing mark:


      orig.mark();
      orig.get(copy.array());
      orig.reset();

It can be avoided by doing

  // Save current position
  int pos = orig.position();

  int mark = -1;

  // Save current mark if set
  try {
    orig.reset();
    mark = orig.position();
    orig.position(pos);
  } catch (InvalidMarkException ime) {
  }

  orig.mark();
  orig.get(copy.array());

  // Get rid of mark and reset position to 0.
  orig.rewind();

  // Reset mark to its original value if it was set
  if (-1 != mark) {
    orig.position(mark);
    orig.mark();
  }

  // Reset position to its original value.
  orig.position(pos);


> deep copy of binary fields does not copy ByteBuffer characteristics 
> (arrayOffset, position)
> -------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-882
>                 URL: https://issues.apache.org/jira/browse/THRIFT-882
>             Project: Thrift
>          Issue Type: Bug
>          Components: Java - Compiler
>    Affects Versions: 0.4
>            Reporter: Mathias Herberts
>            Assignee: Bryan Duxbury
>             Fix For: 0.5
>
>         Attachments: thrift-882.patch
>
>
> Generated objects have a constructor which does a deep copy of an existing 
> instance.
> For binary fields, the deep copy is done like that:
> {code}
>     if (other.isSetBinary_field()) {
>       this.binary_field = ByteBuffer.wrap(new byte[other.binary_field.limit() 
> - other.binary_field.arrayOffset()]);
>       System.arraycopy(other.binary_field.array(), 
> other.binary_field.arrayOffset(), binary_field.array(), 0, 
> other.binary_field.limit() - other.binary_field.arrayOffset());
>     }
> {code}
> This copies the backing array of the ByteBuffer but does not set the position 
> correctly.
> In various protocol implementations, ByteBuffer instances are serialized by 
> considering data between position and limit, this means that an object 
> created from another object might lead to different serialized data (and thus 
> a different deserialized value) in case a ByteBuffer has a non default 
> position (which can happen since ByteBuffers can be set).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to