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

Jens Geyer updated THRIFT-5199:
-------------------------------
    Priority: Critical  (was: Major)

> Infinite loop in PHP TSocket::write when peer closes connection 
> ----------------------------------------------------------------
>
>                 Key: THRIFT-5199
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5199
>             Project: Thrift
>          Issue Type: Bug
>          Components: PHP - Library
>    Affects Versions: 0.13.0
>            Reporter: Tim
>            Priority: Critical
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> PHP returns 0 for fwrite calls when the socket has been reset by peer.
>  
> Currently the write code looks like this:
> {{        
> while (TStringFuncFactory::create()->strlen($buf) > 0) {
>     $writable = @stream_select(
>                 $null,
>                 $write,
>                 $null,
>                 $this->sendTimeoutSec_,
>                 $this->sendTimeoutUsec_
>             );
>     if ($writable > 0) { <--- peer connection closed makes socket writable
>          $written = fwrite($this->handle_, $buf);   <-- this will return 0
>          if ($written === -1 || $written === false) { <--- we skip this 
> because we got 0 not false
>          }
>          $buf = TStringFuncFactory::create()->substr($buf, $written);   <--- 
> buf still same
>     } else { ... } 
> }}
> There needs to be a check for the combination of $written === 0 and 
> feof($this->handle_) to detect connections closed by peer.
> This still isn't perfect in the case where the peer decides to send something 
> back on the socket before closing (the socket wouldn't get marked as feof 
> until something is read as well), but that would be a violation of the thrift 
> protocol as I understand it.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to