ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

Ruby2.7.0からTimeオブジェクトをMarshalizeしたときの挙動が変わっていた

TL;DR

TimeオブジェクトがMarshalizeできない時があるのはバグだったらしい。 こちらのPRで解消されていたので、挙動が変わった。 https://github.com/ruby/ruby/commit/e690df1f1ef4f791295448f9192d6e027400ee72

はじめに

Ruby2.7.0に変えたらMarshalize周りのテストケースが落ちるようになっていたので、詳細を調べました。

version

ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]からruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-musl]にアップデートした際に判明。

当該コード

require 'time'
Marshal.dump(Time.parse('1890/11/11'))
Marshal.dump(Time.parse('70000/11/11'))

これらのパターンはArgumentErrorが出るものとして例外処理をしていたが、Ruby2.7.0からは普通に動くようになっていた。