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

Reply via email to