Project

General

Profile

Bug #18898

Updated by javanthropus (Jeremy Bopp) almost 2 years ago

Save the following to a file and run it: 
 ```ruby ```yaml 
 #!/usr/bin/env ruby 

 Encoding.default_external = 'utf-8' 
 File.open(__FILE__) do |f| 
   f.set_encoding('utf-8', 'invalid') 

   printf( 
     "default external: %p\ndefault internal: %p\nexternal:           %p\ninternal:           %p\n\n", 
     Encoding.default_external, 
     Encoding.default_internal, 
     f.external_encoding, 
     f.internal_encoding 
   ) 

   f.read 
 end 
 ``` 

 The above script will result in a segfault at `f.read`.    This seems to happen because the call to `#set_encoding` results in the internal encoding of the IO object being set to follow `Encoding.default_external` while also setting the external encoding of the IO object to match.    Ovbiously, there shouldn't be a segfault, but I actually expected the IO object's internal encoding to be set to nil due to the invalid encoding being specified for it. 

 I was able to reproduce this on all versions of Ruby from 2.7.0 to 3.0.2.

Back