summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-07-08 05:45:22 +0000
committerEric Wong <normalperson@yhbt.net>2010-07-08 05:45:22 +0000
commitaad1fdfc17e2fe1a6308690daf74456877796f51 (patch)
tree80b2a73b40e6ecab1b8afd4088c610269e1d9922
parent00e04ecc9fda39fa77e2f7fd11834ea977ba9ee8 (diff)
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)
-rw-r--r--lib/unicorn/tee_input.rb7
1 files 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