From: Pooja Jagadeesh Doijode Date: Thu, 24 Apr 2025 18:27:53 +0000 (-0700) Subject: zebra: Change zserv_accept to use global zsock FD X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=refs%2Fpull%2F18704%2Fhead;p=mirror%2Ffrr.git zebra: Change zserv_accept to use global zsock FD Problem: Zebra crashed while going down. This happened because zebra was trying to process a new client accept request after closing ZAPI's listener socket zsock and setting it to -1. Fix: Skip rescheduling zserv_accept() and accepting a new client if global ZAPI listener socket FD, zsock is already closed and set to -1. Also use global ZAPI listener socket FD zsock in zserv_accept() instead of using a copy of zsock. Signed-off-by: Pooja Jagadeesh Doijode --- diff --git a/zebra/zserv.c b/zebra/zserv.c index aab1bd0062..228756a843 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -895,19 +895,20 @@ void zserv_release_client(struct zserv *client) */ static void zserv_accept(struct event *thread) { - int accept_sock; int client_sock; struct sockaddr_in client; socklen_t len; - accept_sock = EVENT_FD(thread); + if (zsock < 0) { + /* Return if this event pops after zsock is closed. */ + return; + } /* Reregister myself. */ zserv_event(NULL, ZSERV_ACCEPT); len = sizeof(struct sockaddr_in); - client_sock = accept(accept_sock, (struct sockaddr *)&client, &len); - + client_sock = accept(zsock, (struct sockaddr *)&client, &len); if (client_sock < 0) { flog_err_sys(EC_LIB_SOCKET, "Can't accept zebra socket: %s", safe_strerror(errno));