A plugin inserting only valid linker scripts causes ld to hang
Jackson Donaldson <[email protected]> Sun, 4 Jan 2026 14:02:34 -0500
| Newsgroups | gmane.comp.gnu.utils.bugs |
|---|---|
| Message-ID | <CAMyd1rQFRrpGSb9yb6eqqw_eDeYEJ4ERTtGD_EoAyGWsZj7TDQ@mail.gmail.com> |
--0000000000008563740647949621 Content-Type: text/plain; charset="UTF-8" If a plugin claims a file using the plugin api as described by https://gcc.gnu.org/wiki/whopr/driver adds an input file which can be parsed as a valid linker script, ld hangs. A minimal example to reproduce this behavior is included. In my testing, main.c can be any valid c source code and inserted_file can be any valid linker script; for simplicity in this test case, I've left them both as empty files as the bug does not depend on their contents Incorrect behavior: ld hangs Expected behavior: linking finishes as normal ld versions: 2.38 (distributed with Ubuntu 22.04) 2.45.50.20251207 (built from commit 4afeaca0dd1ce9244311dcc354ed5bc5fff5227e with gcc 15.2.1) patches: none Suggested cause: I haven't worked with the code base before, so this could of course be flawed. My analysis however, after stepping through with a debugger is the following: Plugins are required to 'capture' some input file (normally, the file still containing IR that's going to go through LTO). The injected files essentially replace the captured files during the linking process. In order to preserve the correct link order though, those injected files should be in the location of the captured file. Among other things, ldlang.c->lang_process is responsible for restoring that correct order. Lang_process calls lang_list_remove_tail to move new data out of each of file_chain, stat_ptr, and input_file_chain and into a temporary variable. It then finds the appropriate location in the respective chains and calls lang_list_insert_after to move the injected files to the correct location. If the injected file is an ld script it is not added to the file_chain linked list. Lang_process does not anticipate this (since presumably all normally injected files are object files). As such, it tries to move 0 entries from the end of file_chain into the middle of file_chain. That would be fine, except for a bug in lang_list_remove_tail. lang_list_remove_tail does not properly handle the case destlist == origlist (where no entries should end up stored in the original list); origlist->head is correctly set to NULL, but origlist->tail remains pointing at the tail of the original list. It should point at origlist->head (since the list is empty). This causes the subsequent call to lang_list_insert_after to create a cycle in the linked list, which was the cause of the hang I observed. Suggested patch: diff --git a/ld/ldlang.c b/ld/ldlang.c index 53bbff1f2a6..97247e6c691 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -8123,6 +8123,8 @@ lang_list_remove_tail (lang_statement_list_type *destlist, origlist->tail = destlist->tail; destlist->tail = savetail; *savetail = NULL; + if(origlist->head == NULL) + origlist->tail = &origlist->head; } static lang_statement_union_type ** - Jackson Donaldson --0000000000008563740647949621 Content-Type: text/plain; charset="US-ASCII"; name="testplugin.c" Content-Disposition: attachment; filename="testplugin.c" Content-Transfer-Encoding: base64 Content-ID: <f_mk03m20r2> X-Attachment-Id: f_mk03m20r2 I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5o PgojaW5jbHVkZSAicGx1Z2luLWFwaS5oIgoKc3RhdGljIGxkX3BsdWdpbl9yZWdpc3Rlcl9jbGFp bV9maWxlIHR2X3JlZ2lzdGVyX2NsYWltX2ZpbGUgPSAwOwpzdGF0aWMgbGRfcGx1Z2luX2FkZF9z eW1ib2xzIGFkZF9zeW1ib2xzID0gMDsKc3RhdGljIGxkX3BsdWdpbl9nZXRfc3ltYm9scyBnZXRf c3ltYm9scyA9IDA7CnN0YXRpYyBsZF9wbHVnaW5fcmVnaXN0ZXJfYWxsX3N5bWJvbHNfcmVhZCB0 dl9yZWdpc3Rlcl9hbGxfc3ltYm9sc19yZWFkID0gMDsKc3RhdGljIGxkX3BsdWdpbl9hZGRfaW5w dXRfZmlsZSBhZGRfaW5wdXRfZmlsZSA9IDA7CgpzdHJ1Y3QgbGRfcGx1Z2luX3N5bWJvbCBzeW1i b2xzWzFdOwoKY29uc3QgY2hhciogdG9fY2xhaW0gPSAiZHVtbXlfY2FwdHVyZV9maWxlIjsKCnN0 YXRpYyBlbnVtIGxkX3BsdWdpbl9zdGF0dXMgb25jbGFpbV9maWxlKGNvbnN0IHN0cnVjdCBsZF9w bHVnaW5faW5wdXRfZmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbnQqIGNsYWltZWQpCnsKICAgIGZwcmludGYoc3RkZXJyLCAib25jbGFpbV9maWxl IGNhbGxlZCBmb3I6ICVzXG4iLCBmaWxlLT5uYW1lKTsKICAgIGlmKHN0cm5jbXAoZmlsZS0+bmFt ZSwgdG9fY2xhaW0sIHN0cmxlbih0b19jbGFpbSkpID09IDApewogICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiUGx1Z2luIGNsYWltZWQgZmlsZTogJXNcbiIsIGZpbGUtPm5hbWUpOwogICAgICAgICpj bGFpbWVkID0gMTsKICAgICAgICAKICAgIH0gZWxzZSB7CiAgICAgICAgKmNsYWltZWQgPSAwOwog ICAgfQogICAgcmV0dXJuIExEUFNfT0s7Cn0KCgpzdGF0aWMgZW51bSBsZF9wbHVnaW5fc3RhdHVz IG9uYWxsX3N5bWJvbHNfcmVhZCgpIHsKICAgIGZwcmludGYoc3RkZXJyLCAiQWxsIHN5bWJvbHMg cmVhZCBoYW5kbGVyIGNhbGxlZC5cbiIpOwoKICAgIGludCB2ID0gYWRkX2lucHV0X2ZpbGUoImlu c2VydGVkX2ZpbGUiKTsKCiAgICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIGlucHV0IGZpbGU6ICVz LCBlcnI6ICVkXG4iLCAiaW5zZXJ0ZWRfZmlsZSIsIHYpOwogICAgcmV0dXJuIExEUFNfT0s7Cn0K CgplbnVtIGxkX3BsdWdpbl9zdGF0dXMgb25sb2FkIChzdHJ1Y3QgbGRfcGx1Z2luX3R2ICp0dil7 CiAgICBmcHJpbnRmKHN0ZGVyciwgIlBsdWdpbiBsb2FkZWQuXG4iKTsKCiAgICBkb3sKICAgICAg ICBzd2l0Y2godHYtPnR2X3RhZyl7CiAgICAgICAgY2FzZSBMRFBUX1JFR0lTVEVSX0NMQUlNX0ZJ TEVfSE9PSzoKICAgICAgICAgICAgdHZfcmVnaXN0ZXJfY2xhaW1fZmlsZSA9IHR2LT50dl91LnR2 X3JlZ2lzdGVyX2NsYWltX2ZpbGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTERQ VF9BRERfU1lNQk9MUzoKICAgICAgICAgICAgYWRkX3N5bWJvbHMgPSB0di0+dHZfdS50dl9hZGRf c3ltYm9sczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMRFBUX0dFVF9TWU1CT0xT OgogICAgICAgICAgICBnZXRfc3ltYm9scyA9IHR2LT50dl91LnR2X2dldF9zeW1ib2xzOwogICAg ICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExEUFRfUkVHSVNURVJfQUxMX1NZTUJPTFNfUkVB RF9IT09LOgogICAgICAgICAgICB0dl9yZWdpc3Rlcl9hbGxfc3ltYm9sc19yZWFkID0gdHYtPnR2 X3UudHZfcmVnaXN0ZXJfYWxsX3N5bWJvbHNfcmVhZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAg ICAgY2FzZSBMRFBUX0FERF9JTlBVVF9GSUxFOgogICAgICAgICAgICBhZGRfaW5wdXRfZmlsZSA9 IHR2LT50dl91LnR2X2FkZF9pbnB1dF9maWxlOwogICAgICAgICAgICBicmVhazsKICAgICAgICBk ZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdHYrKzsKICAgIH0g d2hpbGUgKHR2LT50dl90YWcgIT0gTERQVF9OVUxMKTsKCiAgICBpZighdHZfcmVnaXN0ZXJfY2xh aW1fZmlsZSB8fCAhYWRkX3N5bWJvbHMgfHwgIXR2X3JlZ2lzdGVyX2FsbF9zeW1ib2xzX3JlYWQg fHwgIWdldF9zeW1ib2xzIHx8ICFhZGRfaW5wdXRfZmlsZSkgewogICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiRmFpbGVkIHRvIGZpbmQgYWxsIGZ1bmN0aW9ucz9cbiIpOwogICAgICAgIHJldHVybiBM RFBTX0VSUjsKICAgIH0KICAgIAogICAgdHZfcmVnaXN0ZXJfY2xhaW1fZmlsZShvbmNsYWltX2Zp bGUpOwogICAgdHZfcmVnaXN0ZXJfYWxsX3N5bWJvbHNfcmVhZChvbmFsbF9zeW1ib2xzX3JlYWQp OwoKICAgIHJldHVybiBMRFBTX09LOwp9 --0000000000008563740647949621 Content-Type: application/octet-stream; name=makefile Content-Disposition: attachment; filename=makefile Content-Transfer-Encoding: base64 Content-ID: <f_mk03m2090> X-Attachment-Id: f_mk03m2090 dGVzdDogdGVzdHBsdWdpbgoJdG91Y2ggZHVtbXlfY2FwdHVyZV9maWxlIGluc2VydGVkX2ZpbGUg bWFpbi5jCglnY2MgLWMgbWFpbi5jCgoJIyBsaW5raW5nIGFnYWluc3QgYXQgbGVhc3Qgb25lIGxp YnJhcnkgYXBwZWFycyB0byBiZSBuZWNlc3NhcnkgdG8gdHJpZ2dlciB0aGUgYnVnCglsZCAtbyBt YWluIG1haW4ubyBkdW1teV9jYXB0dXJlX2ZpbGUgLUwvbGliL3g4Nl82NC1saW51eC1nbnUgLWxj IC1wbHVnaW4gLi90ZXN0cGx1Z2luCgp0ZXN0cGx1Z2luOiB0ZXN0cGx1Z2luLmMKCWdjYyAtbyB0 ZXN0cGx1Z2luIHRlc3RwbHVnaW4uYyAtV2FsbCAtV2Vycm9yIC1nIC1zaGFyZWQgLWZQSUMKCmNs ZWFuOgoJcm0gLXJmIG1haW4qIGEub3V0IGluc2VydGVkX2ZpbGUgZHVtbXlfY2FwdHVyZV9maWxl IHRlc3RwbHVnaW4= --0000000000008563740647949621 Content-Type: text/plain; charset="US-ASCII"; name="plugin-api.h" Content-Disposition: attachment; filename="plugin-api.h" Content-Transfer-Encoding: base64 Content-ID: <f_mk03m20k1> X-Attachment-Id: f_mk03m20k1 LyogcGx1Z2luLWFwaS5oIC0tIEV4dGVybmFsIGxpbmtlciBwbHVnaW4gQVBJLiAgKi8KCi8qIENv cHlyaWdodCAoQykgMjAwOS0yMDI1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBX cml0dGVuIGJ5IENhcnkgQ291dGFudCA8Y2NvdXRhbnRAZ29vZ2xlLmNvbT4uCgogICBUaGlzIGZp bGUgaXMgcGFydCBvZiBiaW51dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAg IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExp Y2Vuc2UsIG9yCiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y ZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh bmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNB LiAgKi8KCi8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHdyaXRpbmcgYSBs aW5rZXIgcGx1Z2luLCB3aGljaCBpcwogICBkZXNjcmliZWQgYXQgPCBodHRwOi8vZ2NjLmdudS5v cmcvd2lraS93aG9wci9kcml2ZXIgPi4gICovCgojaWZuZGVmIFBMVUdJTl9BUElfSAojZGVmaW5l IFBMVUdJTl9BUElfSAoKI2lmZGVmIEhBVkVfU1RESU5UX0gKI2luY2x1ZGUgPHN0ZGludC5oPgoj ZWxpZiBkZWZpbmVkKEhBVkVfSU5UVFlQRVNfSCkKI2luY2x1ZGUgPGludHR5cGVzLmg+CiNlbmRp ZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiAhZGVmaW5lZChIQVZFX1NURElOVF9IKSAmJiAh ZGVmaW5lZChIQVZFX0lOVFRZUEVTX0gpICYmIFwKICAgICFkZWZpbmVkKFVJTlQ2NF9NQVgpICYm ICFkZWZpbmVkKHVpbnQ2NF90KQojZXJyb3IgY2Fubm90IGZpbmQgdWludDY0X3QgdHlwZQojZW5k aWYKCi8qIERldGVjdCBlbmRpYW5lc3MgYmFzZWQgb24gZ2NjJ3MgKD49NC42LjApIF9fQllURV9P UkRFUl9fIG1hY3JvLiAgKi8KI2lmIGRlZmluZWQoX19CWVRFX09SREVSX18pICYmIGRlZmluZWQo X19PUkRFUl9CSUdfRU5ESUFOX18pICYmIFwKICAgIGRlZmluZWQoX19PUkRFUl9MSVRUTEVfRU5E SUFOX18pICYmIGRlZmluZWQoX19PUkRFUl9QRFBfRU5ESUFOX18pCiNpZiBfX0JZVEVfT1JERVJf XyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwojZGVmaW5lIFBMVUdJTl9MSVRUTEVfRU5ESUFO IDEKI2VsaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9CSUdfRU5ESUFOX18KI2RlZmluZSBQ TFVHSU5fQklHX0VORElBTiAxCiNlbGlmIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfUERQX0VO RElBTl9fCiNkZWZpbmUgUExVR0lOX1BEUF9FTkRJQU4gMQojZW5kaWYKCiNlbHNlCi8qIEluY2x1 ZGUgaGVhZGVyIGZpbGVzIHRvIGRlZmluZSBlbmRpYW4gbWFjcm9zLiAgKi8KI2lmIGRlZmluZWQo X19HTElCQ19fKSB8fCBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgfHwgZGVmaW5lZChfX0FORFJP SURfXykKI2luY2x1ZGUgPGVuZGlhbi5oPgoKI2VsaWYgZGVmaW5lZChfX1NWUjQpICYmIGRlZmlu ZWQoX19zdW4pCiNpbmNsdWRlIDxzeXMvYnl0ZW9yZGVyLmg+CgojZWxpZiBkZWZpbmVkKF9fRnJl ZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKICAgICAgZGVmaW5lZChfX0RyYWdv bkZseV9fKSB8fCBkZWZpbmVkKF9fbWluaXgpCiNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CgojZWxp ZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQojaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KI2VuZGlm CgovKiBEZXRlY3QgZW5kaWFuZXNzIGJhc2VkIG9uIF9fQllURV9PUkRFUi4gICovCiNpZmRlZiBf X0JZVEVfT1JERVIKI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KI2RlZmluZSBQ TFVHSU5fTElUVExFX0VORElBTiAxCiNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4K I2RlZmluZSBQTFVHSU5fQklHX0VORElBTiAxCiNlbmRpZgoKLyogRGV0ZWN0IGVuZGlhbmVzcyBi YXNlZCBvbiBfQllURV9PUkRFUi4gICovCiNlbGlmIGRlZmluZWQgX0JZVEVfT1JERVIKI2lmIF9C WVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCiNkZWZpbmUgUExVR0lOX0xJVFRMRV9FTkRJQU4g MQojZWxpZiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgojZGVmaW5lIFBMVUdJTl9CSUdfRU5E SUFOIDEKI2VuZGlmCgovKiBEZXRlY3QgYmFzZWQgb24gX1dJTjMyLiAgKi8KI2VsaWYgZGVmaW5l ZCBfV0lOMzIKI2RlZmluZSBQTFVHSU5fTElUVExFX0VORElBTiAxCgovKiBEZXRlY3QgYmFzZWQg b24gX19CSUdfRU5ESUFOX18gYW5kIF9fTElUVExFX0VORElBTl9fICovCiNlbGlmIGRlZmluZWQg X19MSVRUTEVfRU5ESUFOX18gfHwgZGVmaW5lZCBfTElUVExFX0VORElBTgojZGVmaW5lIFBMVUdJ Tl9MSVRUTEVfRU5ESUFOIDEKI2VsaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXyB8fCBkZWZpbmVk IF9CSUdfRU5ESUFOCiNkZWZpbmUgUExVR0lOX0JJR19FTkRJQU4gMQojZW5kaWYKI2VuZGlmCgoj aWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgp7CiNlbmRpZgoKLyogU3RhdHVzIGNvZGUgcmV0 dXJuZWQgYnkgbW9zdCBBUEkgcm91dGluZXMuICAqLwoKZW51bSBsZF9wbHVnaW5fc3RhdHVzCnsK ICBMRFBTX09LID0gMCwKICBMRFBTX05PX1NZTVMsICAgICAgICAgLyogQXR0ZW1wdCB0byBnZXQg c3ltYm9scyB0aGF0IGhhdmVuJ3QgYmVlbiBhZGRlZC4gKi8KICBMRFBTX0JBRF9IQU5ETEUsICAg ICAgLyogTm8gY2xhaW1lZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGhhbmRsZS4gKi8K ICBMRFBTX0VSUgogIC8qIEFkZGl0aW9uYWwgRXJyb3IgY29kZXMgVEJELiAgKi8KfTsKCi8qIFRo ZSB2ZXJzaW9uIG9mIHRoZSBBUEkgc3BlY2lmaWNhdGlvbi4gICovCgplbnVtIGxkX3BsdWdpbl9h cGlfdmVyc2lvbgp7CiAgTERfUExVR0lOX0FQSV9WRVJTSU9OID0gMQp9OwoKLyogVGhlIHR5cGUg b2Ygb3V0cHV0IGZpbGUgYmVpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwoKZW51bSBs ZF9wbHVnaW5fb3V0cHV0X2ZpbGVfdHlwZQp7CiAgTERQT19SRUwsCiAgTERQT19FWEVDLAogIExE UE9fRFlOLAogIExEUE9fUElFCn07CgovKiBBbiBpbnB1dCBmaWxlIG1hbmFnZWQgYnkgdGhlIHBs dWdpbiBsaWJyYXJ5LiAgKi8KCnN0cnVjdCBsZF9wbHVnaW5faW5wdXRfZmlsZQp7CiAgY29uc3Qg Y2hhciAqbmFtZTsKICBpbnQgZmQ7CiAgb2ZmX3Qgb2Zmc2V0OwogIG9mZl90IGZpbGVzaXplOwog IHZvaWQgKmhhbmRsZTsKfTsKCi8qIEEgc3ltYm9sIGJlbG9uZ2luZyB0byBhbiBpbnB1dCBmaWxl IG1hbmFnZWQgYnkgdGhlIHBsdWdpbiBsaWJyYXJ5LiAgKi8KCnN0cnVjdCBsZF9wbHVnaW5fc3lt Ym9sCnsKICBjaGFyICpuYW1lOwogIGNoYXIgKnZlcnNpb247CiAgLyogVGhpcyBpcyBmb3IgY29t cGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFCSXMuICBUaGUgb2xkZXIgQUJJIGRlZmluZWQKICAgICBv bmx5ICdkZWYnIGZpZWxkLiAgKi8KI2lmIFBMVUdJTl9CSUdfRU5ESUFOID09IDEKICBjaGFyIHVu dXNlZDsKICBjaGFyIHNlY3Rpb25fa2luZDsKICBjaGFyIHN5bWJvbF90eXBlOwogIGNoYXIgZGVm OwojZWxpZiBQTFVHSU5fTElUVExFX0VORElBTiA9PSAxCiAgY2hhciBkZWY7CiAgY2hhciBzeW1i b2xfdHlwZTsKICBjaGFyIHNlY3Rpb25fa2luZDsKICBjaGFyIHVudXNlZDsKI2VsaWYgUExVR0lO X1BEUF9FTkRJQU4gPT0gMQogIGNoYXIgc3ltYm9sX3R5cGU7CiAgY2hhciBkZWY7CiAgY2hhciB1 bnVzZWQ7CiAgY2hhciBzZWN0aW9uX2tpbmQ7CiNlbHNlCiNlcnJvciAiQ291bGQgbm90IGRldGVj dCBhcmNoaXRlY3R1cmUgZW5kaWFuZXNzIgojZW5kaWYKICBpbnQgdmlzaWJpbGl0eTsKICB1aW50 NjRfdCBzaXplOwogIGNoYXIgKmNvbWRhdF9rZXk7CiAgaW50IHJlc29sdXRpb247Cn07CgovKiBB biBvYmplY3QncyBzZWN0aW9uLiAgKi8KCnN0cnVjdCBsZF9wbHVnaW5fc2VjdGlvbgp7CiAgY29u c3Qgdm9pZCogaGFuZGxlOwogIHVuc2lnbmVkIGludCBzaG5keDsKfTsKCi8qIFdoZXRoZXIgdGhl IHN5bWJvbCBpcyBhIGRlZmluaXRpb24sIHJlZmVyZW5jZSwgb3IgY29tbW9uLCB3ZWFrIG9yIG5v dC4gICovCgplbnVtIGxkX3BsdWdpbl9zeW1ib2xfa2luZAp7CiAgTERQS19ERUYsCiAgTERQS19X RUFLREVGLAogIExEUEtfVU5ERUYsCiAgTERQS19XRUFLVU5ERUYsCiAgTERQS19DT01NT04KfTsK Ci8qIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzeW1ib2wuICAqLwoKZW51bSBsZF9wbHVnaW5fc3lt Ym9sX3Zpc2liaWxpdHkKewogIExEUFZfREVGQVVMVCwKICBMRFBWX1BST1RFQ1RFRCwKICBMRFBW X0lOVEVSTkFMLAogIExEUFZfSElEREVOCn07CgovKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sLiAg Ki8KCmVudW0gbGRfcGx1Z2luX3N5bWJvbF90eXBlCnsKICBMRFNUX1VOS05PV04sCiAgTERTVF9G VU5DVElPTiwKICBMRFNUX1ZBUklBQkxFCn07CgplbnVtIGxkX3BsdWdpbl9zeW1ib2xfc2VjdGlv bl9raW5kCnsKICBMRFNTS19ERUZBVUxULAogIExEU1NLX0JTUwp9OwoKLyogSG93IGEgc3ltYm9s IGlzIHJlc29sdmVkLiAgKi8KCmVudW0gbGRfcGx1Z2luX3N5bWJvbF9yZXNvbHV0aW9uCnsKICBM RFBSX1VOS05PV04gPSAwLAoKICAvKiBTeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkIGF0IHRoaXMg cG9pbnQuICAqLwogIExEUFJfVU5ERUYsCgogIC8qIFRoaXMgaXMgdGhlIHByZXZhaWxpbmcgZGVm aW5pdGlvbiBvZiB0aGUgc3ltYm9sLCB3aXRoIHJlZmVyZW5jZXMgZnJvbQogICAgIHJlZ3VsYXIg b2JqZWN0IGNvZGUuICAqLwogIExEUFJfUFJFVkFJTElOR19ERUYsCgogIC8qIFRoaXMgaXMgdGhl IHByZXZhaWxpbmcgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sLCB3aXRoIG5vCiAgICAgcmVmZXJl bmNlcyBmcm9tIHJlZ3VsYXIgb2JqZWN0cy4gIEl0IGlzIG9ubHkgcmVmZXJlbmNlZCBmcm9tIElS CiAgICAgY29kZS4gICovCiAgTERQUl9QUkVWQUlMSU5HX0RFRl9JUk9OTFksCgogIC8qIFRoaXMg ZGVmaW5pdGlvbiB3YXMgcHJlLWVtcHRlZCBieSBhIGRlZmluaXRpb24gaW4gYSByZWd1bGFyCiAg ICAgb2JqZWN0IGZpbGUuICAqLwogIExEUFJfUFJFRU1QVEVEX1JFRywKCiAgLyogVGhpcyBkZWZp bml0aW9uIHdhcyBwcmUtZW1wdGVkIGJ5IGEgZGVmaW5pdGlvbiBpbiBhbm90aGVyIElSIGZpbGUu ICAqLwogIExEUFJfUFJFRU1QVEVEX0lSLAoKICAvKiBUaGlzIHN5bWJvbCB3YXMgcmVzb2x2ZWQg YnkgYSBkZWZpbml0aW9uIGluIGFub3RoZXIgSVIgZmlsZS4gICovCiAgTERQUl9SRVNPTFZFRF9J UiwKCiAgLyogVGhpcyBzeW1ib2wgd2FzIHJlc29sdmVkIGJ5IGEgZGVmaW5pdGlvbiBpbiBhIHJl Z3VsYXIgb2JqZWN0CiAgICAgbGlua2VkIGludG8gdGhlIG1haW4gZXhlY3V0YWJsZS4gICovCiAg TERQUl9SRVNPTFZFRF9FWEVDLAoKICAvKiBUaGlzIHN5bWJvbCB3YXMgcmVzb2x2ZWQgYnkgYSBk ZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdC4gICovCiAgTERQUl9SRVNPTFZFRF9EWU4sCgog IC8qIFRoaXMgaXMgdGhlIHByZXZhaWxpbmcgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sLCB3aXRo IG5vCiAgICAgcmVmZXJlbmNlcyBmcm9tIHJlZ3VsYXIgb2JqZWN0cy4gIEl0IGlzIG9ubHkgcmVm ZXJlbmNlZCBmcm9tIElSCiAgICAgY29kZSwgYnV0IHRoZSBzeW1ib2wgaXMgZXhwb3J0ZWQgYW5k IG1heSBiZSByZWZlcmVuY2VkIGZyb20KICAgICBhIGR5bmFtaWMgb2JqZWN0IChub3Qgc2VlbiBh dCBsaW5rIHRpbWUpLiAgKi8KICBMRFBSX1BSRVZBSUxJTkdfREVGX0lST05MWV9FWFAKfTsKCi8q IFRoZSBwbHVnaW4gbGlicmFyeSdzICJjbGFpbSBmaWxlIiBoYW5kbGVyLiAgKi8KCnR5cGVkZWYK ZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2NsYWltX2ZpbGVfaGFuZGxlcikgKAog IGNvbnN0IHN0cnVjdCBsZF9wbHVnaW5faW5wdXRfZmlsZSAqZmlsZSwgaW50ICpjbGFpbWVkKTsK Ci8qIFRoZSBwbHVnaW4gbGlicmFyeSdzICJjbGFpbSBmaWxlIiBoYW5kbGVyLCB2ZXJzaW9uIDIu ICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVnaW5fY2xhaW1fZmls ZV9oYW5kbGVyX3YyKSAoCiAgY29uc3Qgc3RydWN0IGxkX3BsdWdpbl9pbnB1dF9maWxlICpmaWxl LCBpbnQgKmNsYWltZWQsIGludCBrbm93bl91c2VkKTsKCi8qIFRoZSBwbHVnaW4gbGlicmFyeSdz ICJhbGwgc3ltYm9scyByZWFkIiBoYW5kbGVyLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5f c3RhdHVzCigqbGRfcGx1Z2luX2FsbF9zeW1ib2xzX3JlYWRfaGFuZGxlcikgKHZvaWQpOwoKLyog VGhlIHBsdWdpbiBsaWJyYXJ5J3MgY2xlYW51cCBoYW5kbGVyLiAgKi8KCnR5cGVkZWYKZW51bSBs ZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2NsZWFudXBfaGFuZGxlcikgKHZvaWQpOwoKLyog VGhlIGxpbmtlcidzIGludGVyZmFjZSBmb3IgcmVnaXN0ZXJpbmcgdGhlICJjbGFpbSBmaWxlIiBo YW5kbGVyLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX3Jl Z2lzdGVyX2NsYWltX2ZpbGUpIChsZF9wbHVnaW5fY2xhaW1fZmlsZV9oYW5kbGVyIGhhbmRsZXIp OwoKLyogVGhlIGxpbmtlcidzIGludGVyZmFjZSBmb3IgcmVnaXN0ZXJpbmcgdGhlICJjbGFpbSBm aWxlIiBoYW5kbGVyLAogICB2ZXJzaW9uIDIuICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9z dGF0dXMKKCpsZF9wbHVnaW5fcmVnaXN0ZXJfY2xhaW1fZmlsZV92MikgKGxkX3BsdWdpbl9jbGFp bV9maWxlX2hhbmRsZXJfdjIgaGFuZGxlcik7CgovKiBUaGUgbGlua2VyJ3MgaW50ZXJmYWNlIGZv ciByZWdpc3RlcmluZyB0aGUgImFsbCBzeW1ib2xzIHJlYWQiIGhhbmRsZXIuICAqLwoKdHlwZWRl ZgplbnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVnaW5fcmVnaXN0ZXJfYWxsX3N5bWJvbHNf cmVhZCkgKAogIGxkX3BsdWdpbl9hbGxfc3ltYm9sc19yZWFkX2hhbmRsZXIgaGFuZGxlcik7Cgov KiBUaGUgbGlua2VyJ3MgaW50ZXJmYWNlIGZvciByZWdpc3RlcmluZyB0aGUgY2xlYW51cCBoYW5k bGVyLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX3JlZ2lz dGVyX2NsZWFudXApIChsZF9wbHVnaW5fY2xlYW51cF9oYW5kbGVyIGhhbmRsZXIpOwoKLyogVGhl IGxpbmtlcidzIGludGVyZmFjZSBmb3IgYWRkaW5nIHN5bWJvbHMgZnJvbSBhIGNsYWltZWQgaW5w dXQgZmlsZS4gICovCgp0eXBlZGVmCmVudW0gbGRfcGx1Z2luX3N0YXR1cwooKmxkX3BsdWdpbl9h ZGRfc3ltYm9scykgKHZvaWQgKmhhbmRsZSwgaW50IG5zeW1zLAogICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IHN0cnVjdCBsZF9wbHVnaW5fc3ltYm9sICpzeW1zKTsKCi8qIFRoZSBsaW5r ZXIncyBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGlucHV0IGZpbGUgaW5mb3JtYXRpb24gd2l0 aAogICBhbiBvcGVuIChwb3NzaWJseSByZS1vcGVuZWQpIGZpbGUgZGVzY3JpcHRvci4gICovCgp0 eXBlZGVmCmVudW0gbGRfcGx1Z2luX3N0YXR1cwooKmxkX3BsdWdpbl9nZXRfaW5wdXRfZmlsZSkg KGNvbnN0IHZvaWQgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg bGRfcGx1Z2luX2lucHV0X2ZpbGUgKmZpbGUpOwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0 dXMKKCpsZF9wbHVnaW5fZ2V0X3ZpZXcpIChjb25zdCB2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQg Kip2aWV3cCk7CgovKiBUaGUgbGlua2VyJ3MgaW50ZXJmYWNlIGZvciByZWxlYXNpbmcgdGhlIGlu cHV0IGZpbGUuICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVnaW5f cmVsZWFzZV9pbnB1dF9maWxlKSAoY29uc3Qgdm9pZCAqaGFuZGxlKTsKCi8qIFRoZSBsaW5rZXIn cyBpbnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgc3ltYm9sIHJlc29sdXRpb24gaW5mb3JtYXRpb24u ICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVnaW5fZ2V0X3N5bWJv bHMpIChjb25zdCB2b2lkICpoYW5kbGUsIGludCBuc3ltcywKICAgICAgICAgICAgICAgICAgICAg ICAgICBzdHJ1Y3QgbGRfcGx1Z2luX3N5bWJvbCAqc3ltcyk7CgovKiBUaGUgbGlua2VyJ3MgaW50 ZXJmYWNlIGZvciBhZGRpbmcgYSBjb21waWxlZCBpbnB1dCBmaWxlLiAgKi8KCnR5cGVkZWYKZW51 bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2FkZF9pbnB1dF9maWxlKSAoY29uc3QgY2hh ciAqcGF0aG5hbWUpOwoKLyogVGhlIGxpbmtlcidzIGludGVyZmFjZSBmb3IgYWRkaW5nIGEgbGli cmFyeSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZC4gICovCgp0eXBlZGVmCmVudW0gbGRfcGx1Z2lu X3N0YXR1cwooKmxkX3BsdWdpbl9hZGRfaW5wdXRfbGlicmFyeSkgKGNvbnN0IGNoYXIgKmxpYm5h bWUpOwoKLyogVGhlIGxpbmtlcidzIGludGVyZmFjZSBmb3IgYWRkaW5nIGEgbGlicmFyeSBwYXRo IHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3Rh dHVzCigqbGRfcGx1Z2luX3NldF9leHRyYV9saWJyYXJ5X3BhdGgpIChjb25zdCBjaGFyICpwYXRo KTsKCi8qIFRoZSBsaW5rZXIncyBpbnRlcmZhY2UgZm9yIGlzc3VpbmcgYSB3YXJuaW5nIG9yIGVy cm9yIG1lc3NhZ2UuICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVn aW5fbWVzc2FnZSkgKGludCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwoKLyogVGhl IGxpbmtlcidzIGludGVyZmFjZSBmb3IgcmV0cmlldmluZyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25z IGluIGFuIG9iamVjdC4KICAgVGhlIGhhbmRsZSBpcyBvYnRhaW5lZCBpbiB0aGUgY2xhaW1fZmls ZSBoYW5kbGVyLiAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkCiAgIG9ubHkgYmUgaW52b2tlZCBpbiB0 aGUgY2xhaW1fZmlsZSBoYW5kbGVyLiAgIFRoaXMgZnVuY3Rpb24gc2V0cyAqQ09VTlQgdG8KICAg dGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiB0aGUgb2JqZWN0LiAgKi8KCnR5cGVkZWYKZW51bSBs ZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2dldF9pbnB1dF9zZWN0aW9uX2NvdW50KSAoY29u c3Qgdm9pZCogaGFuZGxlLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKCi8qIFRoZSBsaW5rZXIncyBp bnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgdGhlIHNlY3Rpb24gdHlwZSBvZiBhIHNwZWNpZmljCiAg IHNlY3Rpb24gaW4gYW4gb2JqZWN0LiAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgYmUgaW52 b2tlZCBpbiB0aGUKICAgY2xhaW1fZmlsZSBoYW5kbGVyLiAgVGhpcyBmdW5jdGlvbiBzZXRzICpU WVBFIHRvIGFuIEVMRiBTSFRfeHh4IHZhbHVlLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5f c3RhdHVzCigqbGRfcGx1Z2luX2dldF9pbnB1dF9zZWN0aW9uX3R5cGUpIChjb25zdCBzdHJ1Y3Qg bGRfcGx1Z2luX3NlY3Rpb24gc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGludCAqdHlwZSk7CgovKiBUaGUgbGlua2VyJ3MgaW50ZXJmYWNlIGZv ciByZXRyaWV2aW5nIHRoZSBuYW1lIG9mIGEgc3BlY2lmaWMgc2VjdGlvbiBpbgogICBhbiBvYmpl Y3QuIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBvbmx5IGJlIGludm9rZWQgaW4gdGhlIGNsYWltX2Zp bGUgaGFuZGxlci4KICAgVGhpcyBmdW5jdGlvbiBzZXRzICpTRUNUSU9OX05BTUVfUFRSIHRvIGEg bnVsbC10ZXJtaW5hdGVkIGJ1ZmZlciBhbGxvY2F0ZWQKICAgYnkgbWFsbG9jLiAgVGhlIHBsdWdp biBtdXN0IGZyZWUgKlNFQ1RJT05fTkFNRV9QVFIuICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdp bl9zdGF0dXMKKCpsZF9wbHVnaW5fZ2V0X2lucHV0X3NlY3Rpb25fbmFtZSkgKGNvbnN0IHN0cnVj dCBsZF9wbHVnaW5fc2VjdGlvbiBzZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY2hhciAqKnNlY3Rpb25fbmFtZV9wdHIpOwoKLyogVGhlIGxpbmtlcidzIGludGVy ZmFjZSBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBzZWN0aW9uCiAg IGluIGFuIG9iamVjdC4gIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBvbmx5IGJlIGludm9rZWQgaW4g dGhlIGNsYWltX2ZpbGUKICAgaGFuZGxlci4gIFRoaXMgZnVuY3Rpb24gc2V0cyAqU0VDVElPTl9D T05URU5UUyB0byBwb2ludCB0byBhIGJ1ZmZlciB0aGF0IGlzCiAgIHZhbGlkIHVudGlsIGNsYW1f ZmlsZSBoYW5kbGVyIHJldHVybnMuICBJdCBzZXRzICpMRU4gdG8gdGhlIHNpemUgb2YgdGhlCiAg IGJ1ZmZlci4gICovCgp0eXBlZGVmCmVudW0gbGRfcGx1Z2luX3N0YXR1cwooKmxkX3BsdWdpbl9n ZXRfaW5wdXRfc2VjdGlvbl9jb250ZW50cykgKGNvbnN0IHN0cnVjdCBsZF9wbHVnaW5fc2VjdGlv biBzZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHVuc2lnbmVkIGNoYXIgKipzZWN0aW9uX2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVfdCogbGVuKTsKCi8qIFRoZSBsaW5rZXIncyBpbnRlcmZh Y2UgZm9yIHNwZWNpZnlpbmcgdGhlIGRlc2lyZWQgb3JkZXIgb2Ygc2VjdGlvbnMuCiAgIFRoZSBz ZWN0aW9ucyBzaG91bGQgYmUgc3BlY2lmZWQgdXNpbmcgdGhlIGFycmF5IFNFQ1RJT05fTElTVCBp biB0aGUKICAgb3JkZXIgaW4gd2hpY2ggdGhleSBzaG91bGQgYXBwZWFyIGluIHRoZSBmaW5hbCBs YXlvdXQuICBOVU1fU0VDVElPTlMKICAgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZW50cmllcyBp biBlYWNoIGFycmF5LiAgVGhpcyBzaG91bGQgYmUgaW52b2tlZAogICBpbiB0aGUgYWxsX3N5bWJv bHNfcmVhZCBoYW5kbGVyLiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRf cGx1Z2luX3VwZGF0ZV9zZWN0aW9uX29yZGVyKSAoY29uc3Qgc3RydWN0IGxkX3BsdWdpbl9zZWN0 aW9uICpzZWN0aW9uX2xpc3QsCgkJCQkgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3Rpb25zKTsKCi8q IFRoZSBsaW5rZXIncyBpbnRlcmZhY2UgZm9yIHNwZWNpZnlpbmcgdGhhdCByZW9yZGVyaW5nIG9m IHNlY3Rpb25zIGlzCiAgIGRlc2lyZWQgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBwcmVwYXJlIGZv ciBpdC4gIFRoaXMgc2hvdWxkIGJlIGludm9rZWQKICAgYmVmb3JlIHVwZGF0ZV9zZWN0aW9uX29y ZGVyLCBwcmVmZXJhYmx5IGluIHRoZSBjbGFpbV9maWxlIGhhbmRsZXIuICAqLwoKdHlwZWRlZgpl bnVtIGxkX3BsdWdpbl9zdGF0dXMKKCpsZF9wbHVnaW5fYWxsb3dfc2VjdGlvbl9vcmRlcmluZykg KHZvaWQpOwoKLyogVGhlIGxpbmtlcidzIGludGVyZmFjZSBmb3Igc3BlY2lmeWluZyB0aGF0IGEg c3Vic2V0IG9mIHNlY3Rpb25zIGlzCiAgIHRvIGJlIG1hcHBlZCB0byBhIHVuaXF1ZSBzZWdtZW50 LiAgSWYgdGhlIHBsdWdpbiB3YW50cyB0byBjYWxsCiAgIHVuaXF1ZV9zZWdtZW50X2Zvcl9zZWN0 aW9ucywgaXQgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhCiAgIGNsYWltX2ZpbGVfaGFu ZGxlciBvciB3aGVuIGl0IGlzIGZpcnN0IGxvYWRlZC4gICovCgp0eXBlZGVmCmVudW0gbGRfcGx1 Z2luX3N0YXR1cwooKmxkX3BsdWdpbl9hbGxvd191bmlxdWVfc2VnbWVudF9mb3Jfc2VjdGlvbnMp ICh2b2lkKTsKCi8qIFRoZSBsaW5rZXIncyBpbnRlcmZhY2UgZm9yIHNwZWNpZnlpbmcgdGhhdCBh IHNwZWNpZmljIHNldCBvZiBzZWN0aW9ucwogICBtdXN0IGJlIG1hcHBlZCB0byBhIHVuaXF1ZSBz ZWdtZW50LiAgRUxGIHNlZ21lbnRzIGRvIG5vdCBoYXZlIG5hbWVzCiAgIGFuZCB0aGUgTkFNRSBp cyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBuZXdseSBjcmVhdGVkIG91dHB1dCBzZWN0aW9uCiAg IHRoYXQgaXMgdGhlbiBwbGFjZWQgaW4gdGhlIHVuaXF1ZSBQVF9MT0FEIHNlZ21lbnQuICBGTEFH UyBpcyB1c2VkIHRvCiAgIHNwZWNpZnkgaWYgYW55IGFkZGl0aW9uYWwgc2VnbWVudCBmbGFncyBu ZWVkIHRvIGJlIHNldC4gIEZvciBpbnN0YW5jZSwKICAgYSBzcGVjaWZpYyBzZWdtZW50IGZsYWcg Y2FuIGJlIHNldCB0byBpZGVudGlmeSB0aGlzIHNlZ21lbnQuICBVbnNldHRpbmcKICAgc2VnbWVu dCBmbGFncyB0aGF0IHdvdWxkIGJlIHNldCBieSBkZWZhdWx0IGlzIG5vdCBwb3NzaWJsZS4gIFRo ZQogICBwYXJhbWV0ZXIgU0VHTUVOVF9BTElHTk1FTlQgd2hlbiBub24temVybyB3aWxsIG92ZXJy aWRlIHRoZSBkZWZhdWx0LiAgKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRf cGx1Z2luX3VuaXF1ZV9zZWdtZW50X2Zvcl9zZWN0aW9ucykgKAogICAgY29uc3QgY2hhciogc2Vn bWVudF9uYW1lLAogICAgdWludDY0X3Qgc2VnbWVudF9mbGFncywKICAgIHVpbnQ2NF90IHNlZ21l bnRfYWxpZ25tZW50LAogICAgY29uc3Qgc3RydWN0IGxkX3BsdWdpbl9zZWN0aW9uICogc2VjdGlv bl9saXN0LAogICAgdW5zaWduZWQgaW50IG51bV9zZWN0aW9ucyk7CgovKiBUaGUgbGlua2VyJ3Mg aW50ZXJmYWNlIGZvciByZXRyaWV2aW5nIHRoZSBzZWN0aW9uIGFsaWdubWVudCByZXF1aXJlbWVu dAogICBvZiBhIHNwZWNpZmljIHNlY3Rpb24gaW4gYW4gb2JqZWN0LiAgVGhpcyBpbnRlcmZhY2Ug c2hvdWxkIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUKICAgY2xhaW1fZmlsZSBoYW5kbGVyLiAgVGhp cyBmdW5jdGlvbiBzZXRzICpBRERSQUxJR04gdG8gdGhlIEVMRiBzaF9hZGRyYWxpZ24KICAgdmFs dWUgb2YgdGhlIGlucHV0IHNlY3Rpb24uICAqLwoKdHlwZWRlZgplbnVtIGxkX3BsdWdpbl9zdGF0 dXMKKCpsZF9wbHVnaW5fZ2V0X2lucHV0X3NlY3Rpb25fYWxpZ25tZW50KSAoY29uc3Qgc3RydWN0 IGxkX3BsdWdpbl9zZWN0aW9uIHNlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYWRkcmFsaWduKTsKCi8qIFRoZSBsaW5rZXIncyBp bnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgdGhlIHNlY3Rpb24gc2l6ZSBvZiBhIHNwZWNpZmljIHNl Y3Rpb24KICAgaW4gYW4gb2JqZWN0LiAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgYmUgaW52 b2tlZCBpbiB0aGUgY2xhaW1fZmlsZSBoYW5kbGVyLgogICBUaGlzIGZ1bmN0aW9uIHNldHMgKlNF Q1NJWkUgdG8gdGhlIEVMRiBzaF9zaXplCiAgIHZhbHVlIG9mIHRoZSBpbnB1dCBzZWN0aW9uLiAg Ki8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2dldF9pbnB1dF9z ZWN0aW9uX3NpemUpIChjb25zdCBzdHJ1Y3QgbGRfcGx1Z2luX3NlY3Rpb24gc2VjdGlvbiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpzZWNzaXplKTsKCnR5 cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX25ld19pbnB1dF9oYW5kbGVy KSAoY29uc3Qgc3RydWN0IGxkX3BsdWdpbl9pbnB1dF9maWxlICpmaWxlKTsKCi8qIFRoZSBsaW5r ZXIncyBpbnRlcmZhY2UgZm9yIHJlZ2lzdGVyaW5nIHRoZSAibmV3X2lucHV0IiBoYW5kbGVyLiBU aGlzIGhhbmRsZXIKICAgd2lsbCBiZSBub3RpZmllZCB3aGVuIGEgbmV3IGlucHV0IGZpbGUgaGFz IGJlZW4gYWRkZWQgYWZ0ZXIgdGhlCiAgIGFsbF9zeW1ib2xzX3JlYWQgZXZlbnQsIGFsbG93aW5n IHRoZSBwbHVnaW4gdG8sIGZvciBleGFtcGxlLCBzZXQgYSB1bmlxdWUKICAgc2VnbWVudCBmb3Ig c2VjdGlvbnMgaW4gcGx1Z2luLWdlbmVyYXRlZCBpbnB1dCBmaWxlcy4gKi8KCnR5cGVkZWYKZW51 bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX3JlZ2lzdGVyX25ld19pbnB1dCkgKGxkX3Bs dWdpbl9uZXdfaW5wdXRfaGFuZGxlciBoYW5kbGVyKTsKCi8qIFRoZSBsaW5rZXIncyBpbnRlcmZh Y2UgZm9yIGdldHRpbmcgdGhlIGxpc3Qgb2Ygd3JhcHBlZCBzeW1ib2xzIHVzaW5nIHRoZQogICAt LXdyYXAgb3B0aW9uLiBUaGlzIHNldHMgKk5VTV9TWU1CT0xTIHRvIG51bWJlciBvZiB3cmFwcGVk IHN5bWJvbHMgYW5kCiAgICpXUkFQX1NZTUJPTF9MSVNUIHRvIHRoZSBsaXN0IG9mIHdyYXBwZWQg c3ltYm9scy4gKi8KCnR5cGVkZWYKZW51bSBsZF9wbHVnaW5fc3RhdHVzCigqbGRfcGx1Z2luX2dl dF93cmFwX3N5bWJvbHMpICh1aW50NjRfdCAqbnVtX3N5bWJvbHMsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCBjaGFyICoqKndyYXBfc3ltYm9sX2xpc3QpOwoKZW51bSBsZF9w bHVnaW5fbGV2ZWwKewogIExEUExfSU5GTywKICBMRFBMX1dBUk5JTkcsCiAgTERQTF9FUlJPUiwK ICBMRFBMX0ZBVEFMCn07CgovKiBDb250cmFjdCBiZXR3ZWVuIGEgcGx1Zy1pbiBhbmQgYSBsaW5r ZXIuICAqLwoKZW51bSBsaW5rZXJfYXBpX3ZlcnNpb24KewogICAvKiBUaGUgbGlua2VyL3BsdWdp biBkbyBub3QgaW1wbGVtZW50IGFueSBvZiB0aGUgQVBJIGxldmVscyBiZWxvdywgdGhlIEFQSQog ICAgICAgaXMgZGV0ZXJtaW5lZCBzb2xlbHkgdmlhIHRoZSB0cmFuc2ZlciB2ZWN0b3IuICAqLwog ICBMQVBJX1YwLAoKICAgLyogQVBJIGxldmVsIHYxLiAgVGhlIGxpbmtlciBwcm92aWRlcyBnZXRf c3ltYm9sc192MywgYWRkX3N5bWJvbHNfdjIsCiAgICAgIHRoZSBwbHVnaW4gd2lsbCB1c2UgdGhh dCBhbmQgbm90IGFueSBsb3dlciB2ZXJzaW9ucy4KICAgICAgY2xhaW1fZmlsZSBpcyB0aHJlYWQt c2FmZSBvbiB0aGUgcGx1Z2luIHNpZGUgYW5kCiAgICAgIGFkZF9zeW1ib2xzIG9uIHRoZSBsaW5r ZXIgc2lkZS4gICovCiAgIExBUElfVjEKfTsKCi8qIFRoZSBsaW5rZXIncyBpbnRlcmZhY2UgZm9y IEFQSSB2ZXJzaW9uIG5lZ290aWF0aW9uLiAgQSBwbHVnLWluIGNhbGxzCiAgdGhlIGZ1bmN0aW9u ICh3aXRoIGl0cyBJREVOVElGSUVSIGFuZCBWRVJTSU9OKSwgcGx1cyBtaW5pbWFsIGFuZCBtYXhp bWFsCiAgdmVyc2lvbiBvZiBsaW5rZXJfYXBpX3ZlcnNpb24gaXMgcHJvdmlkZWQuICBMaW5rZXIg dGhlbiByZXR1cm5zIHNlbGVjdGVkCiAgQVBJIHZlcnNpb24gYW5kIHByb3ZpZGVzIGl0cyBJREVO VElGSUVSIGFuZCBWRVJTSU9OLiAgVGhlIHJldHVybmVkIHZhbHVlCiAgYnkgbGlua2VyIG11c3Qg YmUgaW4gcmFuZ2UgW01JTklNQUxfQVBJX1NVUFBPUlRFRCwgTUFYSU1BTF9BUElfU1VQUE9SVEVE XS4KICBJZGVudGlmaWVyIHBvaW50ZXJzIHJlbWFpbiB2YWxpZCBhcyBsb25nIGFzIHRoZSBwbHVn aW4gaXMgbG9hZGVkLiAgKi8KCnR5cGVkZWYKaW50CigqbGRfcGx1Z2luX2dldF9hcGlfdmVyc2lv bikgKGNvbnN0IGNoYXIgKnBsdWdpbl9pZGVudGlmaWVyLAoJCQkgICAgICBjb25zdCBjaGFyICpw bHVnaW5fdmVyc2lvbiwKCQkJICAgICAgaW50IG1pbmltYWxfYXBpX3N1cHBvcnRlZCwKCQkJICAg ICAgaW50IG1heGltYWxfYXBpX3N1cHBvcnRlZCwKCQkJICAgICAgY29uc3QgY2hhciAqKmxpbmtl cl9pZGVudGlmaWVyLAoJCQkgICAgICBjb25zdCBjaGFyICoqbGlua2VyX3ZlcnNpb24pOwoKLyog VmFsdWVzIGZvciB0aGUgdHZfdGFnIGZpZWxkIG9mIHRoZSB0cmFuc2ZlciB2ZWN0b3IuICAqLwoK ZW51bSBsZF9wbHVnaW5fdGFnCnsKICBMRFBUX05VTEwsCiAgTERQVF9BUElfVkVSU0lPTiwKICBM RFBUX0dPTERfVkVSU0lPTiwKICBMRFBUX0xJTktFUl9PVVRQVVQsCiAgTERQVF9PUFRJT04sCiAg TERQVF9SRUdJU1RFUl9DTEFJTV9GSUxFX0hPT0ssCiAgTERQVF9SRUdJU1RFUl9BTExfU1lNQk9M U19SRUFEX0hPT0ssCiAgTERQVF9SRUdJU1RFUl9DTEVBTlVQX0hPT0ssCiAgTERQVF9BRERfU1lN Qk9MUywKICBMRFBUX0dFVF9TWU1CT0xTLAogIExEUFRfQUREX0lOUFVUX0ZJTEUsCiAgTERQVF9N RVNTQUdFLAogIExEUFRfR0VUX0lOUFVUX0ZJTEUsCiAgTERQVF9SRUxFQVNFX0lOUFVUX0ZJTEUs CiAgTERQVF9BRERfSU5QVVRfTElCUkFSWSwKICBMRFBUX09VVFBVVF9OQU1FLAogIExEUFRfU0VU X0VYVFJBX0xJQlJBUllfUEFUSCwKICBMRFBUX0dOVV9MRF9WRVJTSU9OLAogIExEUFRfR0VUX1ZJ RVcsCiAgTERQVF9HRVRfSU5QVVRfU0VDVElPTl9DT1VOVCwKICBMRFBUX0dFVF9JTlBVVF9TRUNU SU9OX1RZUEUsCiAgTERQVF9HRVRfSU5QVVRfU0VDVElPTl9OQU1FLAogIExEUFRfR0VUX0lOUFVU X1NFQ1RJT05fQ09OVEVOVFMsCiAgTERQVF9VUERBVEVfU0VDVElPTl9PUkRFUiwKICBMRFBUX0FM TE9XX1NFQ1RJT05fT1JERVJJTkcsCiAgTERQVF9HRVRfU1lNQk9MU19WMiwKICBMRFBUX0FMTE9X X1VOSVFVRV9TRUdNRU5UX0ZPUl9TRUNUSU9OUywKICBMRFBUX1VOSVFVRV9TRUdNRU5UX0ZPUl9T RUNUSU9OUywKICBMRFBUX0dFVF9TWU1CT0xTX1YzLAogIExEUFRfR0VUX0lOUFVUX1NFQ1RJT05f QUxJR05NRU5ULAogIExEUFRfR0VUX0lOUFVUX1NFQ1RJT05fU0laRSwKICBMRFBUX1JFR0lTVEVS X05FV19JTlBVVF9IT09LLAogIExEUFRfR0VUX1dSQVBfU1lNQk9MUywKICBMRFBUX0FERF9TWU1C T0xTX1YyLAogIExEUFRfR0VUX0FQSV9WRVJTSU9OLAogIExEUFRfUkVHSVNURVJfQ0xBSU1fRklM RV9IT09LX1YyCn07CgovKiBUaGUgcGx1Z2luIHRyYW5zZmVyIHZlY3Rvci4gICovCgpzdHJ1Y3Qg bGRfcGx1Z2luX3R2CnsKICBlbnVtIGxkX3BsdWdpbl90YWcgdHZfdGFnOwogIHVuaW9uCiAgewog ICAgaW50IHR2X3ZhbDsKICAgIGNvbnN0IGNoYXIgKnR2X3N0cmluZzsKICAgIGxkX3BsdWdpbl9y ZWdpc3Rlcl9jbGFpbV9maWxlIHR2X3JlZ2lzdGVyX2NsYWltX2ZpbGU7CiAgICBsZF9wbHVnaW5f cmVnaXN0ZXJfY2xhaW1fZmlsZV92MiB0dl9yZWdpc3Rlcl9jbGFpbV9maWxlX3YyOwogICAgbGRf cGx1Z2luX3JlZ2lzdGVyX2FsbF9zeW1ib2xzX3JlYWQgdHZfcmVnaXN0ZXJfYWxsX3N5bWJvbHNf cmVhZDsKICAgIGxkX3BsdWdpbl9yZWdpc3Rlcl9jbGVhbnVwIHR2X3JlZ2lzdGVyX2NsZWFudXA7 CiAgICBsZF9wbHVnaW5fYWRkX3N5bWJvbHMgdHZfYWRkX3N5bWJvbHM7CiAgICBsZF9wbHVnaW5f Z2V0X3N5bWJvbHMgdHZfZ2V0X3N5bWJvbHM7CiAgICBsZF9wbHVnaW5fYWRkX2lucHV0X2ZpbGUg dHZfYWRkX2lucHV0X2ZpbGU7CiAgICBsZF9wbHVnaW5fbWVzc2FnZSB0dl9tZXNzYWdlOwogICAg bGRfcGx1Z2luX2dldF9pbnB1dF9maWxlIHR2X2dldF9pbnB1dF9maWxlOwogICAgbGRfcGx1Z2lu X2dldF92aWV3IHR2X2dldF92aWV3OwogICAgbGRfcGx1Z2luX3JlbGVhc2VfaW5wdXRfZmlsZSB0 dl9yZWxlYXNlX2lucHV0X2ZpbGU7CiAgICBsZF9wbHVnaW5fYWRkX2lucHV0X2xpYnJhcnkgdHZf YWRkX2lucHV0X2xpYnJhcnk7CiAgICBsZF9wbHVnaW5fc2V0X2V4dHJhX2xpYnJhcnlfcGF0aCB0 dl9zZXRfZXh0cmFfbGlicmFyeV9wYXRoOwogICAgbGRfcGx1Z2luX2dldF9pbnB1dF9zZWN0aW9u X2NvdW50IHR2X2dldF9pbnB1dF9zZWN0aW9uX2NvdW50OwogICAgbGRfcGx1Z2luX2dldF9pbnB1 dF9zZWN0aW9uX3R5cGUgdHZfZ2V0X2lucHV0X3NlY3Rpb25fdHlwZTsKICAgIGxkX3BsdWdpbl9n ZXRfaW5wdXRfc2VjdGlvbl9uYW1lIHR2X2dldF9pbnB1dF9zZWN0aW9uX25hbWU7CiAgICBsZF9w bHVnaW5fZ2V0X2lucHV0X3NlY3Rpb25fY29udGVudHMgdHZfZ2V0X2lucHV0X3NlY3Rpb25fY29u dGVudHM7CiAgICBsZF9wbHVnaW5fdXBkYXRlX3NlY3Rpb25fb3JkZXIgdHZfdXBkYXRlX3NlY3Rp b25fb3JkZXI7CiAgICBsZF9wbHVnaW5fYWxsb3dfc2VjdGlvbl9vcmRlcmluZyB0dl9hbGxvd19z ZWN0aW9uX29yZGVyaW5nOwogICAgbGRfcGx1Z2luX2FsbG93X3VuaXF1ZV9zZWdtZW50X2Zvcl9z ZWN0aW9ucyB0dl9hbGxvd191bmlxdWVfc2VnbWVudF9mb3Jfc2VjdGlvbnM7IAogICAgbGRfcGx1 Z2luX3VuaXF1ZV9zZWdtZW50X2Zvcl9zZWN0aW9ucyB0dl91bmlxdWVfc2VnbWVudF9mb3Jfc2Vj dGlvbnM7CiAgICBsZF9wbHVnaW5fZ2V0X2lucHV0X3NlY3Rpb25fYWxpZ25tZW50IHR2X2dldF9p bnB1dF9zZWN0aW9uX2FsaWdubWVudDsKICAgIGxkX3BsdWdpbl9nZXRfaW5wdXRfc2VjdGlvbl9z aXplIHR2X2dldF9pbnB1dF9zZWN0aW9uX3NpemU7CiAgICBsZF9wbHVnaW5fcmVnaXN0ZXJfbmV3 X2lucHV0IHR2X3JlZ2lzdGVyX25ld19pbnB1dDsKICAgIGxkX3BsdWdpbl9nZXRfd3JhcF9zeW1i b2xzIHR2X2dldF93cmFwX3N5bWJvbHM7CiAgICBsZF9wbHVnaW5fZ2V0X2FwaV92ZXJzaW9uIHR2 X2dldF9hcGlfdmVyc2lvbjsKICB9IHR2X3U7Cn07CgovKiBUaGUgcGx1Z2luIGxpYnJhcnkncyAi b25sb2FkIiBlbnRyeSBwb2ludC4gICovCgp0eXBlZGVmCmVudW0gbGRfcGx1Z2luX3N0YXR1cwoo KmxkX3BsdWdpbl9vbmxvYWQpIChzdHJ1Y3QgbGRfcGx1Z2luX3R2ICp0dik7CgojaWZkZWYgX19j cGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiAhZGVmaW5lZChQTFVHSU5fQVBJX0gpICovCg== --0000000000008563740647949621--