From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nakajima Akira Subject: [PATCH] Fix to convert SURROGATE PAIR filename Date: Wed, 4 Feb 2015 16:23:26 +0900 Message-ID: <54D1C8EE.2030900@nttcom.co.jp> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050804090307080303000406" To: "linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" Return-path: Sender: linux-cifs-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-ID: --------------050804090307080303000406 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit Garbled characters happen by using surrogate pair for filename. (replace each 1 character to ??) This causes -- inode number duplication (when ?? and ?? exist) . -- can't remove file, directory. -- can't operate under directory. -- auto-remount with noserverino. [Steps to Reproduce] client# touch $(echo -e '\xf0\x9d\x9f\xa3') client# touch $(echo -e '\xf0\x9d\x9f\xa4') client# ls -li You see same inode number, same filename(=?? and ??) . [BUG description] Some functions do not consider about surrogate pair (and IVS). cifs_utf16_bytes() -- return incorrect length, because of not considering about surrogate pair. This causes problem about SymbolicLink with surrogate pair filename. cifs_mapchar() -- not considering about surrogate pair. cifs_from_utf16() -- not convert surrogate pair from SMB response (from UTF-16 to UTF-8) , then ls shows garbled characters. cifsConvertToUTF16() -- not convert surrogate pair when mapchars(SFM/SFU). --------------050804090307080303000406 Content-Type: text/plain; charset="Shift_JIS"; name="0002-Fix-to-convert-SURROGATE-PAIR.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0002-Fix-to-convert-SURROGATE-PAIR.patch" RnJvbSBjNDc3ZjIyNTk3ZjVhMWMyZjNmYThmM2M1ZjI0MTczYjVmY2Y1NDY5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBOYWthamltYSBBa2lyYSA8bmFrYWppbWEuYWtpcmFA bnR0Y29tLmNvLmpwPgpEYXRlOiBXZWQsIDQgRmViIDIwMTUgMTY6MDA6NDIgKzA5MDAKU3Vi amVjdDogW1BBVENIXSBGaXggdG8gY29udmVydCBTVVJST0dBVEUgUEFJUgpTaWduZWQtb2Zm LWJ5OiBOYWthamltYSBBa2lyYSA8bmFrYWppbWEuYWtpcmFAbnR0Y29tLmNvLmpwPgoKLS0t CiBmcy9jaWZzL2NpZnNfdW5pY29kZS5jIHwgIDE4MyArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0tLS0tLS0KIDEgZmlsZXMgY2hhbmdlZCwgMTM3IGluc2Vy dGlvbnMoKyksIDQ2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc191 bmljb2RlLmMgYi9mcy9jaWZzL2NpZnNfdW5pY29kZS5jCmluZGV4IDVkNjQ3YjAuLmY0NmVm ZjAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc191bmljb2RlLmMKKysrIGIvZnMvY2lmcy9j aWZzX3VuaWNvZGUuYwpAQCAtMjcsNDEgKzI3LDYgQEAKICNpbmNsdWRlICJjaWZzZ2xvYi5o IgogI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKIAotLyoKLSAqIGNpZnNfdXRmMTZfYnl0ZXMg LSBob3cgbG9uZyB3aWxsIGEgc3RyaW5nIGJlIGFmdGVyIGNvbnZlcnNpb24/Ci0gKiBAdXRm MTYgLSBwb2ludGVyIHRvIGlucHV0IHN0cmluZwotICogQG1heGJ5dGVzIC0gZG9uJ3QgZ28g cGFzdCB0aGlzIG1hbnkgYnl0ZXMgb2YgaW5wdXQgc3RyaW5nCi0gKiBAY29kZXBhZ2UgLSBk ZXN0aW5hdGlvbiBjb2RlcGFnZQotICoKLSAqIFdhbGsgYSB1dGYxNmxlIHN0cmluZyBhbmQg cmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3RyaW5nIHdpbGwKLSAqIGJl IGFmdGVyIGJlaW5nIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4gY2hhcnNldCwgbm90IGluY2x1 ZGluZyBhbnkgbnVsbAotICogdGVybWluYXRpb24gcmVxdWlyZWQuIERvbid0IHdhbGsgcGFz dCBtYXhieXRlcyBpbiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqLwotaW50Ci1jaWZzX3V0ZjE2 X2J5dGVzKGNvbnN0IF9fbGUxNiAqZnJvbSwgaW50IG1heGJ5dGVzLAotCQljb25zdCBzdHJ1 Y3QgbmxzX3RhYmxlICpjb2RlcGFnZSkKLXsKLQlpbnQgaTsKLQlpbnQgY2hhcmxlbiwgb3V0 bGVuID0gMDsKLQlpbnQgbWF4d29yZHMgPSBtYXhieXRlcyAvIDI7Ci0JY2hhciB0bXBbTkxT X01BWF9DSEFSU0VUX1NJWkVdOwotCV9fdTE2IGZ0bXA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwg bWF4d29yZHM7IGkrKykgewotCQlmdG1wID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZmcm9tW2ld KTsKLQkJaWYgKGZ0bXAgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWNoYXJsZW4gPSBjb2RlcGFn ZS0+dW5pMmNoYXIoZnRtcCwgdG1wLCBOTFNfTUFYX0NIQVJTRVRfU0laRSk7Ci0JCWlmIChj aGFybGVuID4gMCkKLQkJCW91dGxlbiArPSBjaGFybGVuOwotCQllbHNlCi0JCQlvdXRsZW4r KzsKLQl9Ci0KLQlyZXR1cm4gb3V0bGVuOwotfQotCiBpbnQgY2lmc19yZW1hcChzdHJ1Y3Qg Y2lmc19zYl9pbmZvICpjaWZzX3NiKQogewogCWludCBtYXBfdHlwZTsKQEAgLTE1NSwxMCAr MTIwLDEzIEBAIGNvbnZlcnRfc2ZtX2NoYXIoY29uc3QgX191MTYgc3JjX2NoYXIsIGNoYXIg KnRhcmdldCkKICAqIGVub3VnaCB0byBob2xkIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNp b24gKGF0IGxlYXN0IE5MU19NQVhfQ0hBUlNFVF9TSVpFKS4KICAqLwogc3RhdGljIGludAot Y2lmc19tYXBjaGFyKGNoYXIgKnRhcmdldCwgY29uc3QgX191MTYgc3JjX2NoYXIsIGNvbnN0 IHN0cnVjdCBubHNfdGFibGUgKmNwLAorY2lmc19tYXBjaGFyKGNoYXIgKnRhcmdldCwgY29u c3QgX191MTYgKmZyb20sIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNwLAogCSAgICAgaW50 IG1hcHR5cGUpCiB7CiAJaW50IGxlbiA9IDE7CisJX191MTYgc3JjX2NoYXI7CisKKwlzcmNf Y2hhciA9ICpmcm9tOwogCiAJaWYgKChtYXB0eXBlID09IFNGTV9NQVBfVU5JX1JTVkQpICYm IGNvbnZlcnRfc2ZtX2NoYXIoc3JjX2NoYXIsIHRhcmdldCkpCiAJCXJldHVybiBsZW47CkBA IC0xNjgsMTAgKzEzNiwyMyBAQCBjaWZzX21hcGNoYXIoY2hhciAqdGFyZ2V0LCBjb25zdCBf X3UxNiBzcmNfY2hhciwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqY3AsCiAKIAkvKiBpZiBj aGFyYWN0ZXIgbm90IG9uZSBvZiBzZXZlbiBpbiBzcGVjaWFsIHJlbWFwIHNldCAqLwogCWxl biA9IGNwLT51bmkyY2hhcihzcmNfY2hhciwgdGFyZ2V0LCBOTFNfTUFYX0NIQVJTRVRfU0la RSk7Ci0JaWYgKGxlbiA8PSAwKSB7Ci0JCSp0YXJnZXQgPSAnPyc7Ci0JCWxlbiA9IDE7Ci0J fQorCWlmIChsZW4gPD0gMCkKKwkJZ290byBzdXJyb2dhdGVfcGFpcjsKKworCXJldHVybiBs ZW47CisKK3N1cnJvZ2F0ZV9wYWlyOgorCS8qIGNvbnZlcnQgU1VSUk9HQVRFX1BBSVIgYW5k IElWUyAqLworCWlmIChzdHJjbXAoY3AtPmNoYXJzZXQsICJ1dGY4IikpCisJCWdvdG8gdW5r bm93bjsKKwlsZW4gPSB1dGYxNnNfdG9fdXRmOHMoZnJvbSwgMywgVVRGMTZfTElUVExFX0VO RElBTiwgdGFyZ2V0LCA2KTsKKwlpZiAobGVuIDw9IDApCisJCWdvdG8gdW5rbm93bjsKKwly ZXR1cm4gbGVuOworCit1bmtub3duOgorCSp0YXJnZXQgPSAnPyc7CisJbGVuID0gMTsKIAly ZXR1cm4gbGVuOwogfQogCkBAIC0yMDYsNyArMTg3LDcgQEAgY2lmc19mcm9tX3V0ZjE2KGNo YXIgKnRvLCBjb25zdCBfX2xlMTYgKmZyb20sIGludCB0b2xlbiwgaW50IGZyb21sZW4sCiAJ aW50IG51bGxzaXplID0gbmxzX251bGxzaXplKGNvZGVwYWdlKTsKIAlpbnQgZnJvbXdvcmRz ID0gZnJvbWxlbiAvIDI7CiAJY2hhciB0bXBbTkxTX01BWF9DSEFSU0VUX1NJWkVdOwotCV9f dTE2IGZ0bXA7CisJX191MTYgZnRtcFszXTsJCS8qIGZ0bXBbM10gPSAzYXJyYXkgeCAyYnl0 ZXMgPSA2Ynl0ZXMgVVRGLTE2ICovCiAKIAkvKgogCSAqIGJlY2F1c2UgdGhlIGNoYXJzIGNh biBiZSBvZiB2YXJ5aW5nIHdpZHRocywgd2UgbmVlZCB0byB0YWtlIGNhcmUKQEAgLTIxNyw5 ICsxOTgsMTcgQEAgY2lmc19mcm9tX3V0ZjE2KGNoYXIgKnRvLCBjb25zdCBfX2xlMTYgKmZy b20sIGludCB0b2xlbiwgaW50IGZyb21sZW4sCiAJc2FmZWxlbiA9IHRvbGVuIC0gKE5MU19N QVhfQ0hBUlNFVF9TSVpFICsgbnVsbHNpemUpOwogCiAJZm9yIChpID0gMDsgaSA8IGZyb213 b3JkczsgaSsrKSB7Ci0JCWZ0bXAgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmZyb21baV0pOwot CQlpZiAoZnRtcCA9PSAwKQorCQlmdG1wWzBdID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZmcm9t W2ldKTsKKwkJaWYgKGZ0bXBbMF0gPT0gMCkKIAkJCWJyZWFrOworCQlpZiAoaSArIDEgPCBm cm9td29yZHMpCisJCQlmdG1wWzFdID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZmcm9tW2kgKyAx XSk7CisJCWVsc2UKKwkJCWZ0bXBbMV0gPSAwOworCQlpZiAoaSArIDIgPCBmcm9td29yZHMp CisJCQlmdG1wWzJdID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZmcm9tW2kgKyAyXSk7CisJCWVs c2UKKwkJCWZ0bXBbMl0gPSAwOwogCiAJCS8qCiAJCSAqIGNoZWNrIHRvIHNlZSBpZiBjb252 ZXJ0aW5nIHRoaXMgY2hhcmFjdGVyIG1pZ2h0IG1ha2UgdGhlCkBAIC0yMzQsNiArMjIzLDE3 IEBAIGNpZnNfZnJvbV91dGYxNihjaGFyICp0bywgY29uc3QgX19sZTE2ICpmcm9tLCBpbnQg dG9sZW4sIGludCBmcm9tbGVuLAogCQkvKiBwdXQgY29udmVydGVkIGNoYXIgaW50byAndG8n IGJ1ZmZlciAqLwogCQljaGFybGVuID0gY2lmc19tYXBjaGFyKCZ0b1tvdXRsZW5dLCBmdG1w LCBjb2RlcGFnZSwgbWFwX3R5cGUpOwogCQlvdXRsZW4gKz0gY2hhcmxlbjsKKworCQkvKiBj aGFybGVuICg9Ynl0ZXMgb2YgVVRGLTggZm9yIDEgY2hhcmFjdGVyKQorCQkgKiA0Ynl0ZXMg VVRGLTgoc3Vycm9nYXRlIHBhaXIpIGlzIGNoYXJsZW49NAorCQkgKiAgICg0Ynl0ZXMgVVRG LTE2IGNvZGUpCisJCSAqIDctOGJ5dGVzIFVURi04KElWUykgaXMgY2hhcmxlbj0zKzQgb3Ig NCs0CisJCSAqICAgKDIgVVRGLTggcGFpcnMgZGl2aWRlZCB0byAyIFVURi0xNiBwYWlycykg Ki8KKwkJaWYgKGNoYXJsZW4gPT0gNCkKKwkJCWkrKzsKKwkJZWxzZSBpZiAoY2hhcmxlbiA+ PSA1KQorCQkJLyogNS02Ynl0ZXMgVVRGLTggKi8KKwkJCWkgKz0gMjsKIAl9CiAKIAkvKiBw cm9wZXJseSBudWxsLXRlcm1pbmF0ZSBzdHJpbmcgKi8KQEAgLTI5Niw2ICsyOTYsNDYgQEAg c3VjY2VzczoKIH0KIAogLyoKKyAqIGNpZnNfdXRmMTZfYnl0ZXMgLSBob3cgbG9uZyB3aWxs IGEgc3RyaW5nIGJlIGFmdGVyIGNvbnZlcnNpb24/CisgKiBAdXRmMTYgLSBwb2ludGVyIHRv IGlucHV0IHN0cmluZworICogQG1heGJ5dGVzIC0gZG9uJ3QgZ28gcGFzdCB0aGlzIG1hbnkg Ynl0ZXMgb2YgaW5wdXQgc3RyaW5nCisgKiBAY29kZXBhZ2UgLSBkZXN0aW5hdGlvbiBjb2Rl cGFnZQorICoKKyAqIFdhbGsgYSB1dGYxNmxlIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBudW1i ZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3RyaW5nIHdpbGwKKyAqIGJlIGFmdGVyIGJlaW5nIGNv bnZlcnRlZCB0byB0aGUgZ2l2ZW4gY2hhcnNldCwgbm90IGluY2x1ZGluZyBhbnkgbnVsbAor ICogdGVybWluYXRpb24gcmVxdWlyZWQuIERvbid0IHdhbGsgcGFzdCBtYXhieXRlcyBpbiB0 aGUgc291cmNlIGJ1ZmZlci4KKyAqLworaW50CitjaWZzX3V0ZjE2X2J5dGVzKGNvbnN0IF9f bGUxNiAqZnJvbSwgaW50IG1heGJ5dGVzLAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpj b2RlcGFnZSkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhcmxlbiwgb3V0bGVuID0gMDsKKwlpbnQg bWF4d29yZHMgPSBtYXhieXRlcyAvIDI7CisJY2hhciB0bXBbTkxTX01BWF9DSEFSU0VUX1NJ WkVdOworCV9fdTE2IGZ0bXBbM107CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4d29yZHM7IGkr KykgeworCQlmdG1wWzBdID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZmcm9tW2ldKTsKKwkJaWYg KGZ0bXBbMF0gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoaSArIDEgPCBtYXh3b3JkcykKKwkJ CWZ0bXBbMV0gPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmZyb21baSArIDFdKTsKKwkJZWxzZQor CQkJZnRtcFsxXSA9IDA7CisJCWlmIChpICsgMiA8IG1heHdvcmRzKQorCQkJZnRtcFsyXSA9 IGdldF91bmFsaWduZWRfbGUxNigmZnJvbVtpICsgMl0pOworCQllbHNlCisJCQlmdG1wWzJd ID0gMDsKKworCQljaGFybGVuID0gY2lmc19tYXBjaGFyKHRtcCwgZnRtcCwgY29kZXBhZ2Us IE5PX01BUF9VTklfUlNWRCk7CisJCW91dGxlbiArPSBjaGFybGVuOworCX0KKworCXJldHVy biBvdXRsZW47Cit9CisKKy8qCiAgKiBjaWZzX3N0cm5kdXBfZnJvbV91dGYxNiAtIGNvcHkg YSBzdHJpbmcgZnJvbSB3aXJlIGZvcm1hdCB0byB0aGUgbG9jYWwKICAqIGNvZGVwYWdlCiAg KiBAc3JjIC0gc291cmNlIHN0cmluZwpAQCAtNDEyLDEwICs0NTIsMTUgQEAgY2lmc0NvbnZl cnRUb1VURjE2KF9fbGUxNiAqdGFyZ2V0LCBjb25zdCBjaGFyICpzb3VyY2UsIGludCBzcmNs ZW4sCiAJY2hhciBzcmNfY2hhcjsKIAlfX2xlMTYgZHN0X2NoYXI7CiAJd2NoYXJfdCB0bXA7 CisJd2NoYXJfdCAqd2NoYXJfdG87CS8qIFVURi0xNiAqLworCWludCByZXQ7CisJdW5pY29k ZV90IHU7CiAKIAlpZiAobWFwX2NoYXJzID09IE5PX01BUF9VTklfUlNWRCkKIAkJcmV0dXJu IGNpZnNfc3RydG9VVEYxNih0YXJnZXQsIHNvdXJjZSwgUEFUSF9NQVgsIGNwKTsKIAorCXdj aGFyX3RvID0ga3phbGxvYyg2LCBHRlBfS0VSTkVMKTsKKwogCWZvciAoaSA9IDA7IGkgPCBz cmNsZW47IGorKykgewogCQlzcmNfY2hhciA9IHNvdXJjZVtpXTsKIAkJY2hhcmxlbiA9IDE7 CkBAIC00NDQsMTEgKzQ4OSw1NSBAQCBjaWZzQ29udmVydFRvVVRGMTYoX19sZTE2ICp0YXJn ZXQsIGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IHNyY2xlbiwKIAkJCSAqIGlmIG5vIG1hdGNo LCB1c2UgcXVlc3Rpb24gbWFyaywgd2hpY2ggYXQgbGVhc3QgaW4KIAkJCSAqIHNvbWUgY2Fz ZXMgc2VydmVzIGFzIHdpbGQgY2FyZAogCQkJICovCi0JCQlpZiAoY2hhcmxlbiA8IDEpIHsK LQkJCQlkc3RfY2hhciA9IGNwdV90b19sZTE2KDB4MDAzZik7Ci0JCQkJY2hhcmxlbiA9IDE7 CisJCQlpZiAoY2hhcmxlbiA+IDApCisJCQkJZ290byBjdG9VVEYxNjsKKworCQkJLyogY29u dmVydCBTVVJST0dBVEVfUEFJUiAqLworCQkJaWYgKHN0cmNtcChjcC0+Y2hhcnNldCwgInV0 ZjgiKSB8fCAhd2NoYXJfdG8pCisJCQkJZ290byB1bmtub3duOworCQkJaWYgKCooc291cmNl ICsgaSkgJiAweDgwKSB7CisJCQkJY2hhcmxlbiA9IHV0ZjhfdG9fdXRmMzIoc291cmNlICsg aSwgNiwgJnUpOworCQkJCWlmIChjaGFybGVuIDwgMCkKKwkJCQkJZ290byB1bmtub3duOwor CQkJfSBlbHNlCisJCQkJZ290byB1bmtub3duOworCQkJcmV0ICA9IHV0ZjhzX3RvX3V0ZjE2 cyhzb3VyY2UgKyBpLCBjaGFybGVuLAorCQkJCQkgICAgICAgVVRGMTZfTElUVExFX0VORElB TiwKKwkJCQkJICAgICAgIHdjaGFyX3RvLCA2KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdv dG8gdW5rbm93bjsKKworCQkJaSArPSBjaGFybGVuOworCQkJZHN0X2NoYXIgPSAqd2NoYXJf dG87CisJCQlpZiAoY2hhcmxlbiA8PSAzKQorCQkJCS8qIDEtM2J5dGVzIFVURi04IHRvIDJi eXRlcyBVVEYtMTYgKi8KKwkJCQlwdXRfdW5hbGlnbmVkKGRzdF9jaGFyLCAmdGFyZ2V0W2pd KTsKKwkJCWVsc2UgaWYgKGNoYXJsZW4gPT0gNCkgeworCQkJCS8qIDRieXRlcyBVVEYtOChz dXJyb2dhdGUgcGFpcikgdG8gNGJ5dGVzIFVURi0xNgorCQkJCSAqIDctOGJ5dGVzIFVURi04 KElWUykgZGl2aWRlZCB0byAyIFVURi0xNgorCQkJCSAqICAgKGNoYXJsZW49Mys0IG9yIDQr NCkgKi8KKwkJCQlwdXRfdW5hbGlnbmVkKGRzdF9jaGFyLCAmdGFyZ2V0W2pdKTsKKwkJCQlk c3RfY2hhciA9ICood2NoYXJfdG8gKyAxKTsKKwkJCQlqKys7CisJCQkJcHV0X3VuYWxpZ25l ZChkc3RfY2hhciwgJnRhcmdldFtqXSk7CisJCQl9IGVsc2UgaWYgKGNoYXJsZW4gPj0gNSkg eworCQkJCS8qIDUtNmJ5dGVzIFVURi04IHRvIDZieXRlcyBVVEYtMTYgKi8KKwkJCQlwdXRf dW5hbGlnbmVkKGRzdF9jaGFyLCAmdGFyZ2V0W2pdKTsKKwkJCQlkc3RfY2hhciA9ICood2No YXJfdG8gKyAxKTsKKwkJCQlqKys7CisJCQkJcHV0X3VuYWxpZ25lZChkc3RfY2hhciwgJnRh cmdldFtqXSk7CisJCQkJZHN0X2NoYXIgPSAqKHdjaGFyX3RvICsgMik7CisJCQkJaisrOwor CQkJCXB1dF91bmFsaWduZWQoZHN0X2NoYXIsICZ0YXJnZXRbal0pOwogCQkJfQorCQkJY29u dGludWU7CisKK3Vua25vd246CisJCQlkc3RfY2hhciA9IGNwdV90b19sZTE2KDB4MDAzZik7 CisJCQljaGFybGVuID0gMTsKIAkJfQorCitjdG9VVEYxNjoKIAkJLyoKIAkJICogY2hhcmFj dGVyIG1heSB0YWtlIG1vcmUgdGhhbiBvbmUgYnl0ZSBpbiB0aGUgc291cmNlIHN0cmluZywK IAkJICogYnV0IHdpbGwgdGFrZSBleGFjdGx5IHR3byBieXRlcyBpbiB0aGUgdGFyZ2V0IHN0 cmluZwpAQCAtNDU5LDYgKzU0OCw4IEBAIGNpZnNDb252ZXJ0VG9VVEYxNihfX2xlMTYgKnRh cmdldCwgY29uc3QgY2hhciAqc291cmNlLCBpbnQgc3JjbGVuLAogCiBjdG9VVEYxNl9vdXQ6 CiAJcHV0X3VuYWxpZ25lZCgwLCAmdGFyZ2V0W2pdKTsgLyogTnVsbCB0ZXJtaW5hdGUgdGFy Z2V0IHVuaWNvZGUgc3RyaW5nICovCisJaWYgKHdjaGFyX3RvKQorCQlrZnJlZSh3Y2hhcl90 byk7CiAJcmV0dXJuIGo7CiB9CiAKLS0gCjEuNy4xCgo= --------------050804090307080303000406--