ruby/perl のsyswrite について話したあとばたんと寝てたら、寝てる間に ruby コミッタと linux kernel コミッタがやってきて write(2) の制約であることが明らかになっていた
@kosaki55tea @frsyuki @nalsh @tagomoris あ、できた。straceの結果、rubyは2GBのwriteをするが、カーネルが拒否ってるな。でrubyのsyswriteの仕様としてwrite(2)の結果がそのままスクリプトに返るのでああなる
2013-03-15 04:12:07@kosaki55tea @nalsh @tagomoris ほんとだ。write(1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 2147483647) = 2147479552 ですね。
2013-03-15 04:13:44@frsyuki @nalsh @tagomoris Linuxの仕様として一回のwriteで書ける最大長が INT_MAX & ~PAGE_SIZE にvfsで制限されてるな。Linusが2010年に変えてる。
2013-03-15 04:20:48@frsyuki @nalsh @tagomoris low level driverにint使ってるアホがいて脆弱性報告がうぜーから、もうintでもオーバーフローしなさそうな数で制限しよーぜとか乱暴なコミットログが。Linusがいれてるということはセキュリティがらみだと思う
2013-03-15 04:21:49@frsyuki @nalsh @tagomoris うそだった。2010年の修正はwritevへの適用であって、writeの制限はもっと前から
2013-03-15 04:25:02@frsyuki @nalsh @tagomoris これだな。http://t.co/irBeok43gh なんと昔はINT_MAX以上だとEINVALを返すというクソ仕様だったようだ
2013-03-15 04:33:56@frsyuki @nalsh @tagomoris TLを汚してしまって申し訳ないです。あとで消しておきます
2013-03-15 04:34:27@kosaki55tea @frsyuki @nalsh おお、寝てる間に調査が。rubyは素通ししてるだけでlinux kernel側の仕様でしたか。じゃあperl syswrite()でも同じ結果になりそうですねー。
2013-03-15 09:30:01ruby/perl のsyswrite について話したあとばたんと寝てたら、寝てる間に ruby コミッタと linux kernel コミッタがやってきて write(2) の制約であることが明らかになっていた。twitterすごい。w
2013-03-15 09:45:37.@kazeburo @hiroyukim Linux に限らず、そして nonblocking かそうでないかに関係なく、wirte(2) が全部書いてくれるとは限りませんよ。https://t.co/ZToN6SI5bX ←これは間違いだと思う。
2013-03-15 11:26:55partial writeを考慮しないコードとかそもそも避けるのがbest practiceだと思ってた / “ruby/perl のsyswrite について話したあとばたんと寝てたら、寝てる間に ruby コミッタと linu…” http://t.co/RQrLISJk0m
2013-03-15 11:55:40結局わたしはツイートを消していいのかいけないのか(困惑) http://t.co/KQHayhrgqM
2013-03-15 13:41:10@kosaki55tea 空気読まずにまとめてしまってすみません。消さずにすむならありがたいのです。 http://t.co/9O9AZ80Yn3
2013-03-15 14:26:20