summaryrefslogtreecommitdiffstats
path: root/input.c
diff options
context:
space:
mode:
authornicm <nicm>2018-04-10 11:20:15 +0000
committernicm <nicm>2018-04-10 11:20:15 +0000
commit051a29ca03718c8fedd5918ba86556f29672348e (patch)
tree3d004ca8931bd0279b95d3e5d94379a1a3e6fed2 /input.c
parentc6975b3bb46c35f8b41d934fd622033aa79a828c (diff)
A couple of fixes to the : form of SGR. Apparently there is an extra
argument that nobody knew about, so skip that if it exists. Also there are a bunch of useless optional arguments at the end, so ignore those.
Diffstat (limited to 'input.c')
-rw-r--r--input.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/input.c b/input.c
index bdfb5a7d..df8b6ec7 100644
--- a/input.c
+++ b/input.c
@@ -1845,10 +1845,12 @@ input_csi_dispatch_sgr_colon(struct input_ctx *ictx, u_int i)
ptr = copy = xstrdup(s);
while ((out = strsep(&ptr, ":")) != NULL) {
- p[n++] = strtonum(out, 0, INT_MAX, &errstr);
- if (errstr != NULL || n == nitems(p)) {
- free(copy);
- return;
+ if (*out != '\0') {
+ p[n++] = strtonum(out, 0, INT_MAX, &errstr);
+ if (errstr != NULL || n == nitems(p)) {
+ free(copy);
+ return;
+ }
}
log_debug("%s: %u = %d", __func__, n - 1, p[n - 1]);
}
@@ -1856,16 +1858,21 @@ input_csi_dispatch_sgr_colon(struct input_ctx *ictx, u_int i)
if (n == 0 || (p[0] != 38 && p[0] != 48))
return;
- switch (p[1]) {
+ if (p[1] == -1)
+ i = 2;
+ else
+ i = 1;
+ switch (p[i]) {
case 2:
- if (n != 5)
+ if (n < i + 4)
break;
- input_csi_dispatch_sgr_rgb_do(ictx, p[0], p[2], p[3], p[4]);
+ input_csi_dispatch_sgr_rgb_do(ictx, p[0], p[i + 1], p[i + 2],
+ p[i + 3]);
break;
case 5:
- if (n != 3)
+ if (n < i + 2)
break;
- input_csi_dispatch_sgr_256_do(ictx, p[0], p[2]);
+ input_csi_dispatch_sgr_256_do(ictx, p[0], p[i + 1]);
break;
}
}