]> git.puffer.fish Git - mirror/frr.git/commitdiff
mgmtd: don't try to send config to disconnected clients 15134/head
authorIgor Ryzhov <iryzhov@nfware.com>
Thu, 11 Jan 2024 18:58:09 +0000 (20:58 +0200)
committerIgor Ryzhov <iryzhov@nfware.com>
Thu, 11 Jan 2024 20:56:42 +0000 (22:56 +0200)
When determining the interested backend clients for a configuration
change, don't consider disconnected clients. This fixes a crash in
`mgmt_txn_send_be_txn_create` when trying to send data to a non-existing
adapter.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
mgmtd/mgmt_txn.c

index 297482f0154867dcf142e1706d6d6f50b79702a1..998e5a38334395c1abb5209280e02f21abd09edf 100644 (file)
@@ -850,10 +850,9 @@ static int mgmt_txn_create_config_batches(struct mgmt_txn_req *txn_req,
        enum mgmt_be_client_id id;
        struct mgmt_be_client_adapter *adapter;
        struct mgmt_commit_cfg_req *cmtcfg_req;
-       bool found_validator;
        int num_chgs = 0;
        int xpath_len, value_len;
-       uint64_t clients;
+       uint64_t clients, chg_clients;
 
        cmtcfg_req = &txn_req->req.commit_cfg;
 
@@ -881,11 +880,8 @@ static int mgmt_txn_create_config_batches(struct mgmt_txn_req *txn_req,
                              value ? value : "NIL");
 
                clients = mgmt_be_interested_clients(xpath, true);
-               cmtcfg_req->clients |= clients;
-               if (clients)
-                       found_validator = true;
-               else
-                       found_validator = false;
+
+               chg_clients = 0;
 
                xpath_len = strlen(xpath) + 1;
                value_len = strlen(value) + 1;
@@ -894,6 +890,8 @@ static int mgmt_txn_create_config_batches(struct mgmt_txn_req *txn_req,
                        if (!adapter)
                                continue;
 
+                       chg_clients |= (1ull << id);
+
                        batch = cmtcfg_req->last_be_cfg_batch[id];
                        if (!batch ||
                            (batch->num_cfg_data ==
@@ -940,13 +938,15 @@ static int mgmt_txn_create_config_batches(struct mgmt_txn_req *txn_req,
                        num_chgs++;
                }
 
-               if (!found_validator) {
+               if (!chg_clients) {
                        snprintf(err_buf, sizeof(err_buf),
                                 "No validator module found for XPATH: '%s",
                                 xpath);
                        MGMTD_TXN_ERR("***** %s", err_buf);
                }
 
+               cmtcfg_req->clients |= chg_clients;
+
                free(xpath);
        }