aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrefkov Aleksander <orefkov@gmail.com>2021-10-19 13:39:33 +0300
committerAndy Green <andy@warmcat.com>2021-10-19 17:24:07 +0100
commit63db023f585dc4f312ee9f9ef8da90b9910e69ca (patch)
tree5f650b185926bb34e6c92c415e8c5ce10246657b
parente9c92ec161b4069e4f47a88f6a37f8ce84b3ea87 (diff)
downloadlibwebsockets-63db023f585dc4f312ee9f9ef8da90b9910e69ca.tar.gz
pugins: sshd: handle window-change request
Added processing of window-change request, according to RFC 4254 6.7 https://datatracker.ietf.org/doc/html/rfc4254#section-6.7 For processing called callback pty_req with empty terminal and modes.
-rw-r--r--plugins/ssh-base/include/lws-ssh.h5
-rw-r--r--plugins/ssh-base/sshd.c34
2 files changed, 39 insertions, 0 deletions
diff --git a/plugins/ssh-base/include/lws-ssh.h b/plugins/ssh-base/include/lws-ssh.h
index 029d2fc0..6b1dbf81 100644
--- a/plugins/ssh-base/include/lws-ssh.h
+++ b/plugins/ssh-base/include/lws-ssh.h
@@ -275,6 +275,11 @@ enum {
SSHS_NVC_CHRQ_SUBSYSTEM,
+ SSHS_NVC_CHRQ_WNDCHANGE_TW,
+ SSHS_NVC_CHRQ_WNDCHANGE_TH,
+ SSHS_NVC_CHRQ_WNDCHANGE_TWP,
+ SSHS_NVC_CHRQ_WNDCHANGE_THP,
+
SSHS_NVC_CH_EOF,
SSHS_NVC_CH_CLOSE,
diff --git a/plugins/ssh-base/sshd.c b/plugins/ssh-base/sshd.c
index cb02f022..fb5afffe 100644
--- a/plugins/ssh-base/sshd.c
+++ b/plugins/ssh-base/sshd.c
@@ -1483,6 +1483,12 @@ again:
SSHS_NVC_CHRQ_SUBSYSTEM);
break;
}
+ if (!strcmp(pss->name, "window-change")) {
+ lwsl_info("%s: window-change\n", __func__);
+ state_get_u32(pss,
+ SSHS_NVC_CHRQ_WNDCHANGE_TW);
+ break;
+ }
if (pss->rq_want_reply)
goto chrq_fail;
@@ -1638,6 +1644,34 @@ again:
break;
#endif
+ /* CHRQ window-change */
+
+ case SSHS_NVC_CHRQ_WNDCHANGE_TW:
+ pss->args.pty.width_ch = pss->len;
+ state_get_u32(pss, SSHS_NVC_CHRQ_WNDCHANGE_TH);
+ break;
+ case SSHS_NVC_CHRQ_WNDCHANGE_TH:
+ pss->args.pty.height_ch = pss->len;
+ state_get_u32(pss, SSHS_NVC_CHRQ_WNDCHANGE_TWP);
+ break;
+ case SSHS_NVC_CHRQ_WNDCHANGE_TWP:
+ pss->args.pty.width_px = pss->len;
+ state_get_u32(pss, SSHS_NVC_CHRQ_WNDCHANGE_THP);
+ break;
+ case SSHS_NVC_CHRQ_WNDCHANGE_THP:
+ pss->args.pty.height_px = pss->len;
+ pss->args.pty.term[0] = 0;
+ pss->args.pty.modes = NULL;
+ pss->args.pty.modes_len = 0;
+ n = 0;
+ if (pss->vhd->ops && pss->vhd->ops->pty_req)
+ n = pss->vhd->ops->pty_req(pss->ch_temp->priv,
+ &pss->args.pty);
+ if (n)
+ goto chrq_fail;
+ pss->parser_state = SSHS_MSG_EAT_PADDING;
+ break;
+
/* SSH_MSG_CHANNEL_DATA */
case SSHS_NVC_CD_RECIP: