From f057a82730d252c509f8c590430dbf4507d17601 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 5 Nov 2011 02:11:03 +0000 Subject: [PATCH] backend: require CRLF on every line we parse Otherwise IO#gets and MogileFS::Socket#timed_gets could return a truncated response before EOF and we would never know the response was truncated. --- lib/mogilefs/backend.rb | 2 +- test/test_backend.rb | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/mogilefs/backend.rb b/lib/mogilefs/backend.rb index 973d82b..db13b45 100644 --- a/lib/mogilefs/backend.rb +++ b/lib/mogilefs/backend.rb @@ -207,7 +207,7 @@ class MogileFS::Backend raise error(@lasterr), @lasterrstr end - return url_decode($1) if line =~ /^OK\s+\d*\s*(\S*)/ + return url_decode($1) if line =~ /^OK\s+\d*\s*(\S*)\r\n\z/ raise MogileFS::InvalidResponseError, "Invalid response from server: #{line.inspect}" diff --git a/test/test_backend.rb b/test/test_backend.rb index 1a723de..6211b34 100644 --- a/test/test_backend.rb +++ b/test/test_backend.rb @@ -77,11 +77,11 @@ class TestBackend < Test::Unit::TestCase def test_parse_response assert_equal({'foo' => 'bar', 'baz' => 'hoge'}, - @backend.parse_response('OK 1 foo=bar&baz=hoge')) + @backend.parse_response("OK 1 foo=bar&baz=hoge\r\n")) err = nil begin - @backend.parse_response('ERR you totally suck') + @backend.parse_response("ERR you totally suck\r\n") rescue MogileFS::Error => err assert_equal 'MogileFS::Backend::YouError', err.class.to_s assert_equal 'totally suck', err.message @@ -94,6 +94,9 @@ class TestBackend < Test::Unit::TestCase assert_raises MogileFS::InvalidResponseError do @backend.parse_response 'garbage' end + assert_raises MogileFS::InvalidResponseError do + @backend.parse_response("OK 1 foo=bar&baz=hoge") + end end def test_parse_response_newline @@ -142,7 +145,7 @@ class TestBackend < Test::Unit::TestCase t1.close thr = Thread.new do client = t2.accept - client.write("OK 1 foo=bar\n") + client.write("OK 1 foo=bar\r\n") client end rv = nil -- 2.11.4.GIT