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 2009/04/01 20:08:13 UTC

[jira] Updated: (THRIFT-417) BufferedTransport can enter an infinite loop

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

Bryan Duxbury updated THRIFT-417:
---------------------------------

    Attachment: thrift-417.patch

Ok, I think I've resolved the issue, at least partially. It comes down to the fact that the pure-ruby binary protocol was calling "read_all" on its transport, while the thrift_native version was calling "read". I'm still not 100% sure how this lead to an infinite loop, but hey, it was happening and now it's not. 

What I do know is that zero-length strings on the wire would cause BinaryProtocolAccelerated to lock up the process trying to do reads. Switching from read to read_all makes the problem go away. I should also note that FramedTransport isn't affected by this issue, and a bare Socket will throw an exception when you ask to read 0 bytes.

One thing we might want to consider is evaluating the contract of our read methods. Should read(0) be a valid request? If so what should it return? It seems to me in scenarios where you might call read(0), you could just check if it's zero and skip the read. Not sure it'll make it that much cleaner, though.

Anyways, this patch contains the fix to the thrift_native READ macro. It also adds 6 new test cases to the shared binary protocol specs, which required some reorganization in DebugProtoTest.thrift. Finally, there is some minor cleanup in binary_protocol_accelerated.c, removing some commented code and using the native method table for one of the methods that was mistakenly omitted. 

> BufferedTransport can enter an infinite loop
> --------------------------------------------
>
>                 Key: THRIFT-417
>                 URL: https://issues.apache.org/jira/browse/THRIFT-417
>             Project: Thrift
>          Issue Type: Bug
>          Components: Library (Ruby)
>            Reporter: Bryan Duxbury
>            Assignee: Bryan Duxbury
>            Priority: Blocker
>             Fix For: 0.1
>
>         Attachments: thrift-417.patch
>
>
> I'm not 100% sure of the circumstances yet, but it looks like if you ask BufferedTransport to read 0 bytes, you will enter an infinite loop. This may be particularly related to using the BinaryProtocolAccelerated protocol.

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