Skip to content

Instantly share code, notes, and snippets.

@lucaspiller
Created February 12, 2014 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucaspiller/8952830 to your computer and use it in GitHub Desktop.
Save lucaspiller/8952830 to your computer and use it in GitHub Desktop.
Ruby 1.8.6 crashes parsing YAML
$ ruby -v 1 ↵
ruby 1.8.6 (2009-08-04 patchlevel 383) [i686-darwin13.0.0]
$ irb -v
irb 0.9.5(05/04/13)
$ irb 134 ↵
irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> YAML::load("--- !ruby/object:Gem::Specification\nname: multi_xml\nversion: !ruby/object:Gem::Version\n version: 0.5.1\n prerelease: \nplatform: ruby\nauthors:\n- Erik Michaels-Ober\nautorequire: \nbindir: bin\ncert_chain: []\ndate: 2012-05-10 00:00:00.000000000 Z\ndependencies:\n- !ruby/object:Gem::Dependency\n name: maruku\n requirement: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n type: :development\n prerelease: false\n version_requirements: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n- !ruby/object:Gem::Dependency\n name: rake\n requirement: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n type: :development\n prerelease: false\n version_requirements: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n- !ruby/object:Gem::Dependency\n name: rspec\n requirement: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n type: :development\n prerelease: false\n version_requirements: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n- !ruby/object:Gem::Dependency\n name: simplecov\n requirement: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n type: :development\n prerelease: false\n version_requirements: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n- !ruby/object:Gem::Dependency\n name: yard\n requirement: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\n type: :development\n prerelease: false\n version_requirements: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\ndescription: A gem to provide swappable XML backends utilizing LibXML, Nokogiri, Ox,\n or REXML.\nemail: sferik@gmail.com\nexecutables: []\nextensions: []\nextra_rdoc_files: []\nfiles:\n- .gemtest\n- .gitignore\n- .rspec\n- .travis.yml\n- .yardopts\n- Gemfile\n- LICENSE.md\n- README.md\n- Rakefile\n- lib/multi_xml.rb\n- lib/multi_xml/parsers/libxml.rb\n- lib/multi_xml/parsers/libxml2_parser.rb\n- lib/multi_xml/parsers/nokogiri.rb\n- lib/multi_xml/parsers/ox.rb\n- lib/multi_xml/parsers/rexml.rb\n- lib/multi_xml/version.rb\n- multi_xml.gemspec\n- spec/helper.rb\n- spec/multi_xml_spec.rb\n- spec/parser_shared_example.rb\n- spec/speed.rb\nhomepage: https://github.com/sferik/multi_xml\nlicenses: []\npost_install_message: \nrdoc_options: []\nrequire_paths:\n- lib\nrequired_ruby_version: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\nrequired_rubygems_version: !ruby/object:Gem::Requirement\n none: false\n requirements:\n - - ! '>='\n - !ruby/object:Gem::Version\n version: '0'\nrequirements: []\nrubyforge_project: \nrubygems_version: 1.8.24\nsigning_key: \nspecification_version: 3\nsummary: A generic swappable back-end for XML parsing\ntest_files:\n- spec/helper.rb\n- spec/multi_xml_spec.rb\n- spec/parser_shared_example.rb\n- spec/speed.rb\nhas_rdoc: \n")
[1] 87498 abort irb
@lucaspiller
Copy link
Author

@lucaspiller
Copy link
Author

Patch file:

diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment