From c018f30d0c39c5012725686a7259c85a1864b57b Mon Sep 17 00:00:00 2001 From: DomoChip Date: Thu, 16 Dec 2021 12:40:47 +0100 Subject: [PATCH 1/3] Handle 2GB payload on PHP32bits --- src/Messaging/MessageBuffer.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index e5d197b..bbc1061 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -158,9 +158,17 @@ public function onData($data) { $payloadLenBytes = $payload_length === 126 ? 2 : 8; $headerSize += $payloadLenBytes; $bytesToUpack = substr($data, $frameStart + 2, $payloadLenBytes); - $payload_length = $payload_length === 126 - ? unpack('n', $bytesToUpack)[1] - : unpack('J', $bytesToUpack)[1]; + + if ($payload_length === 126){ + $payload_length = unpack('n', $bytesToUpack)[1]; + } else { + if (PHP_INT_SIZE == 4) { // if 32bits PHP + $bytesToUpack = substr($bytesToUpack, 4); //Keep only 4 last bytes + $payload_length = unpack('N', $bytesToUpack)[1]; + } else { + $payload_length = unpack('J', $bytesToUpack)[1]; + } + } } $closeFrame = null; From 0050245eb4484351643031d6bc92ee0b607a9541 Mon Sep 17 00:00:00 2001 From: DomoChip Date: Thu, 30 Jun 2022 17:23:29 +0200 Subject: [PATCH 2/3] Raise error if frame is over 2GB on 32bits PHP --- src/Messaging/MessageBuffer.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index bbc1061..a751508 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -158,10 +158,12 @@ public function onData($data) { $payloadLenBytes = $payload_length === 126 ? 2 : 8; $headerSize += $payloadLenBytes; $bytesToUpack = substr($data, $frameStart + 2, $payloadLenBytes); + $payloadLenOver2GB = false if ($payload_length === 126){ $payload_length = unpack('n', $bytesToUpack)[1]; } else { + $payloadLenOver2GB = unpack('N', $bytesToUpack)[1] > 0; //Decode only the 4 first bytes if (PHP_INT_SIZE == 4) { // if 32bits PHP $bytesToUpack = substr($bytesToUpack, 4); //Keep only 4 last bytes $payload_length = unpack('N', $bytesToUpack)[1]; @@ -178,6 +180,10 @@ public function onData($data) { $closeFrame = $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Invalid frame length'); } + if (!$closeFrame && PHP_INT_SIZE == 4 && $payloadLenOver2GB) { + $closeFrame = $this->newCloseFrame(Frame::CLOSE_TOO_BIG, 'Frame over 2GB can\'t be handled on 32bits PHP'); + } + if (!$closeFrame && $this->maxFramePayloadSize > 1 && $payload_length > $this->maxFramePayloadSize) { $closeFrame = $this->newCloseFrame(Frame::CLOSE_TOO_BIG, 'Maximum frame size exceeded'); } From 93050e65a06a3a640d1e3e96b1d7b6f1e2b7b721 Mon Sep 17 00:00:00 2001 From: DomoChip Date: Thu, 30 Jun 2022 17:38:45 +0200 Subject: [PATCH 3/3] typo --- src/Messaging/MessageBuffer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index a751508..5d6f82b 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -158,7 +158,7 @@ public function onData($data) { $payloadLenBytes = $payload_length === 126 ? 2 : 8; $headerSize += $payloadLenBytes; $bytesToUpack = substr($data, $frameStart + 2, $payloadLenBytes); - $payloadLenOver2GB = false + $payloadLenOver2GB = false; if ($payload_length === 126){ $payload_length = unpack('n', $bytesToUpack)[1];