Project

General

Profile

Bug #16186

Updated by byteit101 (Patrick Plenefisch) about 5 years ago

Using this script: 
 ``` ruby 
 require 'net/http' 
 class Victim 
	 def inspect 
		 puts "before" 
		 Net::HTTP.get('example.com', '/index.html') # this hangs. I haven't tried other network libraries 
		 puts "After" 
		 return "success" 
	 end 
 end 
 puts Victim.new.inspect # for some reason this doesn't hang 
 puts "now we hang" 
 p Victim.new    # but this implicit invocation of inspect does hang. Independent of ordering, and works on JRuby 
 puts "It worked!" 
 ``` 

 Expected: 
 ``` 
 $ rvm use jruby 
 $ ruby bug.rb 
 before 
 After 
 success 
 now we hang 
 before 
 After 
 success 
 It worked! 
 $ 
 ``` 

 Actual: 
 ``` 
 $ rvm use ruby-head  
 $ ruby bug.rb 
 before 
 After 
 success 
 now we hang 
 before 
 ^C^C^Z 
 [1]    + 13423 suspended    ruby bug.rb 
 $ kill %1 
 $ (time passes) 
 Traceback (most recent call last): 
	 11: from bug.rb:12:in `<main>' 
	 10: from bug.rb:12:in `p' 
	  9: from bug.rb:5:in `inspect' 
	  8: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/net/http.rb:458:in `get' 
	  7: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/net/http.rb:476:in `get_response' 
	  6: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/net/http.rb:919:in `start' 
	  5: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/net/http.rb:930:in `do_start' 
	  4: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/net/http.rb:945:in `connect' 
	  3: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/timeout.rb:105:in `timeout' 
	  2: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/timeout.rb:99:in `block in timeout' 
	  1: from /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/timeout.rb:99:in `ensure in block in timeout' 
 /home/byteit101/.rvm/rubies/ruby-head/lib/ruby/2.7.0/timeout.rb:99:in `join': Interrupt 

 [1]    + 13423 interrupt    ruby bug.rb /tmp/rng/koan.rb 
 $ 
 ``` 
 The thing that is surprising to me is the explicit `print` + `inspect` works, whereas a straight `p` hangs. 

Back