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

ASF GitHub Bot commented on THRIFT-3224:
----------------------------------------

GitHub user ben-craig opened a pull request:

    https://github.com/apache/thrift/pull/544

    THRIFT-3224 Fix TNamedPipeServer unpredictable behavior on accept

    

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/ben-craig/thrift THRIFT-3224

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/thrift/pull/544.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #544
    
----
commit 1b73af1a4f59e2c85127a70d537712f130329462
Author: Ben Craig <[email protected]>
Date:   2015-07-08T01:54:50Z

    Fixing double pipe close

----


> Fix TNamedPipeServer unpredictable behavior on accept
> -----------------------------------------------------
>
>                 Key: THRIFT-3224
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3224
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9.2
>         Environment: Windows
>            Reporter: Paweł Janicki
>            Assignee: Paweł Janicki
>            Priority: Critical
>              Labels: patch
>         Attachments: 
> 0001-THRIFT-3224.-cpp-Fix-TNamedPipeServer-unpredictable-.patch
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> Application bahavior utilizing TNamedPipeServer is unpredictable due misuse 
> of TAutoHandle.
> Project uses TAutoHandle class, an analogy of std::unique_ptr, for managing 
> WIN32 handles. The dangerous members of this concept are: the direct getter 
> "HANDLE TAutoHandle::h" and release method "void __thiscall 
> TAutoHandle::release()" 
> Below code citation introduces serous bug:
> {code:java}
> {
>     TAutoCrit lock(pipe_protect_);
>     GlobalOutput.printf("Client connected.");
>     shared_ptr<TPipe> client(new TPipe(Pipe_.h));
>     Pipe_.release();
> }
> {code}
> The getter is  used in TNamedPipeServer::acceptImpl() to pass internal  
> handle value to c-tor of TPipe and just after c-tion HANDLE__thiscall 
> TAutoHandle::release() is called to release ownership. That means the TPipe 
> object is expected to take ownership of the resource, but if TPipe c-tor 
> throws the d-tor of TAutoHandle is called releasing the resource and the 
> incomplete TPipe object does the same. Since now it is impossible to ensure 
> that the second free of the handle value was not performed on a resource that 
> was opened in meantime by other thread.
> I propose to solve the issue by ensuring the handle is not owned by two 
> objects at a time.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to