[PATCH] Cygwin: autoload: fix ws2_32 chained init on AArch64

Chandru Kumaresan <[email protected]> Tue, 7 Jul 2026 09:31:25 +0000
Newsgroups gmane.os.cygwin.patches
Message-ID <PN0P287MB0295C357517BE127B601D99092F02@PN0P287MB0295.INDP287.PROD.OUTLOOK.COM>
--_004_PN0P287MB0295C357517BE127B601D99092F02PN0P287MB0295INDP_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi everyone,

On AArch64, the autoload INIT_WRAPPER passes func_info* via x30 ("mov
x0, x30").  This works for the first init stage (std_dll_init), reached
by the trampoline's "blr".  It breaks for a chained second init, because
dll_chain reaches it via "br x1" without updating x30.

ws2_32 is the only DLL with such a chain (std_dll_init -> wsock_init ->
dll_func_load).  wsock_init received garbage in x0, so WSAStartup was
never called; every ws2_32 call failed with WSANOTINITIALISED / EFAULT.

dll_chain also runs twice for ws2_32, pushing a 16-byte frame each time.
wsock_init consumes its arg from x30, not the stack, so the first frame
strands.  dll_func_load then restores caller-save registers from a
shifted offset, corrupting the first call's arguments.

Fix: copy func_info into x30 in dll_chain before the tail-branch, and
give AArch64 a dedicated _wsock_init wrapper that drops the stranded
frame ("add sp, sp, #16") before chaining to dll_func_load.

Inline Patch

---
 winsup/cygwin/autoload.cc | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 7054511b6..8d0f2a59e 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -302,6 +302,10 @@ dll_func_load:                                        =
   \n\
   .global    dll_chain                                   \n\
 dll_chain:                                               \n\
   stp        x0, xzr, [sp, #-16]! // x0 =3D func_info* (=3D ret.high); pus=
h for dll_func_load\n\
+  mov        x30, x0              // also pass func_info in x30: a chained=
 INIT_WRAPPER\n\
+                                  // (e.g. _wsock_init) reads its arg from=
 x30, but is\n\
+                                  // reached here via 'br' which would oth=
erwise leave\n\
+                                  // x30 stale.  dll_func_load ignores x30=
 (reads [sp]).\n\
   br         x1                   // x1 =3D dll->init (=3D ret.low); tail-=
call resolver\n\
 ");
 #else
@@ -481,9 +485,29 @@ std_dll_init (struct func_info *func)

 /* Initialization function for winsock stuff. */

-#if defined(__x86_64__) || defined(__aarch64__)
-/* See above comment preceeding std_dll_init. */
+#if defined(__x86_64__)
+/* See above comment preceding std_dll_init. */
 INIT_WRAPPER (wsock_init)
+#elif defined(__aarch64__)
+__asm__("\n\
+  .text                                                  \n\
+  .p2align 2                                             \n\
+  .seh_proc _wsock_init                                  \n\
+_wsock_init:                                             \n\
+  stp        x29, x30, [sp, #-16]!  // save fp/lr, open our 16-byte frame\=
n\
+  .seh_save_fplr_x 16                                   \n\
+  .seh_endprologue                                      \n\
+  mov        x0, x30              // x0 =3D func_info  (the wsock_init() a=
rgument)\n\
+  bl         wsock_init           // run WSAStartup; returns x0=3Dfunc_inf=
o, x1=3Ddll_func_load\n\
+  ldp        x29, xzr, [sp], #16  // restore fp, discard saved lr, close o=
ur frame\n\
+  add        sp, sp, #16          // drop the stranded dll_chain frame so =
the\n\
+                                  // downstream dll_func_load sees exactly=
 one\n\
+                                  // dll_chain frame above the trampoline =
frame\n\
+  adrp       x30, dll_chain       // x30 =3D &dll_chain ...\n\
+  add        x30, x30, #:lo12:dll_chain  // ... so the 'ret' below tail-ch=
ains there\n\
+  ret                             // -> dll_chain, which tail-calls x1 (dl=
l_func_load)\n\
+  .seh_endproc                                          \n\
+");
 #else
 #error unimplemented for this target
 #endif
--
2.49.0.windows.1




--_004_PN0P287MB0295C357517BE127B601D99092F02PN0P287MB0295INDP_
Content-Type: application/octet-stream;
	name="Cygwin-autoload-fix-ws2_32-chained-init-on-AArch64.patch"
Content-Description: Cygwin-autoload-fix-ws2_32-chained-init-on-AArch64.patch
Content-Disposition: attachment;
	filename="Cygwin-autoload-fix-ws2_32-chained-init-on-AArch64.patch";
	size=4017; creation-date="Tue, 07 Jul 2026 09:30:29 GMT";
	modification-date="Tue, 07 Jul 2026 09:31:25 GMT"
Content-Transfer-Encoding: base64

RnJvbSBkNDA2NmJmN2Y2MWIzOWZiMjkxMjA0YTA2YTlhZTIwNzMwNzJhN2Y4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBjaGFuZHJ1LW1jdyA8Y2hhbmRydS5rdW1hcmVzYW5AbXVsdGlj
b3Jld2FyZWluYy5jb20+CkRhdGU6IE1vbiwgNiBKdWwgMjAyNiAxMjozMjowMyArMDUzMApTdWJq
ZWN0OiBbUEFUQ0hdIEN5Z3dpbjogYXV0b2xvYWQ6IGZpeCB3czJfMzIgY2hhaW5lZCBpbml0IG9u
IEFBcmNoNjQKCk9uIEFBcmNoNjQsIHRoZSBhdXRvbG9hZCBJTklUX1dSQVBQRVIgcGFzc2VzIGZ1
bmNfaW5mbyogdmlhIHgzMCAoIm1vdgp4MCwgeDMwIikuICBUaGlzIHdvcmtzIGZvciB0aGUgZmly
c3QgaW5pdCBzdGFnZSAoc3RkX2RsbF9pbml0KSwgcmVhY2hlZApieSB0aGUgdHJhbXBvbGluZSdz
ICJibHIiLiAgSXQgYnJlYWtzIGZvciBhIGNoYWluZWQgc2Vjb25kIGluaXQsIGJlY2F1c2UKZGxs
X2NoYWluIHJlYWNoZXMgaXQgdmlhICJiciB4MSIgd2l0aG91dCB1cGRhdGluZyB4MzAuCgp3czJf
MzIgaXMgdGhlIG9ubHkgRExMIHdpdGggc3VjaCBhIGNoYWluIChzdGRfZGxsX2luaXQgLT4gd3Nv
Y2tfaW5pdCAtPgpkbGxfZnVuY19sb2FkKS4gIHdzb2NrX2luaXQgcmVjZWl2ZWQgZ2FyYmFnZSBp
biB4MCwgc28gV1NBU3RhcnR1cCB3YXMKbmV2ZXIgY2FsbGVkOyBldmVyeSB3czJfMzIgY2FsbCBm
YWlsZWQgd2l0aCBXU0FOT1RJTklUSUFMSVNFRCAvIEVGQVVMVC4KCmRsbF9jaGFpbiBhbHNvIHJ1
bnMgdHdpY2UgZm9yIHdzMl8zMiwgcHVzaGluZyBhIDE2LWJ5dGUgZnJhbWUgZWFjaCB0aW1lLgp3
c29ja19pbml0IGNvbnN1bWVzIGl0cyBhcmcgZnJvbSB4MzAsIG5vdCB0aGUgc3RhY2ssIHNvIHRo
ZSBmaXJzdCBmcmFtZQpzdHJhbmRzLiAgZGxsX2Z1bmNfbG9hZCB0aGVuIHJlc3RvcmVzIGNhbGxl
ci1zYXZlIHJlZ2lzdGVycyBmcm9tIGEKc2hpZnRlZCBvZmZzZXQsIGNvcnJ1cHRpbmcgdGhlIGZp
cnN0IGNhbGwncyBhcmd1bWVudHMuCgpGaXg6IGNvcHkgZnVuY19pbmZvIGludG8geDMwIGluIGRs
bF9jaGFpbiBiZWZvcmUgdGhlIHRhaWwtYnJhbmNoLCBhbmQKZ2l2ZSBBQXJjaDY0IGEgZGVkaWNh
dGVkIF93c29ja19pbml0IHdyYXBwZXIgdGhhdCBkcm9wcyB0aGUgc3RyYW5kZWQKZnJhbWUgKCJh
ZGQgc3AsIHNwLCAjMTYiKSBiZWZvcmUgY2hhaW5pbmcgdG8gZGxsX2Z1bmNfbG9hZC4KClNpZ25l
ZC1vZmYtYnk6IENoYW5kcnUgS3VtYXJlc2FuIDxjaGFuZHJ1Lmt1bWFyZXNhbkBtdWx0aWNvcmV3
YXJlaW5jLmNvbT4KLS0tCiB3aW5zdXAvY3lnd2luL2F1dG9sb2FkLmNjIHwgMjggKysrKysrKysr
KysrKysrKysrKysrKysrKystLQogMSBmaWxlIGNoYW5nZWQsIDI2IGluc2VydGlvbnMoKyksIDIg
ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvd2luc3VwL2N5Z3dpbi9hdXRvbG9hZC5jYyBiL3dp
bnN1cC9jeWd3aW4vYXV0b2xvYWQuY2MKaW5kZXggNzA1NDUxMWI2Li44ZDBmMmE1OWUgMTAwNjQ0
Ci0tLSBhL3dpbnN1cC9jeWd3aW4vYXV0b2xvYWQuY2MKKysrIGIvd2luc3VwL2N5Z3dpbi9hdXRv
bG9hZC5jYwpAQCAtMzAyLDYgKzMwMiwxMCBAQCBkbGxfZnVuY19sb2FkOiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblwKICAgLmdsb2JhbCAgICBkbGxfY2hhaW4g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAogZGxsX2NoYWluOiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCiAgIHN0cCAgICAgICAg
eDAsIHh6ciwgW3NwLCAjLTE2XSEgLy8geDAgPSBmdW5jX2luZm8qICg9IHJldC5oaWdoKTsgcHVz
aCBmb3IgZGxsX2Z1bmNfbG9hZFxuXAorICBtb3YgICAgICAgIHgzMCwgeDAgICAgICAgICAgICAg
IC8vIGFsc28gcGFzcyBmdW5jX2luZm8gaW4geDMwOiBhIGNoYWluZWQgSU5JVF9XUkFQUEVSXG5c
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gX3dzb2NrX2luaXQp
IHJlYWRzIGl0cyBhcmcgZnJvbSB4MzAsIGJ1dCBpc1xuXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHJlYWNoZWQgaGVyZSB2aWEgJ2JyJyB3aGljaCB3b3VsZCBvdGhlcndp
c2UgbGVhdmVcblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4MzAgc3Rh
bGUuICBkbGxfZnVuY19sb2FkIGlnbm9yZXMgeDMwIChyZWFkcyBbc3BdKS5cblwKICAgYnIgICAg
ICAgICB4MSAgICAgICAgICAgICAgICAgICAvLyB4MSA9IGRsbC0+aW5pdCAoPSByZXQubG93KTsg
dGFpbC1jYWxsIHJlc29sdmVyXG5cCiAiKTsKICNlbHNlCkBAIC00ODEsOSArNDg1LDI5IEBAIHN0
ZF9kbGxfaW5pdCAoc3RydWN0IGZ1bmNfaW5mbyAqZnVuYykKIAogLyogSW5pdGlhbGl6YXRpb24g
ZnVuY3Rpb24gZm9yIHdpbnNvY2sgc3R1ZmYuICovCiAKLSNpZiBkZWZpbmVkKF9feDg2XzY0X18p
IHx8IGRlZmluZWQoX19hYXJjaDY0X18pCi0vKiBTZWUgYWJvdmUgY29tbWVudCBwcmVjZWVkaW5n
IHN0ZF9kbGxfaW5pdC4gKi8KKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisvKiBTZWUgYWJvdmUg
Y29tbWVudCBwcmVjZWRpbmcgc3RkX2RsbF9pbml0LiAqLwogSU5JVF9XUkFQUEVSICh3c29ja19p
bml0KQorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKK19fYXNtX18oIlxuXAorICAudGV4dCAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCisgIC5w
MmFsaWduIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblwK
KyAgLnNlaF9wcm9jIF93c29ja19pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFxuXAorX3dzb2NrX2luaXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXG5cCisgIHN0cCAgICAgICAgeDI5LCB4MzAsIFtzcCwgIy0xNl0hICAvLyBzYXZlIGZw
L2xyLCBvcGVuIG91ciAxNi1ieXRlIGZyYW1lXG5cCisgIC5zZWhfc2F2ZV9mcGxyX3ggMTYgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAorICAuc2VoX2VuZHByb2xvZ3VlICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblwKKyAgbW92ICAgICAgICB4MCwg
eDMwICAgICAgICAgICAgICAvLyB4MCA9IGZ1bmNfaW5mbyAgKHRoZSB3c29ja19pbml0KCkgYXJn
dW1lbnQpXG5cCisgIGJsICAgICAgICAgd3NvY2tfaW5pdCAgICAgICAgICAgLy8gcnVuIFdTQVN0
YXJ0dXA7IHJldHVybnMgeDA9ZnVuY19pbmZvLCB4MT1kbGxfZnVuY19sb2FkXG5cCisgIGxkcCAg
ICAgICAgeDI5LCB4enIsIFtzcF0sICMxNiAgLy8gcmVzdG9yZSBmcCwgZGlzY2FyZCBzYXZlZCBs
ciwgY2xvc2Ugb3VyIGZyYW1lXG5cCisgIGFkZCAgICAgICAgc3AsIHNwLCAjMTYgICAgICAgICAg
Ly8gZHJvcCB0aGUgc3RyYW5kZWQgZGxsX2NoYWluIGZyYW1lIHNvIHRoZVxuXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gZGxsX2Z1bmNfbG9hZCBzZWVz
IGV4YWN0bHkgb25lXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGxs
X2NoYWluIGZyYW1lIGFib3ZlIHRoZSB0cmFtcG9saW5lIGZyYW1lXG5cCisgIGFkcnAgICAgICAg
eDMwLCBkbGxfY2hhaW4gICAgICAgLy8geDMwID0gJmRsbF9jaGFpbiAuLi5cblwKKyAgYWRkICAg
ICAgICB4MzAsIHgzMCwgIzpsbzEyOmRsbF9jaGFpbiAgLy8gLi4uIHNvIHRoZSAncmV0JyBiZWxv
dyB0YWlsLWNoYWlucyB0aGVyZVxuXAorICByZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIC0+IGRsbF9jaGFpbiwgd2hpY2ggdGFpbC1jYWxscyB4MSAoZGxsX2Z1bmNfbG9hZClcblwK
KyAgLnNlaF9lbmRwcm9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XG5cCisiKTsKICNlbHNlCiAjZXJyb3IgdW5pbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQKICNl
bmRpZgotLSAKMi40OS4wLndpbmRvd3MuMQoK

--_004_PN0P287MB0295C357517BE127B601D99092F02PN0P287MB0295INDP_--