From: Tanaka Akira Date: 2010-01-12T01:54:59+09:00 Subject: [ruby-dev:40040] File.realpath --000e0cd17a12b4f462047ce66573 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit File.realpath (と File.realdirpath) を提供するのはどうでしょうか。 require_relative を呼び出したファイルをシンボリックリンクを通して 指定したとき、実体のファイルからの相対パスでないライブラリを ロードしてしまうことがあります。 % ls -l a b a: total 8 -rw-r--r-- 1 akr akr 13 Jan 12 01:08 lib.rb -rw-r--r-- 1 akr akr 23 Jan 12 01:08 tst.rb b: total 4 -rw-r--r-- 1 akr akr 13 Jan 12 01:08 lib.rb lrwxrwxrwx 1 akr akr 11 Jan 12 01:08 tst.rb -> ../a/tst.rb % cat a/tst.rb require_relative "lib" % cat a/lib.rb p "a/lib.rb" % cat b/lib.rb p "b/lib.rb" % ./ruby a/tst.rb "a/lib.rb" % ./ruby b/tst.rb "b/lib.rb" つまり、a/tst.rb は a/lib.rb をロードすることを期待して require_relative を使っているのに b/tst.rb というシンボリックリンク経由で実行した時は、b/lib.rb を ロードしてしまいます。 これを防ぐには require_relative 内で呼び出したファイルのパス名の シンボリックリンクを解決すればいいのですが、 これを行うメソッドは組み込みにはありません。 そこで、pathname.rb の Pathname#realpath を C で書き直して File.realpath を実装してみました。 (他の File のパス名を操作するクラスメソッド同様、 文字列を受け取って文字列を返します。) (なお C の realpath はバッファの大きさを指定できない危険な関数なので禁止です) また、Pathname#realpath と実装が共有されている Pathname#realdirpath も File.realdirpath として提供してあります。 で、require_relative で File.realpath を使って、b/tst.rb を実行した場合でも a/lib.rb をロードするように してみました。 % ./ruby a/tst.rb "a/lib.rb" % ./ruby b/tst.rb "a/lib.rb" どうでしょう? -- [田中 哲][たなか あきら][Tanaka Akira] --000e0cd17a12b4f462047ce66573 Content-Type: text/x-diff; charset=US-ASCII; name="realpath.patch" Content-Disposition: attachment; filename="realpath.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g4bhu9wx0 JSBzdm4gZGlmZiAtLWRpZmYtY21kIGRpZmYgLXggJy11IC1wJwpJbmRleDogcHJlbHVkZS5yYgo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBwcmVsdWRlLnJiCShyZXZpc2lvbiAyNjI3NikKKysrIHByZWx1ZGUucmIJ KHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDcgQEAgbW9kdWxlIEtlcm5lbAogICAgIGlmIC9c QVwoKC4qKVwpLyA9fiBmaWxlICMgZXZhbCwgZXRjLgogICAgICAgcmFpc2UgTG9hZEVycm9yLCAi cmVxdWlyZV9yZWxhdGl2ZSBpcyBjYWxsZWQgaW4gI3skMX0iCiAgICAgZW5kCi0gICAgYWJzb2x1 dGVfZmVhdHVyZSA9IEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShmaWxl KSwgcmVsYXRpdmVfZmVhdHVyZSkpCisgICAgYWJzb2x1dGVfZmVhdHVyZSA9IEZpbGUuam9pbihG aWxlLmRpcm5hbWUoRmlsZS5yZWFscGF0aChmaWxlKSksIHJlbGF0aXZlX2ZlYXR1cmUpCiAgICAg cmVxdWlyZSBhYnNvbHV0ZV9mZWF0dXJlCiAgIGVuZAogZW5kCkluZGV4OiBpbmNsdWRlL3J1Ynkv aW50ZXJuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQotLS0gaW5jbHVkZS9ydWJ5L2ludGVybi5oCShyZXZpc2lvbiAy NjI3NikKKysrIGluY2x1ZGUvcnVieS9pbnRlcm4uaAkod29ya2luZyBjb3B5KQpAQCAtMzQ2LDYg KzM0Niw4IEBAIHZvaWQgcmJfdGhyZWFkX2F0Zm9ya19iZWZvcmVfZXhlYyh2b2lkKTsKIFZBTFVF IHJiX2V4ZWNfcmVjdXJzaXZlKFZBTFVFKCopKFZBTFVFLCBWQUxVRSwgaW50KSxWQUxVRSxWQUxV RSk7CiBWQUxVRSByYl9leGVjX3JlY3Vyc2l2ZV9wYWlyZWQoVkFMVUUoKikoVkFMVUUsIFZBTFVF LCBpbnQpLFZBTFVFLFZBTFVFLFZBTFVFKTsKIFZBTFVFIHJiX2V4ZWNfcmVjdXJzaXZlX291dGVy KFZBTFVFKCopKFZBTFVFLCBWQUxVRSwgaW50KSxWQUxVRSxWQUxVRSk7CisvKiBkaXIuYyAqLwor VkFMVUUgcmJfZGlyX2dldHdkKHZvaWQpOwogLyogZmlsZS5jICovCiBWQUxVRSByYl9maWxlX3Nf ZXhwYW5kX3BhdGgoaW50LCBWQUxVRSAqKTsKIFZBTFVFIHJiX2ZpbGVfZXhwYW5kX3BhdGgoVkFM VUUsIFZBTFVFKTsKSW5kZXg6IGRpci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRpci5jCShyZXZpc2lvbiAy NjI3NikKKysrIGRpci5jCSh3b3JraW5nIGNvcHkpCkBAIC04NTEsNiArODUxLDIxIEBAIGRpcl9z X2NoZGlyKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMVUUKICAgICByZXR1cm4gSU5UMkZJWCgw KTsKIH0KIAorVkFMVUUKK3JiX2Rpcl9nZXR3ZCh2b2lkKQoreworICAgIGNoYXIgKnBhdGg7Cisg ICAgVkFMVUUgY3dkOworCisgICAgcmJfc2VjdXJlKDQpOworICAgIHBhdGggPSBteV9nZXRjd2Qo KTsKKyAgICBjd2QgPSByYl90YWludGVkX3N0cl9uZXcyKHBhdGgpOworICAgIHJiX2VuY19hc3Nv Y2lhdGUoY3dkLCByYl9maWxlc3lzdGVtX2VuY29kaW5nKCkpOworCisgICAgeGZyZWUocGF0aCk7 CisgICAgcmV0dXJuIGN3ZDsKK30KKwogLyoKICAqICBjYWxsLXNlcToKICAqICAgICBEaXIuZ2V0 d2QgPT4gc3RyaW5nCkBAIC04NjUsMTYgKzg4MCw3IEBAIGRpcl9zX2NoZGlyKGludCBhcmdjLCBW QUxVRSAqYXJndiwgVkFMVUUKIHN0YXRpYyBWQUxVRQogZGlyX3NfZ2V0d2QoVkFMVUUgZGlyKQog ewotICAgIGNoYXIgKnBhdGg7Ci0gICAgVkFMVUUgY3dkOwotCi0gICAgcmJfc2VjdXJlKDQpOwot ICAgIHBhdGggPSBteV9nZXRjd2QoKTsKLSAgICBjd2QgPSByYl90YWludGVkX3N0cl9uZXcyKHBh dGgpOwotICAgIHJiX2VuY19hc3NvY2lhdGUoY3dkLCByYl9maWxlc3lzdGVtX2VuY29kaW5nKCkp OwotCi0gICAgeGZyZWUocGF0aCk7Ci0gICAgcmV0dXJuIGN3ZDsKKyAgICByZXR1cm4gcmJfZGly X2dldHdkKCk7CiB9CiAKIHN0YXRpYyB2b2lkCkluZGV4OiBmaWxlLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g ZmlsZS5jCShyZXZpc2lvbiAyNjI3NikKKysrIGZpbGUuYwkod29ya2luZyBjb3B5KQpAQCAtMzA4 Miw2ICszMDgyLDE0NSBAQCByYl9maWxlX3NfYWJzb2x1dGVfcGF0aChpbnQgYXJnYywgVkFMVUUg CiAgICAgcmV0dXJuIHJiX2ZpbGVfYWJzb2x1dGVfcGF0aChmbmFtZSwgZG5hbWUpOwogfQogCitz dGF0aWMgdm9pZAorcmVhbHBhdGhfcmVjKGxvbmcgKnByZWZpeGxlbnAsIFZBTFVFICpyZXNvbHZl ZHAsIGNoYXIgKnVucmVzb2x2ZWQsIFZBTFVFIGxvb3BjaGVjaywgaW50IHN0cmljdCwgaW50IGxh c3QpCit7CisgICAgd2hpbGUgKCp1bnJlc29sdmVkKSB7CisgICAgICAgIGNoYXIgKnRlc3RuYW1l ID0gdW5yZXNvbHZlZDsKKyAgICAgICAgY2hhciAqdW5yZXNvbHZlZF9maXJzdHNlcCA9IHJiX3Bh dGhfbmV4dCh1bnJlc29sdmVkKTsKKyAgICAgICAgbG9uZyB0ZXN0bmFtZWxlbiA9IHVucmVzb2x2 ZWRfZmlyc3RzZXAgLSB1bnJlc29sdmVkOworICAgICAgICBjaGFyICp1bnJlc29sdmVkX25leHRu YW1lID0gdW5yZXNvbHZlZF9maXJzdHNlcDsKKyAgICAgICAgd2hpbGUgKGlzZGlyc2VwKCp1bnJl c29sdmVkX25leHRuYW1lKSkgdW5yZXNvbHZlZF9uZXh0bmFtZSsrOworICAgICAgICB1bnJlc29s dmVkID0gdW5yZXNvbHZlZF9uZXh0bmFtZTsKKyAgICAgICAgaWYgKHRlc3RuYW1lbGVuID09IDEg JiYgdGVzdG5hbWVbMF0gPT0gJy4nKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVz dG5hbWVsZW4gPT0gMiAmJiB0ZXN0bmFtZVswXSA9PSAnLicgJiYgdGVzdG5hbWVbMV0gPT0gJy4n KSB7CisgICAgICAgICAgICBpZiAoKnByZWZpeGxlbnAgPCBSU1RSSU5HX0xFTigqcmVzb2x2ZWRw KSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnJlc29sdmVkX25hbWVzID0gUlNUUklOR19QVFIo KnJlc29sdmVkcCkgKyAqcHJlZml4bGVucDsKKyAgICAgICAgICAgICAgICBsb25nIGxlbiA9IHJi X3BhdGhfbGFzdF9zZXBhcmF0b3IocmVzb2x2ZWRfbmFtZXMpIC0gcmVzb2x2ZWRfbmFtZXM7Cisg ICAgICAgICAgICAgICAgcmJfc3RyX21vZGlmeSgqcmVzb2x2ZWRwKTsKKyAgICAgICAgICAgICAg ICByYl9zdHJfc2V0X2xlbigqcmVzb2x2ZWRwLCAqcHJlZml4bGVucCArIGxlbik7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWQUxVRSBjaGVj a3ZhbDsKKyAgICAgICAgICAgIFZBTFVFIHRlc3RwYXRoID0gcmJfc3RyX2R1cCgqcmVzb2x2ZWRw KTsKKyAgICAgICAgICAgIGlmICgqcHJlZml4bGVucCA8IFJTVFJJTkdfTEVOKHRlc3RwYXRoKSkK KyAgICAgICAgICAgICAgICByYl9zdHJfY2F0Mih0ZXN0cGF0aCwgIi8iKTsKKyAgICAgICAgICAg IHJiX3N0cl9jYXQodGVzdHBhdGgsIHRlc3RuYW1lLCB0ZXN0bmFtZWxlbik7CisgICAgICAgICAg ICBjaGVja3ZhbCA9IHJiX2hhc2hfYXJlZihsb29wY2hlY2ssIHRlc3RwYXRoKTsKKyAgICAgICAg ICAgIGlmICghTklMX1AoY2hlY2t2YWwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrdmFs ID09IElEMlNZTShyYl9pbnRlcm4oInJlc29sdmluZyIpKSkgeworICAgICAgICAgICAgICAgICAg ICBlcnJubyA9IEVMT09QOworICAgICAgICAgICAgICAgICAgICByYl9zeXNfZmFpbChSU1RSSU5H X1BUUih0ZXN0cGF0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNl IHsKKyAgICAgICAgICAgICAgICAgICAgKnJlc29sdmVkcCA9IHJiX3N0cl9kdXAoY2hlY2t2YWwp OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2Ugewor ICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHNidWY7CisgICAgICAgICAgICAgICAgaW50IHJl dDsKKyAgICAgICAgICAgICAgICByZXQgPSBsc3RhdChSU1RSSU5HX1BUUih0ZXN0cGF0aCksICZz YnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAg ICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz dHJpY3QgfHwgIWxhc3QgfHwgKnVucmVzb2x2ZWRfZmlyc3RzZXApCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmJfc3lzX2ZhaWwoUlNUUklOR19QVFIodGVzdHBhdGgpKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICpyZXNvbHZlZHAgPSB0ZXN0cGF0aDsKKyAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmJfc3lzX2ZhaWwoUlNUUklOR19QVFIo dGVzdHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICBpZiAoU19JU0xOSyhzYnVmLnN0X21vZGUpKSB7CisgICAgICAgICAgICAg ICAgICAgIHZvbGF0aWxlIFZBTFVFIGxpbms7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxp bmtfcHJlZml4LCAqbGlua19uYW1lczsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBsaW5rX3By ZWZpeGxlbjsKKyAgICAgICAgICAgICAgICAgICAgcmJfaGFzaF9hc2V0KGxvb3BjaGVjaywgdGVz dHBhdGgsIElEMlNZTShyYl9pbnRlcm4oInJlc29sdmluZyIpKSk7CisgICAgICAgICAgICAgICAg ICAgIGxpbmsgPSByYl9maWxlX3NfcmVhZGxpbmsocmJfY0ZpbGUsIHRlc3RwYXRoKTsKKyAgICAg ICAgICAgICAgICAgICAgbGlua19wcmVmaXggPSBSU1RSSU5HX1BUUihsaW5rKTsKKyAgICAgICAg ICAgICAgICAgICAgbGlua19uYW1lcyA9IHNraXByb290KGxpbmtfcHJlZml4KTsKKyAgICAgICAg ICAgICAgICAgICAgbGlua19wcmVmaXhsZW4gPSBsaW5rX25hbWVzIC0gbGlua19wcmVmaXg7Cisg ICAgICAgICAgICAgICAgICAgIGlmIChsaW5rX3ByZWZpeGxlbiA9PSAwKSB7CisgICAgICAgICAg ICAgICAgICAgICAgICByZWFscGF0aF9yZWMocHJlZml4bGVucCwgcmVzb2x2ZWRwLCBsaW5rX25h bWVzLCBsb29wY2hlY2ssIHN0cmljdCwgKnVucmVzb2x2ZWRfZmlyc3RzZXAgPT0gJ1wwJyk7Cisg ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAg ICAgICAgICAgICAgICAgICAqcmVzb2x2ZWRwID0gcmJfc3RyX25ldyhsaW5rX3ByZWZpeCwgbGlu a19wcmVmaXhsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgKnByZWZpeGxlbnAgPSBsaW5r X3ByZWZpeGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxwYXRoX3JlYyhwcmVmaXhs ZW5wLCByZXNvbHZlZHAsIGxpbmtfbmFtZXMsIGxvb3BjaGVjaywgc3RyaWN0LCAqdW5yZXNvbHZl ZF9maXJzdHNlcCA9PSAnXDAnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgICAgICByYl9oYXNoX2FzZXQobG9vcGNoZWNrLCB0ZXN0cGF0aCwgcmJfc3RyX2R1cF9mcm96 ZW4oKnJlc29sdmVkcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNl IHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgcyA9IHJiX3N0cl9kdXBfZnJvemVuKHRlc3Rw YXRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmJfaGFzaF9hc2V0KGxvb3BjaGVjaywgcywgcyk7 CisgICAgICAgICAgICAgICAgICAgICpyZXNvbHZlZHAgPSB0ZXN0cGF0aDsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBWQUxV RQorcmVhbHBhdGhfaW50ZXJuYWwoVkFMVUUgcGF0aCwgaW50IHN0cmljdCkKK3sKKyAgICBsb25n IHByZWZpeGxlbjsKKyAgICBWQUxVRSByZXNvbHZlZDsKKyAgICB2b2xhdGlsZSBWQUxVRSB1bnJl c29sdmVkX3BhdGg7CisgICAgY2hhciAqdW5yZXNvbHZlZF9uYW1lczsKKyAgICBWQUxVRSBsb29w Y2hlY2s7CisgICAgRmlsZVBhdGhWYWx1ZShwYXRoKTsKKyAgICB1bnJlc29sdmVkX3BhdGggPSBy Yl9zdHJfZHVwX2Zyb3plbihwYXRoKTsKKyAgICB1bnJlc29sdmVkX25hbWVzID0gc2tpcHJvb3Qo UlNUUklOR19QVFIodW5yZXNvbHZlZF9wYXRoKSk7CisgICAgcHJlZml4bGVuID0gdW5yZXNvbHZl ZF9uYW1lcyAtIFJTVFJJTkdfUFRSKHVucmVzb2x2ZWRfcGF0aCk7CisgICAgbG9vcGNoZWNrID0g cmJfaGFzaF9uZXcoKTsKKyAgICBpZiAocHJlZml4bGVuID09IDApIHsKKyAgICAgICAgdm9sYXRp bGUgVkFMVUUgY3VyZGlyID0gcmJfZGlyX2dldHdkKCk7CisgICAgICAgIGNoYXIgKnVucmVzb2x2 ZWRfY3VyZGlyX25hbWVzID0gc2tpcHJvb3QoUlNUUklOR19QVFIoY3VyZGlyKSk7CisgICAgICAg IHByZWZpeGxlbiA9IHVucmVzb2x2ZWRfY3VyZGlyX25hbWVzIC0gUlNUUklOR19QVFIoY3VyZGly KTsKKyAgICAgICAgcmVzb2x2ZWQgPSByYl9zdHJfbmV3KFJTVFJJTkdfUFRSKGN1cmRpciksIHBy ZWZpeGxlbik7CisgICAgICAgIHJlYWxwYXRoX3JlYygmcHJlZml4bGVuLCAmcmVzb2x2ZWQsIHVu cmVzb2x2ZWRfY3VyZGlyX25hbWVzLCBsb29wY2hlY2ssIDEsIDApOworICAgIH0KKyAgICBlbHNl IHsKKyAgICAgICAgcmVzb2x2ZWQgPSByYl9zdHJfbmV3KFJTVFJJTkdfUFRSKHVucmVzb2x2ZWRf cGF0aCksIHByZWZpeGxlbik7CisgICAgfQorICAgIHJlYWxwYXRoX3JlYygmcHJlZml4bGVuLCAm cmVzb2x2ZWQsIHVucmVzb2x2ZWRfbmFtZXMsIGxvb3BjaGVjaywgc3RyaWN0LCAxKTsKKyAgICBP QkpfVEFJTlQocmVzb2x2ZWQpOworICAgIHJldHVybiByZXNvbHZlZDsKK30KKworLyoKKyAqIGNh bGwtc2VxOgorICogICAgIEZpbGUucmVhbHBhdGgocGF0aG5hbWUpIC0+IHJlYWxfcGF0aG5hbWUK KyAqCisgKiAgUmV0dXJucyB0aGUgcmVhbCAoYWJzb2x1dGUpIHBhdGhuYW1lIG9mICtwYXRobmFt ZSsgaW4gdGhlIGFjdHVhbAorICogIGZpbGVzeXN0ZW0gbm90IGNvbnRhaW5pbmcgc3ltbGlua3Mg b3IgdXNlbGVzcyBkb3RzLgorICogCisgKiAgQWxsIGNvbXBvbmVudHMgb2YgdGhlIHBhdGhuYW1l IG11c3QgZXhpc3Qgd2hlbiB0aGlzIG1ldGhvZCBpcworICogIGNhbGxlZC4KKyAqLworc3RhdGlj IFZBTFVFCityYl9maWxlX3NfcmVhbHBhdGgoVkFMVUUga2xhc3MsIFZBTFVFIHBhdGgpCit7Cisg ICAgcmV0dXJuIHJlYWxwYXRoX2ludGVybmFsKHBhdGgsIDEpOworfQorCisvKgorICogY2FsbC1z ZXE6CisgKiAgICAgRmlsZS5yZWFsZGlycGF0aChwYXRobmFtZSkgLT4gcmVhbF9wYXRobmFtZQor ICoKKyAqICBSZXR1cm5zIHRoZSByZWFsIChhYnNvbHV0ZSkgcGF0aG5hbWUgb2YgK3BhdGhuYW1l KyBpbiB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uCisgKiAgVGhlIHJlYWwgcGF0aG5hbWUgZG9lc24n dCBjb250YWluIHN5bWxpbmtzIG9yIHVzZWxlc3MgZG90cy4KKyAqIAorICogIFRoZSBsYXN0IGNv bXBvbmVudCBvZiB0aGUgcmVhbCBwYXRobmFtZSBjYW4gYmUgbm9uZXhpc3RlbnQuCisgKi8KK3N0 YXRpYyBWQUxVRQorcmJfZmlsZV9zX3JlYWxkaXJwYXRoKFZBTFVFIGtsYXNzLCBWQUxVRSBwYXRo KQoreworICAgIHJldHVybiByZWFscGF0aF9pbnRlcm5hbChwYXRoLCAwKTsKK30KKwogc3RhdGlj IHNpemVfdAogcm1leHQoY29uc3QgY2hhciAqcCwgbG9uZyBsMSwgY29uc3QgY2hhciAqZSkKIHsK QEAgLTQ4OTYsNiArNTAzNSw4IEBAIEluaXRfRmlsZSh2b2lkKQogICAgIHJiX2RlZmluZV9zaW5n bGV0b25fbWV0aG9kKHJiX2NGaWxlLCAidHJ1bmNhdGUiLCByYl9maWxlX3NfdHJ1bmNhdGUsIDIp OwogICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKHJiX2NGaWxlLCAiZXhwYW5kX3BhdGgi LCByYl9maWxlX3NfZXhwYW5kX3BhdGgsIC0xKTsKICAgICByYl9kZWZpbmVfc2luZ2xldG9uX21l dGhvZChyYl9jRmlsZSwgImFic29sdXRlX3BhdGgiLCByYl9maWxlX3NfYWJzb2x1dGVfcGF0aCwg LTEpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKHJiX2NGaWxlLCAicmVhbHBhdGgi LCByYl9maWxlX3NfcmVhbHBhdGgsIDEpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9k KHJiX2NGaWxlLCAicmVhbGRpcnBhdGgiLCByYl9maWxlX3NfcmVhbGRpcnBhdGgsIDEpOwogICAg IHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKHJiX2NGaWxlLCAiYmFzZW5hbWUiLCByYl9maWxl X3NfYmFzZW5hbWUsIC0xKTsKICAgICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChyYl9jRmls ZSwgImRpcm5hbWUiLCByYl9maWxlX3NfZGlybmFtZSwgMSk7CiAgICAgcmJfZGVmaW5lX3Npbmds ZXRvbl9tZXRob2QocmJfY0ZpbGUsICJleHRuYW1lIiwgcmJfZmlsZV9zX2V4dG5hbWUsIDEpOwpJ bmRleDogbGliL3BhdGhuYW1lLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYi9wYXRobmFtZS5yYgkocmV2 aXNpb24gMjYyNzYpCisrKyBsaWIvcGF0aG5hbWUucmIJKHdvcmtpbmcgY29weSkKQEAgLTQzNSw2 MSArNDM1LDYgQEAgY2xhc3MgUGF0aG5hbWUKICAgZW5kCiAgIHByaXZhdGUgOmNsZWFucGF0aF9j b25zZXJ2YXRpdmUKIAotICBkZWYgcmVhbHBhdGhfcmVjKHByZWZpeCwgdW5yZXNvbHZlZCwgaCwg c3RyaWN0LCBsYXN0ID0gdHJ1ZSkKLSAgICByZXNvbHZlZCA9IFtdCi0gICAgdW50aWwgdW5yZXNv bHZlZC5lbXB0eT8KLSAgICAgIG4gPSB1bnJlc29sdmVkLnNoaWZ0Ci0gICAgICBpZiBuID09ICcu JwotICAgICAgICBuZXh0Ci0gICAgICBlbHNpZiBuID09ICcuLicKLSAgICAgICAgcmVzb2x2ZWQu cG9wCi0gICAgICBlbHNlCi0gICAgICAgIHBhdGggPSBwcmVwZW5kX3ByZWZpeChwcmVmaXgsIEZp bGUuam9pbigqKHJlc29sdmVkICsgW25dKSkpCi0gICAgICAgIGlmIGguaW5jbHVkZT8gcGF0aAot ICAgICAgICAgIGlmIGhbcGF0aF0gPT0gOnJlc29sdmluZwotICAgICAgICAgICAgcmFpc2UgRXJy bm86OkVMT09QLm5ldyhwYXRoKQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZWZpeCwg KnJlc29sdmVkID0gaFtwYXRoXQotICAgICAgICAgIGVuZAotICAgICAgICBlbHNlCi0gICAgICAg ICAgYmVnaW4KLSAgICAgICAgICAgIHMgPSBGaWxlLmxzdGF0KHBhdGgpCi0gICAgICAgICAgcmVz Y3VlIEVycm5vOjpFTk9FTlQgPT4gZQotICAgICAgICAgICAgcmFpc2UgZSBpZiBzdHJpY3QgfHwg IWxhc3QgfHwgIXVucmVzb2x2ZWQuZW1wdHk/Ci0gICAgICAgICAgICByZXNvbHZlZCA8PCBuCi0g ICAgICAgICAgICBicmVhawotICAgICAgICAgIGVuZAotICAgICAgICAgIGlmIHMuc3ltbGluaz8K LSAgICAgICAgICAgIGhbcGF0aF0gPSA6cmVzb2x2aW5nCi0gICAgICAgICAgICBsaW5rX3ByZWZp eCwgbGlua19uYW1lcyA9IHNwbGl0X25hbWVzKEZpbGUucmVhZGxpbmsocGF0aCkpCi0gICAgICAg ICAgICBpZiBsaW5rX3ByZWZpeCA9PSAnJwotICAgICAgICAgICAgICBwcmVmaXgsICpyZXNvbHZl ZCA9IGhbcGF0aF0gPSByZWFscGF0aF9yZWMocHJlZml4LCByZXNvbHZlZCArIGxpbmtfbmFtZXMs IGgsIHN0cmljdCwgdW5yZXNvbHZlZC5lbXB0eT8pCi0gICAgICAgICAgICBlbHNlCi0gICAgICAg ICAgICAgIHByZWZpeCwgKnJlc29sdmVkID0gaFtwYXRoXSA9IHJlYWxwYXRoX3JlYyhsaW5rX3By ZWZpeCwgbGlua19uYW1lcywgaCwgc3RyaWN0LCB1bnJlc29sdmVkLmVtcHR5PykKLSAgICAgICAg ICAgIGVuZAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc29sdmVkIDw8IG4KLSAgICAg ICAgICAgIGhbcGF0aF0gPSBbcHJlZml4LCAqcmVzb2x2ZWRdCi0gICAgICAgICAgZW5kCi0gICAg ICAgIGVuZAotICAgICAgZW5kCi0gICAgZW5kCi0gICAgcmV0dXJuIHByZWZpeCwgKnJlc29sdmVk Ci0gIGVuZAotICBwcml2YXRlIDpyZWFscGF0aF9yZWMKLQotICBkZWYgcmVhbF9wYXRoX2ludGVy bmFsKHN0cmljdCA9IGZhbHNlKQotICAgIHBhdGggPSBAcGF0aAotICAgIHByZWZpeCwgbmFtZXMg PSBzcGxpdF9uYW1lcyhwYXRoKQotICAgIGlmIHByZWZpeCA9PSAnJwotICAgICAgcHJlZml4LCBu YW1lczIgPSBzcGxpdF9uYW1lcyhEaXIucHdkKQotICAgICAgbmFtZXMgPSBuYW1lczIgKyBuYW1l cwotICAgIGVuZAotICAgIHByZWZpeCwgKm5hbWVzID0gcmVhbHBhdGhfcmVjKHByZWZpeCwgbmFt ZXMsIHt9LCBzdHJpY3QpCi0gICAgc2VsZi5jbGFzcy5uZXcocHJlcGVuZF9wcmVmaXgocHJlZml4 LCBGaWxlLmpvaW4oKm5hbWVzKSkpCi0gIGVuZAotICBwcml2YXRlIDpyZWFsX3BhdGhfaW50ZXJu YWwKLQogICAjCiAgICMgUmV0dXJucyB0aGUgcmVhbCAoYWJzb2x1dGUpIHBhdGhuYW1lIG9mICtz ZWxmKyBpbiB0aGUgYWN0dWFsCiAgICMgZmlsZXN5c3RlbSBub3QgY29udGFpbmluZyBzeW1saW5r cyBvciB1c2VsZXNzIGRvdHMuCkBAIC00OTgsNyArNDQzLDcgQEAgY2xhc3MgUGF0aG5hbWUKICAg IyBjYWxsZWQuCiAgICMKICAgZGVmIHJlYWxwYXRoCi0gICAgcmVhbF9wYXRoX2ludGVybmFsKHRy dWUpCisgICAgc2VsZi5jbGFzcy5uZXcoRmlsZS5yZWFscGF0aChAcGF0aCkpCiAgIGVuZAogCiAg ICMKQEAgLTUwOCw3ICs0NTMsNyBAQCBjbGFzcyBQYXRobmFtZQogICAjIFRoZSBsYXN0IGNvbXBv bmVudCBvZiB0aGUgcmVhbCBwYXRobmFtZSBjYW4gYmUgbm9uZXhpc3RlbnQuCiAgICMKICAgZGVm IHJlYWxkaXJwYXRoCi0gICAgcmVhbF9wYXRoX2ludGVybmFsKGZhbHNlKQorICAgIHNlbGYuY2xh c3MubmV3KEZpbGUucmVhbGRpcnBhdGgoQHBhdGgpKQogICBlbmQKIAogICAjICNwYXJlbnQgcmV0 dXJucyB0aGUgcGFyZW50IGRpcmVjdG9yeS4K --000e0cd17a12b4f462047ce66573--