From 1cd698f8c7938b1f19e9ba091708cb4515187939 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 8 Jul 2010 05:14:55 +0000 Subject: tee_input: safer record separator ($/) handling Different threads may change $/ during execution, so cache it at function entry to a local variable for safety. $/ may also be of a non-binary encoding, so rely on Rack::Utils.bytesize to portably capture the correct size. Our string slicing is always safe from 1.9 encoding: both our socket and backing temporary file are opened in binary mode, so we'll always be dealing with binary strings in this class (in accordance to the Rack spec). --- lib/unicorn/tee_input.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib/unicorn') diff --git a/lib/unicorn/tee_input.rb b/lib/unicorn/tee_input.rb index d1d273d..c0f916e 100644 --- a/lib/unicorn/tee_input.rb +++ b/lib/unicorn/tee_input.rb @@ -119,7 +119,7 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, # unlike IO#gets. def gets socket or return tmp.gets - nil == $/ and return read + sep = $/ or return read orig_size = tmp.size if tmp.pos == orig_size @@ -127,8 +127,9 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, tmp.seek(orig_size) end + sep_size = Rack::Utils.bytesize(sep) line = tmp.gets # cannot be nil here since size > pos - $/ == line[-$/.size, $/.size] and return line + sep == line[-sep_size, sep_size] and return line # unlikely, if we got here, then tmp is at EOF begin @@ -136,7 +137,7 @@ class Unicorn::TeeInput < Struct.new(:socket, :req, :parser, tee(@@io_chunk_size, buf2) or break tmp.seek(orig_size) line << tmp.gets - $/ == line[-$/.size, $/.size] and return line + sep == line[-sep_size, sep_size] and return line # tmp is at EOF again here, retry the loop end while true -- cgit v1.2.3-24-ge0c7