]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
CLI closing fix when its action is run asynchronously.
authorMaria Matejka <mq@ucw.cz>
Thu, 19 Jan 2023 09:53:09 +0000 (10:53 +0100)
committerMaria Matejka <mq@ucw.cz>
Thu, 19 Jan 2023 10:03:31 +0000 (11:03 +0100)
Some CLI actions, notably "show route", are run by queuing an event
somewhere else. If the user closes the socket, in case such an action is
being executed, the CLI must free the socket immediately from the error
hook but the pool must remain until the asynchronous event finishes and
cleans everything up.

nest/cli.c
nest/cli.h
nest/rt-show.c
sysdep/unix/main.c

index 469d45b62c4a560f1e572c5c2d06461490960677..1debfccf0e72c93643c5f1af465f9e6c8fe6cc2f 100644 (file)
@@ -307,14 +307,14 @@ cli_event(void *data)
 }
 
 cli *
-cli_new(void *priv)
+cli_new(struct birdsock *sock)
 {
   pool *p = rp_new(cli_pool, "CLI");
   cli *c = mb_alloc(p, sizeof(cli));
 
   bzero(c, sizeof(cli));
   c->pool = p;
-  c->priv = priv;
+  c->sock = sock;
   c->event = ev_new(p);
   c->event->hook = cli_event;
   c->event->data = c;
@@ -415,7 +415,12 @@ cli_free(cli *c)
   if (c == cmd_reconfig_stored_cli)
     cmd_reconfig_stored_cli = NULL;
 
-  if (!defer)
+  if (defer)
+  {
+    rfree(c->sock);
+    c->sock = NULL;
+  }
+  else
     rfree(c->pool);
 }
 
index 925729683d025a76d8e7f06696d9097d5447d450..2b96da5b74d674bed4e078b6633ac38a806d1162 100644 (file)
@@ -28,7 +28,7 @@ struct cli_out {
 typedef struct cli {
   node n;                              /* Node in list of all log hooks */
   pool *pool;
-  void *priv;                          /* Private to sysdep layer */
+  struct birdsock *sock;               /* Underlying socket */
   byte *rx_buf, *rx_pos, *rx_aux;      /* sysdep */
   struct cli_out *tx_buf, *tx_pos, *tx_write;
   event *event;
@@ -63,7 +63,7 @@ static inline void cli_separator(cli *c)
 
 /* Functions provided to sysdep layer */
 
-cli *cli_new(void *);
+cli *cli_new(struct birdsock *);
 void cli_init(void);
 void cli_free(cli *);
 void cli_kick(cli *);
index dc88047a3717894aa3c7cdf55ca25ed946bf0d80..d8eb217421f5b7379ac75c0aba44cd805991ff75 100644 (file)
@@ -233,6 +233,7 @@ static int
 rt_show_cleanup(struct cli *c)
 {
   struct rt_show_data *d = c->rover;
+  c->cleanup = NULL;
 
   /* Cancel the feed */
   if (d->req.hook)
index bf9f2be02b0dfe619cf88c80282746c0f7cf0ce1..74827d98c916b02e4581b9a54e9e1935e2bdfeaf 100644 (file)
@@ -395,7 +395,8 @@ static char *path_control_socket = PATH_CONTROL_SOCKET;
 static void
 cli_write(cli *c)
 {
-  sock *s = c->priv;
+  sock *s = c->sock;
+  ASSERT_DIE(c->sock);
 
   while (c->tx_pos)
     {
@@ -419,7 +420,9 @@ cli_write(cli *c)
 void
 cli_write_trigger(cli *c)
 {
-  sock *s = c->priv;
+  sock *s = c->sock;
+  if (!s)
+    return;
 
   if (s->tbuf == NULL)
     cli_write(c);
@@ -434,7 +437,8 @@ cli_tx(sock *s)
 int
 cli_get_command(cli *c)
 {
-  sock *s = c->priv;
+  sock *s = c->sock;
+  ASSERT_DIE(c->sock);
   byte *t = c->rx_aux ? : s->rbuf;
   byte *tend = s->rpos;
   byte *d = c->rx_pos;
@@ -477,6 +481,7 @@ cli_err(sock *s, int err)
       else
        log(L_INFO "CLI connection closed");
     }
+
   cli_free(s->data);
 }