Jens Geyer created THRIFT-6261:
----------------------------------

             Summary: PHP: TCompactProtocol accepts a negative container size 
where TBinaryProtocol rejects it
                 Key: THRIFT-6261
                 URL: https://issues.apache.org/jira/browse/THRIFT-6261
             Project: Thrift
          Issue Type: Bug
          Components: PHP - Library
            Reporter: Jens Geyer


{{lib/php/lib/Protocol/TBinaryProtocol.php}} rejects a container size below 
zero in {{readMapBegin()}}, {{readListBegin()}} and {{readSetBegin()}}:

{code:php}
if ($size < 0) {
    throw new TProtocolException('Negative size', 
TProtocolException::NEGATIVE_SIZE);
}
{code}

{{lib/php/lib/Protocol/TCompactProtocol.php}} has no such check. 
{{readMapBegin()}} ({{:519}}) takes its size straight from {{readVarint()}}, 
and {{readCollectionBegin()}} ({{:504}}), which serves both {{readListBegin()}} 
and {{readSetBegin()}}, does the same for the long form:

{code:php}
$size = $sizeType >> 4;
$type = $this->getTType($sizeType);
if ($size == 15) {
    $result += $this->readVarint($size);
}
{code}

The size then reaches the generated {{read()}} loops, which run {{for ($i = 0; 
$i < $size; ...)}} -- so a negative value silently yields an empty container 
instead of the protocol error the binary protocol raises for the same input. 
The two protocols should answer the same input the same way.

h2. Suggested fix

Add the {{NEGATIVE_SIZE}} check to {{readMapBegin()}} and 
{{readCollectionBegin()}}, worded as in {{TBinaryProtocol}}.

_Drafted with AI assistance (Claude Opus 5); reviewed and filed by Jens Geyer._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to