You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Bryan Duxbury (JIRA)" <ji...@apache.org> on 2012/06/28 18:58:44 UTC

[jira] [Commented] (THRIFT-1632) ruby: data corruption in thrift_native implementation of MemoryBufferTransport

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

Bryan Duxbury commented on THRIFT-1632:
---------------------------------------

After staring at this for a bit, I think I've figured out the bug in this function and why your patch solves the issue.

The way that this is supposed to work is that when we've consumed enough of the memory buffer, we reallocate a new one without the used-up space in the front. This is intended to save memory. However, the issue is that when we decide to resize the buffer, we don't reassign the "buf" variable to the new buffer - we've still got a pointer to the old one. But we reset the index pointer as though we have switched, which means that when you start reading again, you'll be getting the wrong data.

Your patch fixes this issue by only doing a garbage resize once after all the reading is done, thus guaranteeing that the buffer pointer and its index remain valid throughout the lifetime of the method. 
                
> ruby: data corruption in thrift_native implementation of MemoryBufferTransport
> ------------------------------------------------------------------------------
>
>                 Key: THRIFT-1632
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1632
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>    Affects Versions: 0.7, 0.8, 0.9
>         Environment: Tested on Linux/Centos 6.0, with thrift_native.so installed
>            Reporter: Nevo Hed
>            Assignee: Nevo Hed
>              Labels: newbie, patch
>         Attachments: patch, test.rb, test.thrift
>
>
> Detected a failure when serializing, then deserializing a specific object
> (I think the object needs to be large enough, AND probably must have non zero data at a specific offset)
> $ /usr/bin/thrift --gen rb test.thrift && ruby test.rb 
> Caught Thrift::ProtocolException exception: Invalid value of field x1!
> Trace:
>   ./gen-rb/test_types.rb:34:in `validate'
>   test.rb:15:in `read'
>   test.rb:15

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira