Update of /cvsroot/tmux/tmux
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv20570
Modified Files:
cmd-bind-key.c cmd-list.c key-bindings.c tmux.c tmux.h
Log Message:
Sync OpenBSD patchset 727:
Setting the cmdlist pointer in the bind-key to NULL to prevent it being freed
after the command is executing is bogus because it may still be needed if the
same command is going to be executed again (for example if you "bind-key a
bind-key b ..."). Making a copy is hard, so instead add a reference count to
the cmd_list.
While here, also print bind-key -n and the rest of the flags properly.
Fixes problem reported by mcbr...@.
Index: cmd-bind-key.c
===================================================================
RCS file: /cvsroot/tmux/tmux/cmd-bind-key.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- cmd-bind-key.c 25 Jan 2010 17:12:44 -0000 1.28
+++ cmd-bind-key.c 2 Jul 2010 02:43:01 -0000 1.29
@@ -130,7 +130,7 @@
return (cmd_bind_key_table(self, ctx));
key_bindings_add(data->key, data->can_repeat, data->cmdlist);
- data->cmdlist = NULL; /* avoid free */
+ data->cmdlist->references++;
return (0);
}
@@ -192,8 +192,17 @@
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
+
+ if (off < len && data->command_key)
+ off += xsnprintf(buf + off, len - off, " -c");
+ if (off < len && !(data->key & KEYC_PREFIX))
+ off += xsnprintf(buf + off, len - off, " -n");
+ if (off < len && data->can_repeat)
+ off += xsnprintf(buf + off, len - off, " -r");
+ if (off < len && data->tablename != NULL)
+ off += cmd_prarg(buf + off, len - off, " -t ", data->tablename);
if (off < len) {
- skey = key_string_lookup_key(data->key);
+ skey = key_string_lookup_key(data->key & ~KEYC_PREFIX);
off += xsnprintf(buf + off, len - off, " %s ", skey);
}
if (off < len)
Index: cmd-list.c
===================================================================
RCS file: /cvsroot/tmux/tmux/cmd-list.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- cmd-list.c 18 Mar 2010 21:06:40 -0000 1.8
+++ cmd-list.c 2 Jul 2010 02:43:01 -0000 1.9
@@ -32,7 +32,8 @@
char **new_argv;
cmdlist = xmalloc(sizeof *cmdlist);
- TAILQ_INIT(cmdlist);
+ cmdlist->references = 1;
+ TAILQ_INIT(&cmdlist->list);
lastsplit = 0;
for (i = 0; i < argc; i++) {
@@ -54,7 +55,7 @@
cmd = cmd_parse(new_argc, new_argv, cause);
if (cmd == NULL)
goto bad;
- TAILQ_INSERT_TAIL(cmdlist, cmd, qentry);
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
lastsplit = i + 1;
}
@@ -63,7 +64,7 @@
cmd = cmd_parse(argc - lastsplit, argv + lastsplit, cause);
if (cmd == NULL)
goto bad;
- TAILQ_INSERT_TAIL(cmdlist, cmd, qentry);
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
}
return (cmdlist);
@@ -80,7 +81,7 @@
int n, retval;
retval = 0;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if ((n = cmd_exec(cmd, ctx)) == -1)
return (-1);
@@ -114,9 +115,12 @@
{
struct cmd *cmd;
- while (!TAILQ_EMPTY(cmdlist)) {
- cmd = TAILQ_FIRST(cmdlist);
- TAILQ_REMOVE(cmdlist, cmd, qentry);
+ if (--cmdlist->references != 0)
+ return;
+
+ while (!TAILQ_EMPTY(&cmdlist->list)) {
+ cmd = TAILQ_FIRST(&cmdlist->list);
+ TAILQ_REMOVE(&cmdlist->list, cmd, qentry);
cmd_free(cmd);
}
xfree(cmdlist);
@@ -129,7 +133,7 @@
size_t off;
off = 0;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (off >= len)
break;
off += cmd_print(cmd, buf + off, len - off);
Index: tmux.c
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.c,v
retrieving revision 1.209
retrieving revision 1.210
diff -u -d -r1.209 -r1.210
--- tmux.c 5 Jun 2010 23:56:29 -0000 1.209
+++ tmux.c 2 Jul 2010 02:43:01 -0000 1.210
@@ -520,7 +520,7 @@
exit(1);
}
cmdflags &= ~CMD_STARTSERVER;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->entry->flags & CMD_STARTSERVER)
cmdflags |= CMD_STARTSERVER;
if (cmd->entry->flags & CMD_SENDENVIRON)
Index: tmux.h
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.h,v
retrieving revision 1.564
retrieving revision 1.565
diff -u -d -r1.564 -r1.565
--- tmux.h 22 Jun 2010 23:35:20 -0000 1.564
+++ tmux.h 2 Jul 2010 02:43:01 -0000 1.565
@@ -1160,7 +1160,10 @@
TAILQ_ENTRY(cmd) qentry;
};
-TAILQ_HEAD(cmd_list, cmd);
+struct cmd_list {
+ int references;
+ TAILQ_HEAD(, cmd) list;
+};
struct cmd_entry {
const char *name;
Index: key-bindings.c
===================================================================
RCS file: /cvsroot/tmux/tmux/key-bindings.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- key-bindings.c 22 Jun 2010 23:35:20 -0000 1.93
+++ key-bindings.c 2 Jul 2010 02:43:01 -0000 1.94
@@ -178,14 +178,15 @@
for (i = 0; i < nitems(table); i++) {
cmdlist = xmalloc(sizeof *cmdlist);
- TAILQ_INIT(cmdlist);
+ TAILQ_INIT(&cmdlist->list);
+ cmdlist->references = 1;
cmd = xmalloc(sizeof *cmd);
cmd->entry = table[i].entry;
cmd->data = NULL;
if (cmd->entry->init != NULL)
cmd->entry->init(cmd, table[i].key);
- TAILQ_INSERT_HEAD(cmdlist, cmd, qentry);
+ TAILQ_INSERT_HEAD(&cmdlist->list, cmd, qentry);
key_bindings_add(
table[i].key | KEYC_PREFIX, table[i].can_repeat, cmdlist);
@@ -259,7 +260,7 @@
ctx.cmdclient = NULL;
readonly = 1;
- TAILQ_FOREACH(cmd, bd->cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &bd->cmdlist->list, qentry) {
if (!(cmd->entry->flags & CMD_READONLY))
readonly = 0;
}
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs