Просмотр исходного кода

Fix bug reading zero-length values from a bulk response.

Daniele Alessandri 14 лет назад
Родитель
Сommit
c41bb2c314
4 измененных файлов с 16 добавлено и 2 удалено
  1. 5 0
      CHANGELOG
  2. 1 1
      lib/Predis.php
  3. 6 0
      test/PredisClientFeatures.php
  4. 4 1
      test/RedisCommandsTest.php

+ 5 - 0
CHANGELOG

@@ -1,3 +1,8 @@
+v0.6.5 (2011-02-12)
+  * FIX: due to an untested internal change introduced in v0.6.4, a wrong 
+    handling of bulk reads of zero-length values was producing protocol 
+    desynchronization errors (ISSUE #20).
+
 v0.6.4 (2011-02-12)
   * Various performance improvements (15% ~ 25%) especially when dealing with 
     long multibulk replies or when using clustered connections.

+ 1 - 1
lib/Predis.php

@@ -578,7 +578,7 @@ class ResponseBulkHandler implements IResponseHandler {
             ));
         }
         if ($length >= 0) {
-            return $length > 0 ? substr($connection->readBytes($length + 2), 0, -2) : '';
+            return substr($connection->readBytes($length + 2), 0, -2);
         }
         if ($length == -1) {
             return null;

+ 6 - 0
test/PredisClientFeatures.php

@@ -381,6 +381,12 @@ class PredisClientFeaturesTestSuite extends PHPUnit_Framework_TestCase {
         });
     }
 
+    function testResponseReader_EmptyBulkResponse() {
+        $this->assertTrue($this->redis->set('foo', ''));
+        $this->assertEquals('', $this->redis->get('foo'));
+        $this->assertEquals('', $this->redis->get('foo'));
+    }
+
 
     /* Client + CommandPipeline */
 

+ 4 - 1
test/RedisCommandsTest.php

@@ -89,8 +89,11 @@ class RedisCommandTestSuite extends PHPUnit_Framework_TestCase {
 
     function testGet() {
         $this->redis->set('foo', 'bar');
-
         $this->assertEquals('bar', $this->redis->get('foo'));
+
+        $this->assertTrue($this->redis->set('foo', ''));
+        $this->assertEquals('', $this->redis->get('foo'));
+
         $this->assertNull($this->redis->get('fooDoesNotExist'));
 
         // should throw an exception when trying to do a GET on non-string types