This is an automated email from the ASF dual-hosted git repository.
bcall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new 4991e77e51 Fix: Handle EBADF in synserver accept instead of aborting
(#12930)
4991e77e51 is described below
commit 4991e77e518319ba6b54ed25f192486cf9d6f1f4
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.
---
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);