summaryrefslogtreecommitdiffstats
path: root/status.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-11-19 22:25:52 +0000
committerTiago Cunha <tcunha@gmx.com>2009-11-19 22:25:52 +0000
commit563f34477a74ecdc7b666269b2837ac5e262b3da (patch)
tree1edb61fcbb8255453c8c1cdb2af50b1385d89eed /status.c
parenta5ae0dc216364b9112d759c2ebe93b4478733929 (diff)
Sync OpenBSD patchset 549:
Don't interpret #() for display-message, it usually doesn't make sense and may leak commands.
Diffstat (limited to 'status.c')
-rw-r--r--status.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/status.c b/status.c
index ac3f2631..19da4ade 100644
--- a/status.c
+++ b/status.c
@@ -1,4 +1,4 @@
-/* $Id: status.c,v 1.129 2009-11-19 22:20:04 tcunha Exp $ */
+/* $Id: status.c,v 1.130 2009-11-19 22:25:52 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -107,14 +107,14 @@ status_redraw(struct client *c)
/* Work out the left and right strings. */
left = status_replace(c, options_get_string(
- &s->options, "status-left"), c->status_timer.tv_sec);
+ &s->options, "status-left"), c->status_timer.tv_sec, 1);
llen = options_get_number(&s->options, "status-left-length");
llen2 = screen_write_cstrlen(utf8flag, "%s", left);
if (llen2 < llen)
llen = llen2;
right = status_replace(c, options_get_string(
- &s->options, "status-right"), c->status_timer.tv_sec);
+ &s->options, "status-right"), c->status_timer.tv_sec, 1);
rlen = options_get_number(&s->options, "status-right-length");
rlen2 = screen_write_cstrlen(utf8flag, "%s", right);
if (rlen2 < rlen)
@@ -319,7 +319,7 @@ out:
}
char *
-status_replace(struct client *c, const char *fmt, time_t t)
+status_replace(struct client *c, const char *fmt, time_t t, int run_jobs)
{
struct session *s = c->session;
struct winlink *wl = s->curw;
@@ -355,11 +355,25 @@ status_replace(struct client *c, const char *fmt, time_t t)
ptr = NULL;
switch (*iptr++) {
case '(':
- if (ptr == NULL) {
- ptr = status_job(c, &iptr);
- if (ptr == NULL)
- break;
- savedptr = ptr;
+ if (run_jobs) {
+ if (ptr == NULL) {
+ ptr = status_job(c, &iptr);
+ if (ptr == NULL)
+ break;
+ savedptr = ptr;
+ }
+ } else {
+ /* Don't run jobs. Copy to ). */
+ *optr++ = '#';
+
+ iptr--; /* include [ */
+ while (*iptr != ')' && *iptr != '\0') {
+ if (optr >=
+ out + (sizeof out) - 1)
+ break;
+ *optr++ = *iptr++;
+ }
+ break;
}
/* FALLTHROUGH */
case 'H':