]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Change zserv_accept to use global zsock FD 18704/head
authorPooja Jagadeesh Doijode <pdoijode@nvidia.com>
Thu, 24 Apr 2025 18:27:53 +0000 (11:27 -0700)
committerPooja Jagadeesh Doijode <pdoijode@nvidia.com>
Sat, 26 Apr 2025 03:27:38 +0000 (20:27 -0700)
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>
zebra/zserv.c

index aab1bd0062f3285d127df420fd94ef0468a27661..228756a843175ce1cc48ab968eb26c85eb7513d8 100644 (file)
@@ -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));