Issue #13616 has been updated by nagachika (Tomoyuki Chikanaga).

Backport changed from 2.2: REQUIRED, 2.3: DONE, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE

ruby_2_4 r59807 merged revision(s) 58524,58525,58526,59333,59337.

----------------------------------------
Bug #13616: Zlib::GzipReader#pos underflows after calling #ungetbyte or #ungetc at start of file
https://bugs.ruby-lang.org/issues/13616#change-66569

* Author: haines (Andrew Haines)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
* Backport: 2.2: REQUIRED, 2.3: DONE, 2.4: DONE
----------------------------------------
After calling `#ungetbyte` or `#ungetc` at the start of file, `Zlib::GzipReader#pos` should be negative. However, the calculation uses unsigned integers, and underflow occurs.

Instead of the expected -1, the below outputs 18446744073709551615 on my machine:

~~~ ruby
require 'zlib'

gz = Zlib::GzipReader.new(StringIO.new([
  31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77,
  76, 74, 78, 73, 5, 0, 157, 5, 0, 36, 10, 0, 0, 0
].pack("C*")))

gz.ungetbyte 0x21

p gz.pos
~~~

`#read` still returns the correct string (`"!12345abcde"` in this case).


---Files--------------------------------
0001-Fix-underflow-of-Zlib-GzipReader-pos.patch (1.73 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>