Please don't use expressions with side-effects like m++ in function
arguments, it's too easy to miss.
On Wed, Jan 29, 2014 at 05:53:19PM -0600, J Raynor wrote:
> > Take a look at this instead which a) uses a function like CSI, SM etc b)
> > don't increment m inside function arguments.
>
> This works fine. However, I noticed that just incrementing m may
> cause it to skip over bad input. For example, a winop of 3 is
> supposed to take 2 arguments. If someone enters "ESC[3;;;18t", the
> empty args are skipped over and winop 18 gets executed. If this
> shouldn't be allowed, then take a look at the attached patch. It's
> your patch plus a bit extra to cause the processing to stop if an
> empty arg is encountered.
> diff --git a/input.c b/input.c
> index 259fad1..dbfc6c9 100644
> --- a/input.c
> +++ b/input.c
> @@ -74,6 +74,7 @@ void input_csi_dispatch_rm(struct input_ctx *);
> void input_csi_dispatch_rm_private(struct input_ctx *);
> void input_csi_dispatch_sm(struct input_ctx *);
> void input_csi_dispatch_sm_private(struct input_ctx *);
> +void input_csi_dispatch_winops(struct input_ctx *);
> void input_csi_dispatch_sgr(struct input_ctx *);
> int input_dcs_dispatch(struct input_ctx *);
> int input_utf8_open(struct input_ctx *);
> @@ -154,6 +155,7 @@ enum input_csi_type {
> INPUT_CSI_SM_PRIVATE,
> INPUT_CSI_TBC,
> INPUT_CSI_VPA,
> + INPUT_CSI_WINOPS,
> };
>
> /* Control (CSI) command table. */
> @@ -188,6 +190,7 @@ const struct input_table_entry input_csi_table[] = {
> { 'q', " ", INPUT_CSI_DECSCUSR },
> { 'r', "", INPUT_CSI_DECSTBM },
> { 's', "", INPUT_CSI_SCP },
> + { 't', "", INPUT_CSI_WINOPS },
> { 'u', "", INPUT_CSI_RCP },
> };
>
> @@ -1077,7 +1080,7 @@ input_csi_dispatch(struct input_ctx *ictx)
> struct screen_write_ctx *sctx = &ictx->ctx;
> struct screen *s = sctx->s;
> struct input_table_entry *entry;
> - int n, m;
> + int n, m;
>
> if (ictx->flags & INPUT_DISCARD)
> return (0);
> @@ -1117,6 +1120,9 @@ input_csi_dispatch(struct input_ctx *ictx)
> m = input_get(ictx, 1, 1, 1);
> screen_write_cursormove(sctx, m - 1, n - 1);
> break;
> + case INPUT_CSI_WINOPS:
> + input_csi_dispatch_winops(ictx);
> + break;
> case INPUT_CSI_CUU:
> screen_write_cursorup(sctx, input_get(ictx, 0, 1, 1));
> break;
> @@ -1427,6 +1433,53 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
> log_debug("%s: unknown '%c'", __func__, ictx->ch);
> break;
> }
> + }
> +}
> +
> +/* Handle CSI window operations. */
> +void
> +input_csi_dispatch_winops(struct input_ctx *ictx)
> +{
> + struct window_pane *wp = ictx->wp;
> + int n, m;
> +
> + m = 0;
> + while ((n = input_get(ictx, m, 0, -1)) != -1) {
> + switch (n) {
> + case 1:
> + case 2:
> + case 5:
> + case 6:
> + case 7:
> + case 11:
> + case 13:
> + case 14:
> + case 19:
> + case 20:
> + case 21:
> + case 24:
> + break;
> + case 3:
> + case 4:
> + case 8:
> + if (input_get(ictx, ++m, 0, -1) == -1)
> + return;
> + /* FALLTHROUGH */
> + case 9:
> + case 10:
> + case 22:
> + case 23:
> + if (input_get(ictx, ++m, 0, -1) == -1)
> + return;
> + break;
> + case 18:
> + input_reply(ictx, "\033[8;%d;%d", wp->sy,
> wp->sx);
> + break;
> + default:
> + log_debug("%s: unknown '%c'", __func__,
> ictx->ch);
> + break;
> + }
> + m++;
> }
> }
>
------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable
security intelligence. It gives you real-time visual feedback on key
security issues and trends. Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users