3/31 (土) 荒川を北上して、吉見の桜をみて、熊谷で折り返して 132 km
暖かくなり調子もでてきて 久々にしっかり走った. 夕方の凶悪な向かい風がなければ、あと +15km 追加で走りたかった
続きを読む3/31 (土) 荒川を北上して、吉見の桜をみて、熊谷で折り返して 132 km
暖かくなり調子もでてきて 久々にしっかり走った. 夕方の凶悪な向かい風がなければ、あと +15km 追加で走りたかった
続きを読むシンプルそうな問題でありながら、実は手強いネタで、 背後にいろんな理由が工夫やあるのだな〜と非常におもしろかったです.
この手の調査では strace を取ってシステムコールを追いかけたくなる。find(1) が呼び出す getdents(2) がどんな風に動作するのか、あるいは mv、つまり、rename(2) と併用したケースなど 調べようとすらしたことなかったなと思い実験をした
getdents(2) で 1ディレクトリエントリずつ読み出して rename(2) していくと、ファイルシステムによってどんな違いがでるか?
先のブログで書かれていた find(1) + mv(1) あるいは readdir(3), fts_read(3) ではなく、システムコールを直接呼び出して実験する.
This is not a bug; the POSIX specification explicitly allows this behavior. If a filename is renamed during a readdir() session of a directory, it is undefined where that neither, either, or both of the new and old filenames will be returned.
readdir() nonatomicity (Theodore Ts'o)
同ブログで引用されていた ML を読むと、readdir(3) している最中に rename(2) した場合は POSIX 仕様でも未定義らしい. getdents(2) でも同様と考えてよいだろう
XFS と Btrfs が面白いことになります
続きを読んでね
続きを読むaws-sdk-ruby の Aws::S3::Object#presigned_url
を呼び出す際に :get
+ :reponse_expires
を指定すると、署名付きURLを生成せずに NotImplementedError を raise してしまうのに遭遇した
#!/usr/bin/env ruby require 'aws-sdk-s3' s3 = Aws::S3::Resource.new( access_key_id: '***', secret_access_key: '***', ) obj = s3.bucket('examplebucket').object('test.txt') puts obj.presigned_url(:get, response_expires: Time.now)
このコードを実行すると NotImplementedError を raise する。
レポートを出す前に、SDK の使い方を間違ってるという悲しい凡ミスではないことを確かめないといけない
ソースとドキュメントをきっちり調べた結果、 正式にサポートされているはずのパラメータだと確信を得て、issue でバグレポートを出した。
返信がついて「使い方は間違ってないね」とのことで、 Bug として ACK された
問題となる例外をあげているコードは以下のようなコードだ
def build_part(shape_ref, param_value) case shape_ref.shape # 👈 # supported scalar types when StringShape, BooleanShape, FloatShape, IntegerShape, StringShape param_name = shape_ref.location_name "#{param_name}=#{escape(param_value.to_s)}" when MapShape if StringShape === shape_ref.shape.value.shape query_map_of_string(param_value) elsif ListShape === shape_ref.shape.value.shape query_map_of_string_list(param_value) else msg = "only map of string and string list supported" raise NotImplementedError, msg end when ListShape if StringShape === shape_ref.shape.member.shape list_of_strings(shape_ref.location_name, param_value) else msg = "Only list of strings supported, got " msg << shape_ref.shape.member.shape.class.name raise NotImplementedError, msg end else raise NotImplementedError # 🔥 end end`
再現コードを実行すると、👈 で指す値が TimestampShape となるが、 case 〜 when
で TimestampShape を扱わないので、🔥 で例外となる
テストすれば気がつきそうだが、: reponse_expires
を指定した場合のテストケースが無いので、ただ単に実装漏れなんじゃないか? という
ClamAV - clamd の OnAccessExtraScanning
を使う際にメモリリークする不具合を見つけたのでバグレポートをだした
https://bugzilla.clamav.net/show_bug.cgi?id=12048
当初は 🔑 付きの issue として閲覧が制限されていたが、 担当者によって public な issue に変えられた。脆弱性としては扱われなかったようだ。
よって、本エントリで公言しても問題なかろうと判断している。
環境や再現手順の詳細はリンク先を参照して欲しい。 このエントリではサマリを書いておこう
clamd で OnAccessExtraScanning yes
にすると OnAccessIncludePath
のディレクトリ以下をオンアクセススキャンの対象とすることができ。 OnAccessIncludePath
のディレクトリ配下に新たなファイルやサブディレクトリを作る/移動/ リネームすると、 clamd が変更を検知してくれてスキャンしてくれるのだ
pthread_create(3)
して別スレッドに処理を委譲する設計としているpthread_attr_setdetachstate(..., PTHREAD_CREATE_JOINABLE)
を指定してスレッドを作るpthread_join(3)
しないため pthread_create 内部で割り当てたメモリリージョンがリークするpthread_join(3)
しない設計のままメモリリークを解決するなら PTHREAD_CREATE_DETACHED
を指定すべきだろうpthread_join(3)
したまま設計を変える。1よりも粒度の大きい変更になるだろうぱっと、3択が考えられた。2 と 3 はちと粒度が大きすぎて自分が fix 案を提案できる感じではなかった。
最初に 1 を進言してみて最初は担当者にも同意してもらえていたが、問題を起こすことが発覚して 2 を選択する計画にしたようだ。PTHREAD_CREATE_DETACHED
に変えてメモリリークを直すことだけにフォーカスしていて、副作用をだしていたことまでは把握できなかった。
0.100.0
を飛ばして 0.100.1
で fix されるというステータスになっているのが今ここのステータス
なお、 調査は業務の一貫として行っております 😊