summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/cmd-queue.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2019-12-19 09:22:33 +0000
committernicm <nicm@openbsd.org>2019-12-19 09:22:33 +0000
commit95cd24f8dbded881b37e8ba692d540872d4281ec (patch)
tree1f3caee76b89a0a66b0df6f3f31be3e26cada972 /usr.bin/tmux/cmd-queue.c
parentUse bus_size_t as the type for the base address. (diff)
downloadwireguard-openbsd-95cd24f8dbded881b37e8ba692d540872d4281ec.tar.xz
wireguard-openbsd-95cd24f8dbded881b37e8ba692d540872d4281ec.zip
When adding a list with multiple commands to the queue, the next item to
insert after needs to be the last one added, not the first. Reported by Jason Kim in GitHub issue 2023.
Diffstat (limited to 'usr.bin/tmux/cmd-queue.c')
-rw-r--r--usr.bin/tmux/cmd-queue.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c
index d03788d6c04..e06a4c0af98 100644
--- a/usr.bin/tmux/cmd-queue.c
+++ b/usr.bin/tmux/cmd-queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-queue.c,v 1.77 2019/12/17 11:43:23 nicm Exp $ */
+/* $OpenBSD: cmd-queue.c,v 1.78 2019/12/19 09:22:33 nicm Exp $ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -53,12 +53,16 @@ cmdq_get(struct client *c)
}
/* Append an item. */
-void
+struct cmdq_item *
cmdq_append(struct client *c, struct cmdq_item *item)
{
struct cmdq_list *queue = cmdq_get(c);
struct cmdq_item *next;
+ TAILQ_FOREACH(next, queue, entry) {
+ log_debug("%s %s: queue %s (%u)", __func__, cmdq_name(c),
+ next->name, next->group);
+ }
do {
next = item->next;
item->next = NULL;
@@ -73,16 +77,21 @@ cmdq_append(struct client *c, struct cmdq_item *item)
item = next;
} while (item != NULL);
+ return (TAILQ_LAST(queue, cmdq_list));
}
/* Insert an item. */
-void
+struct cmdq_item *
cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item)
{
struct client *c = after->client;
struct cmdq_list *queue = after->queue;
struct cmdq_item *next;
+ TAILQ_FOREACH(next, queue, entry) {
+ log_debug("%s %s: queue %s (%u)", __func__, cmdq_name(c),
+ next->name, next->group);
+ }
do {
next = item->next;
item->next = after->next;
@@ -100,6 +109,7 @@ cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item)
after = item;
item = next;
} while (item != NULL);
+ return (after);
}
/* Insert a hook. */
@@ -143,11 +153,10 @@ cmdq_insert_hook(struct session *s, struct cmdq_item *item,
new_item = cmdq_get_command(cmdlist, fs, NULL, CMDQ_NOHOOKS);
cmdq_format(new_item, "hook", "%s", name);
- if (item != NULL) {
- cmdq_insert_after(item, new_item);
- item = new_item;
- } else
- cmdq_append(NULL, new_item);
+ if (item != NULL)
+ item = cmdq_insert_after(item, new_item);
+ else
+ item = cmdq_append(NULL, new_item);
a = options_array_next(a);
}