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