jruby/jruby — pull request #1338 by DavidEGrayson (2013-12-15 01:10:59+00:00)
Title: UnmarshalStream: Fixed two off-by-one errors in unmarshalInt; it is now ...

While working on fixing issue #1329, I discovered something tangentially related that I think is a tiny bug and can be easily fixed. MRI's `Marshal.load` recognizes three different ways of encoding the integer 0 in a single byte, but JRuby 1.7.9 only handles one and raises the "marshal data too short" exception for the other two. This is because there are two off-by-one errors in JRuby's `unmarshalInt` method.

I think that `unmarshalInt` is supposed to be a clone of MRI's `r_long` function, so here is the source code of `r_long`:
https://github.com/ruby/ruby/blob/v2_0_0_352/marshal.c#L1114-1145

Here is the code I used to demonstrate the difference between MRI 2.0.0p0 and JRuby:

```ruby
# MRI returns 0 for each, JRuby says marshal data is too short
puts Marshal.load("\x04\x08i\x05")
puts Marshal.load("\x04\x08i\xFB")
```

I suppose this isn't too important, because the number 0 will probably be marshaled as the 0x00 byte instead of 0xFB or 0x05, but if MRI treats those bytes as representing 0 then I don't think it is helpful for JRuby to raise an exception.

I am happy to do any more investigating or documentation that is needed. Should I write a test for this? If so, where should I put it?