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--