This is an automated email from the ASF dual-hosted git repository. cmcfarlen pushed a commit to branch 10.2.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 825e293b3daa4cc393a04a2485355ee91743121c Author: Bryan Call <[email protected]> AuthorDate: Mon Mar 2 10:57:27 2026 -0800 Fix: Handle EBADF in synserver accept instead of aborting (#12930) * Handle EVENT_ERROR + EBADF gracefully in synserver_vc_accept and synserver_vc_refuse -- when the listening socket is closed during test teardown, log via Dbg and return instead of calling ink_abort. * Preserve ink_abort for all other unexpected events/errnos so new failure modes aren't silently swallowed. Fixes intermittent regression suite crash on shared port 3300 where EXCLUSIVE_REGRESSION_TEST teardown races with a pending accept. (cherry picked from commit 4991e77e518319ba6b54ed25f192486cf9d6f1f4) --- src/api/InkAPITest.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/api/InkAPITest.cc b/src/api/InkAPITest.cc index 872bc49ebd..eac60ccd3f 100644 --- a/src/api/InkAPITest.cc +++ b/src/api/InkAPITest.cc @@ -893,8 +893,13 @@ 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<intptr_t>(data); + // Listening socket closed by synserver_stop while accept was pending. + if (event == TS_EVENT_ERROR && data_val == -EBADF) { + 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<int>(-data_val); ink_abort("synserver_vc_refuse: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err); @@ -923,8 +928,13 @@ 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<intptr_t>(data); + // Listening socket closed by synserver_stop while accept was pending. + if (event == TS_EVENT_ERROR && data_val == -EBADF) { + 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<int>(-data_val); ink_abort("synserver_vc_accept: unexpected event %d, accept errno: %s (%d)", event, strerror(err), err);
