xapian-core and Windows non-ASCII paths

Jean-Francois Dockes <[email protected]> Thu, 4 Jun 2020 12:49:58 +0200
Newsgroups gmane.comp.search.xapian.devel
Message-ID <[email protected]>
--wiuE8H9iPb
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit

Hi,

I am attaching a patch against the xapian-core 1.4 branch.

On Windows with MSVC (probably mingw too but I did not test), it allows
xapian-core to create and use an index located at a path containing arbitrary
Unicode characters. As far as I could see, this does not work with the
current code, and, from the question I asked on xapian-discuss nobody seems
to have an obvious external solution for the issue.

The idea of the patch is that a conversion to a Windows Unicode wide char
string is attempted prior to performing a relevant system call. If the
conversion succeeds, the wide version of the call is used, else, the
previous narrow call is used. This should ensure that  existing
applications are undisturbed, and provides a way to tunnel a Unicode path
by using utf-8.

I am not claiming that the patch should be merged as is.

An obvious defect is that you may want to test for an ASCII path (in which
case the conversion succeeds but is wasteful). Also, location of the
conversion routine, style, etc. may not be appropriate. And there are
probably changes missing in untested parts, e.g. xapian-compact.

However it shows the appropriate system call changes and fixes the issue
for me, so I guess it maybe useful for somebody else.

Cheers,

jf


--wiuE8H9iPb
Content-Type: application/octet-stream;
	 name="xapian-1.4-wchar.diff"
Content-Disposition: attachment;
	 filename="xapian-1.4-wchar.diff"
Content-Transfer-Encoding: base64

ZGlmZiAtLWdpdCBhL3hhcGlhbi1jb3JlL2JhY2tlbmRzL2RiZmFjdG9yeS5jYyBiL3hhcGlhbi1j
b3JlL2JhY2tlbmRzL2RiZmFjdG9yeS5jYwppbmRleCAxNGE1MzlmNTY2ODUuLmQyMDJjMzUwOGI0
OCAxMDA2NDQKLS0tIGEveGFwaWFuLWNvcmUvYmFja2VuZHMvZGJmYWN0b3J5LmNjCisrKyBiL3hh
cGlhbi1jb3JlL2JhY2tlbmRzL2RiZmFjdG9yeS5jYwpAQCAtMTg2LDEwICsxODYsMjUgQEAgRGF0
YWJhc2U6OkRhdGFiYXNlKGNvbnN0IHN0cmluZyAmcGF0aCwgaW50IGZsYWdzKQogICAgIH0KIAog
ICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisjaWZkZWYgX19XSU4zMl9fCisgICAgc3RkOjp3c3Ry
aW5nIHdwYXRoID0geHV0Zjh0b3djaGFyKHBhdGgpOworICAgIGlmICh3cGF0aC5lbXB0eSgpKSB7
CisgICAgICAgIGlmIChzdGF0KHBhdGguY19zdHIoKSwgJnN0YXRidWYpID09IC0xKSB7CisgICAg
ICAgICAgICB0aHJvdyBEYXRhYmFzZU9wZW5pbmdFcnJvcigiQ291bGRuJ3Qgc3RhdCAnIiArIHBh
dGggKyAiJyIsIGVycm5vKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVj
dCBfc3RhdDY0aTMyIHN0OworICAgICAgICBpZiAoX3dzdGF0KHdwYXRoLmNfc3RyKCksICZzdCkg
PT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IERhdGFiYXNlT3BlbmluZ0Vycm9yKCJDb3VsZG4n
dCBzdGF0ICciICsgcGF0aCArICInIiwgZXJybm8pOworICAgICAgICB9CisgICAgICAgIHN0YXRi
dWYuc3RfbW9kZSA9IHN0LnN0X21vZGU7CisgICAgICAgIHN0YXRidWYuc3Rfc2l6ZSA9IHN0LnN0
X3NpemU7CisgICAgfQorI2Vsc2UKICAgICBpZiAoc3RhdChwYXRoLmNfc3RyKCksICZzdGF0YnVm
KSA9PSAtMSkgewogCXRocm93IERhdGFiYXNlT3BlbmluZ0Vycm9yKCJDb3VsZG4ndCBzdGF0ICci
ICsgcGF0aCArICInIiwgZXJybm8pOwogICAgIH0KLQorI2VuZGlmCiAgICAgaWYgKFNfSVNSRUco
c3RhdGJ1Zi5zdF9tb2RlKSkgewogCS8vIENvdWxkIGJlIGEgc3R1YiBkYXRhYmFzZSBmaWxlLCBv
ciBhIHNpbmdsZSBmaWxlIGdsYXNzIGRhdGFiYXNlLgogCkBAIC0yOTAsNyArMzA1LDIyIEBAIFdy
aXRhYmxlRGF0YWJhc2U6OldyaXRhYmxlRGF0YWJhc2UoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgs
IGludCBmbGFncywgaW50IGJsb2NrCiAgICAgZmxhZ3MgJj0gfkRCX0JBQ0tFTkRfTUFTS187CiAg
ICAgaWYgKHR5cGUgPT0gMCkgewogCXN0cnVjdCBzdGF0IHN0YXRidWY7Ci0JaWYgKHN0YXQocGF0
aC5jX3N0cigpLCAmc3RhdGJ1ZikgPT0gLTEpIHsKKyAgICAgICAgaW50IHJldDsKKyNpZmRlZiBf
X1dJTjMyX18KKyAgICAgICAgc3RkOjp3c3RyaW5nIHdwYXRoID0geHV0Zjh0b3djaGFyKHBhdGgp
OworICAgICAgICBpZiAod3BhdGguZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0ID0gc3RhdChw
YXRoLmNfc3RyKCksICZzdGF0YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0
cnVjdCBfc3RhdDY0aTMyIHN0OworICAgICAgICAgICAgaWYgKChyZXQgPSBfd3N0YXQod3BhdGgu
Y19zdHIoKSwgJnN0KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXRidWYuc3RfbW9kZSA9
IHN0LnN0X21vZGU7CisgICAgICAgICAgICAgICAgc3RhdGJ1Zi5zdF9zaXplID0gc3Quc3Rfc2l6
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcmV0ID0gc3RhdChw
YXRoLmNfc3RyKCksICZzdGF0YnVmKTsKKyNlbmRpZgorCWlmIChyZXQgPT0gLTEpIHsKIAkgICAg
Ly8gRU5PRU5UIHByb2JhYmx5IGp1c3QgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUg
ZGlyZWN0b3J5LgogCSAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQogCQl0aHJvdyBEYXRhYmFzZU9w
ZW5pbmdFcnJvcigiQ291bGRuJ3Qgc3RhdCAnIiArIHBhdGggKyAiJyIsIGVycm5vKTsKZGlmZiAt
LWdpdCBhL3hhcGlhbi1jb3JlL2JhY2tlbmRzL2ZsaW50X2xvY2suY2MgYi94YXBpYW4tY29yZS9i
YWNrZW5kcy9mbGludF9sb2NrLmNjCmluZGV4IGIzZDk2OTcxOWQ3MS4uMTVlNjVhMGFkMjc3IDEw
MDY0NAotLS0gYS94YXBpYW4tY29yZS9iYWNrZW5kcy9mbGludF9sb2NrLmNjCisrKyBiL3hhcGlh
bi1jb3JlL2JhY2tlbmRzL2ZsaW50X2xvY2suY2MKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRl
IDxjc3RyaW5nPgogI2VuZGlmCiAKKyNpbmNsdWRlICJwb3NpeHlfd3JhcHBlci5oIgogI2luY2x1
ZGUgImNsb3NlZnJvbS5oIgogI2luY2x1ZGUgImVycm5vX3RvX3N0cmluZy5oIgogI2luY2x1ZGUg
Im9tYXNzZXJ0LmgiCkBAIC0xMjgsNiArMTI5LDcgQEAgRmxpbnRMb2NrOjpsb2NrKGJvb2wgZXhj
bHVzaXZlLCBib29sIHdhaXQsIHN0cmluZyAmIGV4cGxhbmF0aW9uKSB7CiAgICAgQXNzZXJ0KGV4
Y2x1c2l2ZSk7CiAjaWYgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19XSU4zMl9fCiAg
ICAgQXNzZXJ0KGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyAgICBzdGQ6OndzdHJp
bmcgd3BhdGg7CiAjaWZkZWYgX19DWUdXSU5fXwogICAgIGNoYXIgZm5tW01BWF9QQVRIXTsKICNp
ZiBDWUdXSU5fVkVSU0lPTl9BUElfTUFKT1IgPT0gMCAmJiBDWUdXSU5fVkVSU0lPTl9BUElfTUlO
T1IgPCAxODEKQEAgLTE0MiwxMyArMTQ0LDE5IEBAIEZsaW50TG9jazo6bG9jayhib29sIGV4Y2x1
c2l2ZSwgYm9vbCB3YWl0LCBzdHJpbmcgJiBleHBsYW5hdGlvbikgewogI2VuZGlmCiAjZWxzZQog
ICAgIGNvbnN0IGNoYXIgKmZubSA9IGZpbGVuYW1lLmNfc3RyKCk7CisgICAgd3BhdGggPSB4dXRm
OHRvd2NoYXIoZmlsZW5hbWUpOwogI2VuZGlmCiByZXRyeToKICAgICAvLyBGSVhNRTogVXNlIExv
Y2tGaWxlRXgoKSBmb3IgbG9ja2luZywgd2hpY2ggd291bGQgYWxsb3cgcHJvcGVyIGJsb2NraW5n
CiAgICAgLy8gYW5kIGFsc28gYnl0ZS1yYW5nZSBsb2NraW5nIGZvciB3aGVuIHdlIGltcGxlbWVu
dCBNVkNDLiAgQnV0IGlzIHRoZXJlIGEKICAgICAvLyB3YXkgdG8gaW50ZXJ3b3JrIHdpdGggdGhl
IENyZWF0ZUZpbGUoKS1iYXNlZCBsb2NraW5nIHdoaWxlIGRvaW5nIHNvPwotICAgIGhGaWxlID0g
Q3JlYXRlRmlsZShmbm0sIEdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfUkVBRCwKLQkJICAgICAg
IE5VTEwsIE9QRU5fQUxXQVlTLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlm
ICh3cGF0aC5lbXB0eSgpKSB7CisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZUEoZm5tLCBHRU5F
UklDX1dSSVRFLCBGSUxFX1NIQVJFX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
TlVMTCwgT1BFTl9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlVyh3cGF0aC5jX3N0cigpLCBHRU5FUklD
X1dSSVRFLCBGSUxFX1NIQVJFX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVM
TCwgT1BFTl9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgfQogICAg
IGlmIChoRmlsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgcmV0dXJuIFNVQ0NFU1M7CiAgICAg
aWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSB7CiAJaWYgKHdhaXQp
IHsKZGlmZiAtLWdpdCBhL3hhcGlhbi1jb3JlL2JhY2tlbmRzL2dsYXNzL2dsYXNzX2RhdGFiYXNl
LmNjIGIveGFwaWFuLWNvcmUvYmFja2VuZHMvZ2xhc3MvZ2xhc3NfZGF0YWJhc2UuY2MKaW5kZXgg
ZTMyZDFiMGM4ZjE2Li45YzVmOWQ0ZWQ0MDkgMTAwNjQ0Ci0tLSBhL3hhcGlhbi1jb3JlL2JhY2tl
bmRzL2dsYXNzL2dsYXNzX2RhdGFiYXNlLmNjCisrKyBiL3hhcGlhbi1jb3JlL2JhY2tlbmRzL2ds
YXNzL2dsYXNzX2RhdGFiYXNlLmNjCkBAIC0xMjgsNyArMTI4LDE4IEBAIEdsYXNzRGF0YWJhc2U6
OkdsYXNzRGF0YWJhc2UoY29uc3Qgc3RyaW5nICZnbGFzc19kaXIsIGludCBmbGFncywKICAgICBp
ZiAoYWN0aW9uICE9IFhhcGlhbjo6REJfT1BFTiAmJiAhZGF0YWJhc2VfZXhpc3RzKCkpIHsKIAkv
LyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGRhdGFiYXNlLCBpZiBpdCBkb2Vzbid0IGV4
aXN0CiAJLy8gYWxyZWFkeS4KLQlpZiAobWtkaXIoZGJfZGlyLmNfc3RyKCksIDA3NTUpIDwgMCkg
eworICAgICAgICBpbnQgcmV0OworI2lmZGVmIF9fV0lOMzJfXworICAgICAgICBzdGQ6OndzdHJp
bmcgd3BhdGggPSB4dXRmOHRvd2NoYXIoZGJfZGlyKTsKKyAgICAgICAgaWYgKHdwYXRoLmVtcHR5
KCkpIHsKKyAgICAgICAgICAgIHJldCA9IG1rZGlyKGRiX2Rpci5jX3N0cigpLCAwNzU1KTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IF93bWtkaXIod3BhdGguY19zdHIoKSk7
CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJldCA9IG1rZGlyKGRiX2Rpci5jX3N0cigpLCAw
NzU1KTsKKyNlbmRpZgorCWlmIChyZXQgPCAwKSB7CiAJICAgIGludCBta2Rpcl9lcnJubyA9IGVy
cm5vOwogCSAgICBpZiAobWtkaXJfZXJybm8gIT0gRUVYSVNUIHx8ICFkaXJfZXhpc3RzKGRiX2Rp
cikpIHsKIAkJdGhyb3cgWGFwaWFuOjpEYXRhYmFzZUNyZWF0ZUVycm9yKGRiX2RpciArICI6IG1r
ZGlyIGZhaWxlZCIsCmRpZmYgLS1naXQgYS94YXBpYW4tY29yZS9jb21tb24vZmlsZXRlc3RzLmgg
Yi94YXBpYW4tY29yZS9jb21tb24vZmlsZXRlc3RzLmgKaW5kZXggMmYxOWZjNGZkZTJiLi45MTU1
NGUyZmU4ZjggMTAwNjQ0Ci0tLSBhL3hhcGlhbi1jb3JlL2NvbW1vbi9maWxldGVzdHMuaAorKysg
Yi94YXBpYW4tY29yZS9jb21tb24vZmlsZXRlc3RzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNs
dWRlICJzYWZlc3lzc3RhdC5oIgogI2luY2x1ZGUgPGNlcnJubz4KICNpbmNsdWRlIDxzdHJpbmc+
CisjaW5jbHVkZSAicG9zaXh5X3dyYXBwZXIuaCIKIAogLyoqIFRlc3QgaWYgYSBmaWxlIGV4aXN0
cy4KICAqCkBAIC0zNyw4ICszOCwxOSBAQAogICoJICAgIHJlc29sdmVzIHRvIGEgcmVndWxhciBm
aWxlLgogICovCiBpbmxpbmUgYm9vbCBmaWxlX2V4aXN0cyhjb25zdCBjaGFyICogcGF0aCkgewor
I2lmZGVmIF9fV0lOMzJfXworICAgIHN0ZDo6d3N0cmluZyB3cGF0aCA9IHh1dGY4dG93Y2hhcihw
YXRoKTsKKyAgICBpZiAod3BhdGguZW1wdHkoKSkgeworICAgICAgICBzdHJ1Y3QgX3N0YXQ2NCBz
dDsKKyAgICAgICAgcmV0dXJuIHN0YXQocGF0aCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3Rf
bW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IF9zdGF0NjRpMzIgc3Q7CisgICAg
ICAgIHJldHVybiBfd3N0YXQod3BhdGguY19zdHIoKSwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Qu
c3RfbW9kZSk7CisgICAgfQorI2Vsc2UKICAgICBzdHJ1Y3Qgc3RhdCBzdDsKICAgICByZXR1cm4g
c3RhdChwYXRoLCAmc3QpID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKTsKKyNlbmRpZgogfQog
CiAvKiogVGVzdCBpZiBhIGZpbGUgZXhpc3RzLgpAQCAtMTM0LDggKzE0NiwxOSBAQCBpbmxpbmUg
b2ZmX3QgZmlsZV9zaXplKGludCBmZCkgewogICoJICAgIHRvIGEgZGlyZWN0b3J5LgogICovCiBp
bmxpbmUgYm9vbCBkaXJfZXhpc3RzKGNvbnN0IGNoYXIgKiBwYXRoKSB7CisjaWZkZWYgX19XSU4z
Ml9fCisgICAgc3RkOjp3c3RyaW5nIHdwYXRoID0geHV0Zjh0b3djaGFyKHBhdGgpOworICAgIGlm
ICh3cGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHN0cnVjdCBfc3RhdDY0IHN0OworICAgICAgICBy
ZXR1cm4gc3RhdChwYXRoLCAmc3QpID09IDAgJiYgU19JU0RJUihzdC5zdF9tb2RlKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBzdHJ1Y3QgX3N0YXQ2NGkzMiBzdDsKKyAgICAgICAgcmV0dXJuIF93
c3RhdCh3cGF0aC5jX3N0cigpLCAmc3QpID09IDAgJiYgU19JU0RJUihzdC5zdF9tb2RlKTsKKyAg
ICB9CisjZWxzZQogICAgIHN0cnVjdCBzdGF0IHN0OwogICAgIHJldHVybiBzdGF0KHBhdGgsICZz
dCkgPT0gMCAmJiBTX0lTRElSKHN0LnN0X21vZGUpOworI2VuZGlmCiB9CiAKIC8qKiBUZXN0IGlm
IGEgZGlyZWN0b3J5IGV4aXN0cy4KZGlmZiAtLWdpdCBhL3hhcGlhbi1jb3JlL2NvbW1vbi9pb191
dGlscy5jYyBiL3hhcGlhbi1jb3JlL2NvbW1vbi9pb191dGlscy5jYwppbmRleCAwMjFmZGM0MDVh
NGQuLmM2ZDEzM2FhNGQzZCAxMDA2NDQKLS0tIGEveGFwaWFuLWNvcmUvY29tbW9uL2lvX3V0aWxz
LmNjCisrKyBiL3hhcGlhbi1jb3JlL2NvbW1vbi9pb191dGlscy5jYwpAQCAtNjksNyArNjksMTcg
QEAgaW9fb3Blbl9ibG9ja193cihjb25zdCBjaGFyICogZm5hbWUsIGJvb2wgYW5ldykKICAgICAv
LyBVc2UgYXV0byBiZWNhdXNlIG9uIEFJWCBPX0NMT0VYRUMgbWF5IGJlIGEgNjQtYml0IGludGVn
ZXIgY29uc3RhbnQuCiAgICAgYXV0byBmbGFncyA9IE9fUkRXUiB8IE9fQklOQVJZIHwgT19DTE9F
WEVDOwogICAgIGlmIChhbmV3KSBmbGFncyB8PSBPX0NSRUFUIHwgT19UUlVOQzsKKyNpZmRlZiBf
X1dJTjMyX18KKyAgICBzdGQ6OndzdHJpbmcgd3BhdGggPSB4dXRmOHRvd2NoYXIoZm5hbWUpOwor
ICAgIGludCBmZDsKKyAgICBpZiAod3BhdGguZW1wdHkoKSkgeworICAgICAgICBmZCA9IDo6b3Bl
bihmbmFtZSwgZmxhZ3MsIDA2NjYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZkID0gOjpfd29w
ZW4od3BhdGguY19zdHIoKSwgZmxhZ3MsIDA2NjYpOworICAgIH0KKyNlbHNlCiAgICAgaW50IGZk
ID0gOjpvcGVuKGZuYW1lLCBmbGFncywgMDY2Nik7CisjZW5kaWYKICAgICBpZiAoZmQgPj0gTUlO
X1dSSVRFX0ZEIHx8IGZkIDwgMCkgcmV0dXJuIGZkOwogCiAgICAgLy8gV2Ugd2FudCB0byBhdm9p
ZCB1c2luZyBmZCA8IE1JTl9XUklURV9GRCwgaW4gY2FzZSBzb21lIG90aGVyIGNvZGUgaW4KZGlm
ZiAtLWdpdCBhL3hhcGlhbi1jb3JlL2NvbW1vbi9pb191dGlscy5oIGIveGFwaWFuLWNvcmUvY29t
bW9uL2lvX3V0aWxzLmgKaW5kZXggY2JhYTk5YWMwZDFiLi5lYzQ4NTNkMzM2MzUgMTAwNjQ0Ci0t
LSBhL3hhcGlhbi1jb3JlL2NvbW1vbi9pb191dGlscy5oCisrKyBiL3hhcGlhbi1jb3JlL2NvbW1v
bi9pb191dGlscy5oCkBAIC0zMCwxMyArMzAsMjMgQEAKICNpbmNsdWRlICJzYWZlZmNudGwuaCIK
ICNpbmNsdWRlICJzYWZldW5pc3RkLmgiCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInBv
c2l4eV93cmFwcGVyLmgiCiAKIC8qKiBPcGVuIGEgYmxvY2stYmFzZWQgZmlsZSBmb3IgcmVhZGlu
Zy4KICAqCiAgKiAgQHBhcmFtIGZuYW1lICBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBvcGVuLgog
ICovCiBpbmxpbmUgaW50IGlvX29wZW5fYmxvY2tfcmQoY29uc3QgY2hhciAqIGZuYW1lKSB7Cisj
aWZkZWYgX19XSU4zMl9fCisgICAgc3RkOjp3c3RyaW5nIHdwYXRoID0geHV0Zjh0b3djaGFyKGZu
YW1lKTsKKyAgICBpZiAod3BhdGguZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gOjpvcGVuKGZu
YW1lLCBPX1JET05MWSB8IE9fQklOQVJZIHwgT19DTE9FWEVDKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICByZXR1cm4gOjpfd29wZW4od3BhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0JJTkFSWSB8
IE9fQ0xPRVhFQyk7CisgICAgfQorI2Vsc2UKICAgICByZXR1cm4gOjpvcGVuKGZuYW1lLCBPX1JE
T05MWSB8IE9fQklOQVJZIHwgT19DTE9FWEVDKTsKKyNlbmRpZgogfQogCiAvKiogT3BlbiBhIGJs
b2NrLWJhc2VkIGZpbGUgZm9yIHJlYWRpbmcuCmRpZmYgLS1naXQgYS94YXBpYW4tY29yZS9jb21t
b24vcG9zaXh5X3dyYXBwZXIuY2MgYi94YXBpYW4tY29yZS9jb21tb24vcG9zaXh5X3dyYXBwZXIu
Y2MKaW5kZXggZDhmZjJjYTEwMWMwLi4wOGUzZWQxZDI3OWUgMTAwNjQ0Ci0tLSBhL3hhcGlhbi1j
b3JlL2NvbW1vbi9wb3NpeHlfd3JhcHBlci5jYworKysgYi94YXBpYW4tY29yZS9jb21tb24vcG9z
aXh5X3dyYXBwZXIuY2MKQEAgLTYyLDYgKzYyLDI5IEBAIHBvc2l4eV91bmxpbmsoY29uc3QgY2hh
ciAqIGZpbGVuYW1lKQogI2luY2x1ZGUgInNhZmVmY250bC5oIgogI2luY2x1ZGUgInNhZmV3aW5k
b3dzLmgiCiAKK3N0ZDo6d3N0cmluZyB4dXRmOHRvd2NoYXIoY29uc3Qgc3RkOjpzdHJpbmcmIGlu
KQoreworICAgIHN0ZDo6d3N0cmluZyByZXQ7CisgICAgaW50IHdjaGFyY250ID0gTXVsdGlCeXRl
VG9XaWRlQ2hhcigKKyAgICAgICAgQ1BfVVRGOCwgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIGluLmNf
c3RyKCksIGluLnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKHdjaGFyY250IDw9IDApIHsK
KyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgd2NoYXJfdCAqd2J1ZiA9ICh3Y2hhcl90
KiltYWxsb2MoKHdjaGFyY250ICsgMSkqIHNpemVvZih3Y2hhcl90KSk7CisgICAgaWYgKG51bGxw
dHIgPT0gd2J1ZikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICB3Y2hhcmNudCA9
IE11bHRpQnl0ZVRvV2lkZUNoYXIoCisgICAgICAgIENQX1VURjgsIE1CX0VSUl9JTlZBTElEX0NI
QVJTLCBpbi5jX3N0cigpLCBpbi5zaXplKCksIHdidWYsIHdjaGFyY250KzEpOworICAgIGlmICh3
Y2hhcmNudCA8PSAwKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXQuYXNzaWdu
KHdidWYsIHdjaGFyY250KTsKK291dDoKKyAgICBmcmVlKHdidWYpOworICAgIHJldHVybiByZXQ7
Cit9CisKIC8qKiBDYWxsIEdldExhc3RFcnJvcigpIGFuZCBzZXQgZXJybm8gYXBwcm9wcmlhdGVs
eS4gKi8KIHN0YXRpYyBpbnQKIHNldF9lcnJub19mcm9tX2dldGxhc3RlcnJvcigpCkBAIC0xNjYs
OSArMTg5LDE2IEBAIGludAogcG9zaXh5X3VubGluayhjb25zdCBjaGFyICogZmlsZW5hbWUpCiB7
CiAgICAgLyogV2UgbXVzdCB1c2UgRGVsZXRlRmlsZSBhcyB0aGlzIGNhbiBkZWxldGUgZmlsZXMg
dGhhdCBhcmUgb3Blbi4gKi8KLSAgICBpZiAoRGVsZXRlRmlsZShmaWxlbmFtZSkgIT0gMCkgewot
CXJldHVybiAwOwotICAgIH0KKyAgICBzdGQ6OndzdHJpbmcgd3BhdGggPSB4dXRmOHRvd2NoYXIo
ZmlsZW5hbWUpOworICAgIGlmICh3cGF0aC5lbXB0eSgpKSB7CisgICAgICAgIGlmIChEZWxldGVG
aWxlQShmaWxlbmFtZSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAoRGVsZXRlRmlsZVcod3BhdGguY19zdHIoKSkgIT0g
MCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAKIAog
ICAgIHJldHVybiBzZXRfZXJybm9fZnJvbV9nZXRsYXN0ZXJyb3IoKTsKIH0KQEAgLTIxOCwxNCAr
MjQ4LDI3IEBAIHBvc2l4eV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCiAJ
ICAgIGJyZWFrOwogICAgIH0KIAotICAgIEhBTkRMRSBoYW5kbGVXaW4gPQotCUNyZWF0ZUZpbGUo
ZmlsZW5hbWUsCi0JCSAgIGR3RGVzaXJlZEFjY2VzcywKLQkJICAgZHdTaGFyZU1vZGUsCi0JCSAg
IE5VTEwsCi0JCSAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKLQkJICAgRklMRV9BVFRSSUJVVEVf
Tk9STUFMLAotCQkgICBOVUxMKTsKKyAgICBzdGQ6OndzdHJpbmcgd3BhdGggPSB4dXRmOHRvd2No
YXIoZmlsZW5hbWUpOworICAgIEhBTkRMRSBoYW5kbGVXaW47CisgICAgaWYgKHdwYXRoLmVtcHR5
KCkpIHsKKyAgICAgICAgaGFuZGxlV2luID0KKyAgICAgICAgICAgIENyZWF0ZUZpbGVBKGZpbGVu
YW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZHdEZXNpcmVkQWNjZXNzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgZHdTaGFyZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxM
LAorICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorICAgICAg
ICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAg
ICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGFuZGxlV2luID0KKyAgICAg
ICAgICAgIENyZWF0ZUZpbGVXKHdwYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAg
IGR3RGVzaXJlZEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgZHdTaGFyZU1vZGUsCisg
ICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGR3Q3Jl
YXRpb25EaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVf
Tk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CiAgICAgaWYgKGhh
bmRsZVdpbiA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewogCXJldHVybiBzZXRfZXJybm9fZnJv
bV9nZXRsYXN0ZXJyb3IoKTsKICAgICB9CkBAIC0yMzcsOCArMjgwLDE2IEBAIHBvc2l4eV9vcGVu
KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCiBpbnQKIHBvc2l4eV9yZW5hbWUoY29u
c3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8pCiB7Ci0gICAgaWYgKE1vdmVGaWxlRXgoZnJv
bSwgdG8sIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcpICE9IDApIHsKLQlyZXR1cm4gMDsKKyAg
ICBzdGQ6OndzdHJpbmcgd2Zyb20gPSB4dXRmOHRvd2NoYXIoZnJvbSk7CisgICAgc3RkOjp3c3Ry
aW5nIHd0byA9IHh1dGY4dG93Y2hhcih0byk7CisgICAgaWYgKHdmcm9tLmVtcHR5KCkgfHwgd3Rv
LmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKE1vdmVGaWxlRXhBKGZyb20sIHRvLCBNT1ZFRklMRV9S
RVBMQUNFX0VYSVNUSU5HKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChNb3ZlRmlsZUV4Vyh3ZnJvbS5jX3N0cigpLCB3
dG8uY19zdHIoKSwgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORykgIT0gMCkgeworICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gc2V0X2Vycm5vX2Zy
b21fZ2V0bGFzdGVycm9yKCk7CmRpZmYgLS1naXQgYS94YXBpYW4tY29yZS9jb21tb24vcG9zaXh5
X3dyYXBwZXIuaCBiL3hhcGlhbi1jb3JlL2NvbW1vbi9wb3NpeHlfd3JhcHBlci5oCmluZGV4IDZj
YTgwZGNkZDIzNS4uNGFhYzFjYjU0M2RkIDEwMDY0NAotLS0gYS94YXBpYW4tY29yZS9jb21tb24v
cG9zaXh5X3dyYXBwZXIuaAorKysgYi94YXBpYW4tY29yZS9jb21tb24vcG9zaXh5X3dyYXBwZXIu
aApAQCAtMjQsNiArMjQsMTAgQEAKICNkZWZpbmUgWEFQSUFOX0lOQ0xVREVEX1BPU0lYWV9XUkFQ
UEVSX0gKIAogI2lmZGVmIF9fV0lOMzJfXworCisjaW5jbHVkZSA8c3RyaW5nPgorZXh0ZXJuIHN0
ZDo6d3N0cmluZyB4dXRmOHRvd2NoYXIoY29uc3Qgc3RkOjpzdHJpbmcmIGluKTsKKwogLyoqIFZl
cnNpb24gb2Ygb3BlbigpIHdoaWNoIGFsbG93cyB0aGUgZmlsZSB0byBiZSB1bmxpbmtlZCB3aGls
ZSBvcGVuLiAqLwogaW50IHBvc2l4eV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxh
Z3MpOwogCg==
--wiuE8H9iPb--