mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
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:
parent
12e95e5cb0
commit
7a935bb1ad
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue