Skip to content

UnmarshalStream: Fixed two off-by-one errors in unmarshalInt#1338

Merged
enebo merged 1 commit intojruby:jruby-1_7from
DavidEGrayson:jruby_pull_request_1
Dec 15, 2013
Merged

UnmarshalStream: Fixed two off-by-one errors in unmarshalInt#1338
enebo merged 1 commit intojruby:jruby-1_7from
DavidEGrayson:jruby_pull_request_1

Conversation

@DavidEGrayson
Copy link
Contributor

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:

# 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 (or to try to construct an integer by reading 5 bytes from the stream).

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?

…ow consistent with r_long in marshal.c of MRI. This also means there are three different ways to marshal the number 0.
@DavidEGrayson
Copy link
Contributor Author

The Travis CI build seems to have failed because it had trouble connecting to rubyforge.org port 443 and I don't think my change would have caused that.

enebo added a commit that referenced this pull request Dec 15, 2013
UnmarshalStream: Fixed two off-by-one errors in unmarshalInt
@enebo enebo merged commit cd01094 into jruby:jruby-1_7 Dec 15, 2013
@DavidEGrayson DavidEGrayson deleted the jruby_pull_request_1 branch January 19, 2014 18:58
@enebo enebo modified the milestones: JRuby 1.7.10, JRuby 1.7.11 Feb 24, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants