Project

General

Profile

Bug #19753

Updated by noteflakes (Sharon Rosner) 11 months ago

```ruby 
 irb(main):001:0> b = IO::Buffer.for('abc') 
 =>  
 #<IO::Buffer 0x00007f858f5450c0+3 EXTERNAL READONLY SLICE> 
 ... 
 irb(main):002:0> b.get_string(-1) 
 => "\x00abc" 
 irb(main):003:0> b.get_string(-1000, 3) 
 (irb):3:in `get_string': Specified offset+length exceeds data size! (ArgumentError) 
	 from (irb):3:in `<main>' 
	 from /home/sharon/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/irb-1.7.1/exe/irb:9:in `<top (required)>' 
	 from /home/sharon/.rbenv/versions/3.2.0/bin/irb:25:in `load' 
	 from /home/sharon/.rbenv/versions/3.2.0/bin/irb:25:in `<main>' 
 ``` 

 Using a negative offset returns garbage in the string but it also might segfault: 

 ```ruby 
 irb(main):003:0> b = IO::Buffer.map(File.open('sgt-nodes.sql', 'r+')) 
 => #<IO::Buffer 0x00007f189de14000+2008858 EXTERNAL MAPPED SHARED> 
 irb(main):004:0> b.get_string(-1000) 
 (irb):4: [BUG] Segmentation fault at 0x00007f189de13c18 
 ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux] 

 -- Control frame information ----------------------------------------------- 
 c:0021 p:---- s:0109 e:000108 CFUNC    :get_string 
 ... 
 ``` 

 ## Expected behaviour 

 I think it might be nice to have `#get_string` behave like other methods taking an offset, like `String#[]`, so a negative offset means counting backwards from the end of the buffer. `String#[]`. For example: 

 ```ruby 
 irb(main):001:0> b = IO::Buffer.for('abc') 
 =>  
 #<IO::Buffer 0x00007f858f5450c0+3 EXTERNAL READONLY SLICE> 
 ... 
 irb(main):002:0> b.get_string(-1) 
 => "c" 
 irb(main):003:0> b.get_string(-2) 
 => "bc" 
 irb(main):003:0> b.get_string(-1000) 
 => "abc" 
 irb(main):003:0> b.get_string(-1000, 2) 
 => "ab" 
 ``` 

Back