From 4dc3a7a042c88193f0371a33f1043919843e6447 Mon Sep 17 00:00:00 2001 From: Xin Long Date: Mon, 1 Apr 2019 16:15:24 +0800 Subject: [PATCH 2/3] teamd: tdport has to exist if item->per_port is set in __find_by_item_path The issue can be reproduced by: # teamd -c '{"device":"team0", "runner":{"name":"lacp"}}' & # teamdctl team0 state item set runner.aggregator.selected true teamd process will abort in lacp_port_state_aggregator_selected_set() as gsc->info.tdport was set to NULL in teamd_state_item_value_set() The item 'runner.aggregator.selected' is of per_port = true, and it shouldn't allow to call its setter/getter(). This patch is to add the check for it in __find_by_item_path() called by teamd_state_item_value_get/set(). Fixes: 6c00aaf02553 ("teamd: add support for state item write operation") Signed-off-by: Xin Long Signed-off-by: Jiri Pirko --- teamd/teamd_state.c | 1 + 1 file changed, 1 insertion(+) diff --git a/teamd/teamd_state.c b/teamd/teamd_state.c index ab64db9..0714880 100644 --- a/teamd/teamd_state.c +++ b/teamd/teamd_state.c @@ -333,6 +333,7 @@ static int __find_by_item_path(struct teamd_state_val_item **p_item, list_for_each_node_entry(item, &ctx->state_val_list, list) { /* item->subpath[0] == '.' */ if (!strcmp(item->subpath + 1, subpath) && + (!item->per_port || tdport) && (!item->tdport || item->tdport == tdport)) { *p_item = item; *p_tdport = tdport; -- 2.18.1