Page MenuHomePhabricator

D7798.diff
No OneTemporary

D7798.diff

Index: src/applications/diffusion/protocol/DiffusionSubversionWireProtocol.php
===================================================================
--- src/applications/diffusion/protocol/DiffusionSubversionWireProtocol.php
+++ src/applications/diffusion/protocol/DiffusionSubversionWireProtocol.php
@@ -75,6 +75,10 @@
}
} else if ($this->state == 'bytes') {
$new_data = substr($this->buffer, 0, $this->expectBytes);
+ if (!strlen($new_data)) {
+ // No more bytes available yet, wait for more data.
+ break;
+ }
$this->buffer = substr($this->buffer, strlen($new_data));
$this->expectBytes -= strlen($new_data);
Index: src/applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php
===================================================================
--- src/applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php
+++ src/applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php
@@ -61,6 +61,31 @@
));
}
+ public function testSubversionWireProtocolPartialFrame() {
+ $proto = new DiffusionSubversionWireProtocol();
+
+ // This is primarily a test that we don't hang when we write() a frame
+ // which straddles a string boundary.
+ $msg1 = $proto->writeData('( duck 5:qu');
+ $msg2 = $proto->writeData('ack ) ');
+
+ $this->assertEqual(array(), ipull($msg1, 'structure'));
+ $this->assertEqual(
+ array(
+ array(
+ array(
+ 'type' => 'word',
+ 'value' => 'duck',
+ ),
+ array(
+ 'type'=> 'string',
+ 'value' => 'quack',
+ ),
+ ),
+ ),
+ ipull($msg2, 'structure'));
+ }
+
private function assertSameSubversionMessages($string, array $structs) {
$proto = new DiffusionSubversionWireProtocol();

File Metadata

Mime Type
text/plain
Expires
Thu, Jun 20, 10:21 AM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6277977
Default Alt Text
D7798.diff (1 KB)

Event Timeline