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 <pdoijode@nvidia.com>
This commit is contained in:
Pooja Jagadeesh Doijode 2025-04-24 11:27:53 -07:00
parent 12e95e5cb0
commit 7a935bb1ad

View file

@ -895,19 +895,20 @@ void zserv_release_client(struct zserv *client)
*/ */
static void zserv_accept(struct event *thread) static void zserv_accept(struct event *thread)
{ {
int accept_sock;
int client_sock; int client_sock;
struct sockaddr_in client; struct sockaddr_in client;
socklen_t len; socklen_t len;
accept_sock = EVENT_FD(thread); if (zsock < 0) {
/* Return if this event pops after zsock is closed. */
return;
}
/* Reregister myself. */ /* Reregister myself. */
zserv_event(NULL, ZSERV_ACCEPT); zserv_event(NULL, ZSERV_ACCEPT);
len = sizeof(struct sockaddr_in); 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) { if (client_sock < 0) {
flog_err_sys(EC_LIB_SOCKET, "Can't accept zebra socket: %s", flog_err_sys(EC_LIB_SOCKET, "Can't accept zebra socket: %s",
safe_strerror(errno)); safe_strerror(errno));