teamd: tdport has to exist if item->per_port is set in __find_by_item_path
diff mbox series

Message ID 1c250a41df7bedb3ede446d891a317b491df092f.1554106524.git.lucien.xin@gmail.com
State New
Headers show
Series
  • teamd: tdport has to exist if item->per_port is set in __find_by_item_path
Related show

Commit Message

Xin Long April 1, 2019, 8:15 a.m. UTC
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 <lucien.xin@gmail.com>
---
 teamd/teamd_state.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Jiri Pirko April 17, 2019, 7:39 a.m. UTC | #1
Mon, Apr 01, 2019 at 10:15:24AM CEST, lucien.xin@gmail.com wrote:
>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 <lucien.xin@gmail.com>

applied, thanks!

Patch
diff mbox series

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;