Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9ab162f authored by Colin Cross's avatar Colin Cross
Browse files

init: prevent action being added to the action_queue twice

Property triggers may cause an action to be queued twice, resulting
in a loop in the action queue.  Keep actions that are not on the queue
in the list_empty state (act->qlist->next == act->qlist), and only
add them to the list if they are in that state.

Bug: 8335133
Change-Id: I3a3ec18176cf19cbaa3a45220a03c7560eacfe79
parent 59fa7e10
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -571,6 +571,7 @@ void queue_builtin_action(int (*func)(int nargs, char **args), char *name)
    act = calloc(1, sizeof(*act));
    act->name = name;
    list_init(&act->commands);
    list_init(&act->qlist);

    cmd = calloc(1, sizeof(*cmd));
    cmd->func = func;
@@ -583,8 +584,10 @@ void queue_builtin_action(int (*func)(int nargs, char **args), char *name)

void action_add_queue_tail(struct action *act)
{
    if (list_empty(&act->qlist)) {
        list_add_tail(&action_queue, &act->qlist);
    }
}

struct action *action_remove_queue_head(void)
{
@@ -594,6 +597,7 @@ struct action *action_remove_queue_head(void)
        struct listnode *node = list_head(&action_queue);
        struct action *act = node_to_item(node, struct action, qlist);
        list_remove(node);
        list_init(node);
        return act;
    }
}
@@ -825,6 +829,7 @@ static void *parse_action(struct parse_state *state, int nargs, char **args)
    act = calloc(1, sizeof(*act));
    act->name = args[1];
    list_init(&act->commands);
    list_init(&act->qlist);
    list_add_tail(&action_list, &act->alist);
        /* XXX add to hash */
    return act;