ただのにっき
2015-01-22(木) [長年日記]
■ また $SAFE がらみのトラブルを直した
この日記をHerokuで動かすにあたっていろいろ手を入れているので、関連パッケージも最新版を使わざるをえなくなっている。
そこでGemfileのオプションでGitHubの最新ソースを使うように指定したら、動かないプラグインが出てきた。GitHub上のissueで何人かで相談してたら「gemをrubygems.org以外から持ってくると$LOAD_PATHにtaintなパスが混じる」ということがわかり(tDiaryのプラグインは$SAFE = 1で動いているのでこの状況でrequireすると死ぬ)、とりあえずは$LOAD_PATHの中身を全部untaintするという雑な対応をしたのだった。
とはいえこれはいささかセキュアでないので大元で直そうと思い、bundlerのコードを追いかけてはみたものの複雑でよくわからず、binding.pryを埋め込んでデバッグしたらその先でrubygemsに迷い込む。rubygems、ruby本体にバンドルされてるのにコードに「TODO」があふれててちょっと怖い(笑)。というか「ここか!?」と思ったメソッドに「TODO: this logic seems terribly broken」と書いてあって白目。
もっともその部分は実際には通ってなくて、bundlerが同名のメソッドを上書きしていたんだけど。ムキーッ(←自分でもモンキーパッチを当てるくせに人がやると腹を立てるタイプ)。
というわけで、あやうくrubygemsに手を入れるはめになるところ、bundlerに閉じたパッチを作れたのでプルリクした。ふー、やれやれ。でもまぁ、tDiary以外にこのバグで困る人はまずいないだろうな……。