From fa4b0f291d93471cf321ba6dbf2bd71fcb02213d Mon Sep 17 00:00:00 2001 From: Bryan Call Date: Fri, 27 Feb 2026 15:58:18 -0800 Subject: [PATCH 1/2] Handle EBADF in synserver accept instead of aborting When the listening socket is closed by synserver_stop while the accept is still pending, net_accept sends EVENT_ERROR with -EBADF. Instead of calling ink_abort (which crashes the regression suite), log a warning and return gracefully. Other unexpected events still abort. This race occurs because multiple EXCLUSIVE_REGRESSION_TEST tests share port 3300 and their teardown can overlap with a pending accept. --- src/api/InkAPITest.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/api/InkAPITest.cc b/src/api/InkAPITest.cc index 872bc49ebd2..04230493720 100644 --- a/src/api/InkAPITest.cc +++ b/src/api/InkAPITest.cc @@ -893,8 +893,12 @@ static int synserver_vc_refuse(TSCont contp, TSEvent event, void *data) { if (event != TS_EVENT_NET_ACCEPT && event != TS_EVENT_NET_ACCEPT_FAILED) { - // net_accept() passes negated errno as data on EVENT_ERROR; Linux MAX_ERRNO is 4095 intptr_t data_val = reinterpret_cast(data); + // Listening socket closed by synserver_stop while accept was pending. + if (event == TS_EVENT_ERROR && data_val == -EBADF) { + Warning("synserver_vc_refuse: accept got EBADF, listener likely shut down"); + return TS_EVENT_IMMEDIATE; + } if (data_val < 0 && data_val >= -4095) { int err = static_cast(-data_val); ink_abort("synserver_vc_refuse: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err); @@ -923,8 +927,12 @@ static int synserver_vc_accept(TSCont contp, TSEvent event, void *data) { if (event != TS_EVENT_NET_ACCEPT && event != TS_EVENT_NET_ACCEPT_FAILED) { - // net_accept() passes negated errno as data on EVENT_ERROR; Linux MAX_ERRNO is 4095 intptr_t data_val = reinterpret_cast(data); + // Listening socket closed by synserver_stop while accept was pending. + if (event == TS_EVENT_ERROR && data_val == -EBADF) { + Warning("synserver_vc_accept: accept got EBADF, listener likely shut down"); + return TS_EVENT_IMMEDIATE; + } if (data_val < 0 && data_val >= -4095) { int err = static_cast(-data_val); ink_abort("synserver_vc_accept: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err); From b17b19514b545da6bb03bf750ec01e9807c0fd5f Mon Sep 17 00:00:00 2001 From: Bryan Call Date: Fri, 27 Feb 2026 16:11:07 -0800 Subject: [PATCH 2/2] Address review feedback: Dbg instead of Warning, restore comment Switch EBADF handling from Warning() to Dbg(dbg_ctl_SockServer, ...) since this is an expected teardown race and Warning is too noisy. Restore the comment explaining the -4095 Linux MAX_ERRNO guard. --- src/api/InkAPITest.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/api/InkAPITest.cc b/src/api/InkAPITest.cc index 04230493720..eac60ccd3fc 100644 --- a/src/api/InkAPITest.cc +++ b/src/api/InkAPITest.cc @@ -896,9 +896,10 @@ synserver_vc_refuse(TSCont contp, TSEvent event, void *data) intptr_t data_val = reinterpret_cast(data); // Listening socket closed by synserver_stop while accept was pending. if (event == TS_EVENT_ERROR && data_val == -EBADF) { - Warning("synserver_vc_refuse: accept got EBADF, listener likely shut down"); + Dbg(dbg_ctl_SockServer, "synserver_vc_refuse: accept got EBADF, listener likely shut down"); return TS_EVENT_IMMEDIATE; } + // net_accept() passes negated errno as data on EVENT_ERROR; Linux MAX_ERRNO is 4095 if (data_val < 0 && data_val >= -4095) { int err = static_cast(-data_val); ink_abort("synserver_vc_refuse: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err); @@ -930,9 +931,10 @@ synserver_vc_accept(TSCont contp, TSEvent event, void *data) intptr_t data_val = reinterpret_cast(data); // Listening socket closed by synserver_stop while accept was pending. if (event == TS_EVENT_ERROR && data_val == -EBADF) { - Warning("synserver_vc_accept: accept got EBADF, listener likely shut down"); + Dbg(dbg_ctl_SockServer, "synserver_vc_accept: accept got EBADF, listener likely shut down"); return TS_EVENT_IMMEDIATE; } + // net_accept() passes negated errno as data on EVENT_ERROR; Linux MAX_ERRNO is 4095 if (data_val < 0 && data_val >= -4095) { int err = static_cast(-data_val); ink_abort("synserver_vc_accept: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err);