]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: mgmtd: avoid recursion with vty_close and add error log
authorChristian Hopps <chopps@labn.net>
Mon, 12 Jun 2023 02:19:54 +0000 (22:19 -0400)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 22 Jun 2023 21:56:44 +0000 (21:56 +0000)
Avoid recursion into vty_close() when being notified of a session closure that
happened inside vty_close().

If a vty is closed with outstanding config yet to be commited
issue a warning that it is being lost.

Signed-off-by: Christian Hopps <chopps@labn.net>
(cherry picked from commit 4307fdd07047dc2f7c9daef7a74af6cddf635c34)

lib/vty.c

index fedbdbb81316124edad18731bb909fad581acd41..cbf42de4730b83b9479398f8278771859d2474c0 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -2423,6 +2423,14 @@ void vty_close(struct vty *vty)
 
        vty->status = VTY_CLOSE;
 
+       /*
+        * If we reach here with pending config to commit we will be losing it
+        * so warn the user.
+        */
+       if (vty->mgmt_num_pending_setcfg)
+               MGMTD_FE_CLIENT_ERR(
+                       "vty closed, uncommitted config will be lost.");
+
        if (mgmt_fe_client && vty->mgmt_session_id) {
                MGMTD_FE_CLIENT_DBG("closing vty session");
                mgmt_fe_destroy_client_session(mgmt_fe_client,
@@ -3445,7 +3453,9 @@ static void vty_mgmt_session_notify(struct mgmt_fe_client *client,
                vty->mgmt_session_id = session_id;
        } else {
                vty->mgmt_session_id = 0;
-               vty_close(vty);
+               /* We may come here by way of vty_close() and short-circuits */
+               if (vty->status != VTY_CLOSE)
+                       vty_close(vty);
        }
 }