From aad1fdfc17e2fe1a6308690daf74456877796f51 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 8 Jul 2010 05:45:22 +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). (cherry picked from commit 1cd698f8c7938b1f19e9ba091708cb4515187939) --- lib/unicorn/tee_input.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/unicorn/tee_input.rb b/lib/unicorn/tee_input.rb index 8ff7258..563747c 100644 --- a/lib/unicorn/tee_input.rb +++ b/lib/unicorn/tee_input.rb @@ -109,7 +109,7 @@ module Unicorn # 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 @@ -117,8 +117,9 @@ module Unicorn 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 @@ -126,7 +127,7 @@ module Unicorn tee(Const::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