[
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)