version 1.34, 2018/07/09 21:20:26 |
version 1.35, 2020/10/18 11:32:02 |
|
|
int r, ibaud, obaud; |
int r, ibaud, obaud; |
|
|
if ((buf = sshbuf_new()) == NULL) |
if ((buf = sshbuf_new()) == NULL) |
fatal("%s: sshbuf_new failed", __func__); |
fatal_f("sshbuf_new failed"); |
|
|
if (tiop == NULL) { |
if (tiop == NULL) { |
if (fd == -1) { |
if (fd == -1) { |
debug("%s: no fd or tio", __func__); |
debug_f("no fd or tio"); |
goto end; |
goto end; |
} |
} |
if (tcgetattr(fd, &tio) == -1) { |
if (tcgetattr(fd, &tio) == -1) { |
|
|
(r = sshbuf_put_u32(buf, obaud)) != 0 || |
(r = sshbuf_put_u32(buf, obaud)) != 0 || |
(r = sshbuf_put_u8(buf, TTY_OP_ISPEED)) != 0 || |
(r = sshbuf_put_u8(buf, TTY_OP_ISPEED)) != 0 || |
(r = sshbuf_put_u32(buf, ibaud)) != 0) |
(r = sshbuf_put_u32(buf, ibaud)) != 0) |
fatal("%s: buffer error: %s", __func__, ssh_err(r)); |
fatal_fr(r, "compose"); |
|
|
/* Store values of mode flags. */ |
/* Store values of mode flags. */ |
#define TTYCHAR(NAME, OP) \ |
#define TTYCHAR(NAME, OP) \ |
if ((r = sshbuf_put_u8(buf, OP)) != 0 || \ |
if ((r = sshbuf_put_u8(buf, OP)) != 0 || \ |
(r = sshbuf_put_u32(buf, tio.c_cc[NAME])) != 0) \ |
(r = sshbuf_put_u32(buf, tio.c_cc[NAME])) != 0) \ |
fatal("%s: buffer error: %s", __func__, ssh_err(r)); \ |
fatal_fr(r, "compose %s", #NAME); |
|
|
#define SSH_TTYMODE_IUTF8 42 /* for SSH_BUG_UTF8TTYMODE */ |
#define SSH_TTYMODE_IUTF8 42 /* for SSH_BUG_UTF8TTYMODE */ |
|
|
#define TTYMODE(NAME, FIELD, OP) \ |
#define TTYMODE(NAME, FIELD, OP) \ |
if (OP == SSH_TTYMODE_IUTF8 && (datafellows & SSH_BUG_UTF8TTYMODE)) { \ |
if (OP == SSH_TTYMODE_IUTF8 && (datafellows & SSH_BUG_UTF8TTYMODE)) { \ |
debug3("%s: SSH_BUG_UTF8TTYMODE", __func__); \ |
debug3_f("SSH_BUG_UTF8TTYMODE"); \ |
} else if ((r = sshbuf_put_u8(buf, OP)) != 0 || \ |
} else if ((r = sshbuf_put_u8(buf, OP)) != 0 || \ |
(r = sshbuf_put_u32(buf, ((tio.FIELD & NAME) != 0))) != 0) \ |
(r = sshbuf_put_u32(buf, ((tio.FIELD & NAME) != 0))) != 0) \ |
fatal("%s: buffer error: %s", __func__, ssh_err(r)); \ |
fatal_fr(r, "compose %s", #NAME); |
|
|
#include "ttymodes.h" |
#include "ttymodes.h" |
|
|
|
|
/* Mark end of mode data. */ |
/* Mark end of mode data. */ |
if ((r = sshbuf_put_u8(buf, TTY_OP_END)) != 0 || |
if ((r = sshbuf_put_u8(buf, TTY_OP_END)) != 0 || |
(r = sshpkt_put_stringb(ssh, buf)) != 0) |
(r = sshpkt_put_stringb(ssh, buf)) != 0) |
fatal("%s: packet error: %s", __func__, ssh_err(r)); |
fatal_fr(r, "compose end"); |
sshbuf_free(buf); |
sshbuf_free(buf); |
} |
} |
|
|
|
|
size_t len; |
size_t len; |
|
|
if ((r = sshpkt_get_string_direct(ssh, &data, &len)) != 0) |
if ((r = sshpkt_get_string_direct(ssh, &data, &len)) != 0) |
fatal("%s: packet error: %s", __func__, ssh_err(r)); |
fatal_fr(r, "parse"); |
if (len == 0) |
if (len == 0) |
return; |
return; |
if ((buf = sshbuf_from(data, len)) == NULL) { |
if ((buf = sshbuf_from(data, len)) == NULL) { |
error("%s: sshbuf_from failed", __func__); |
error_f("sshbuf_from failed"); |
return; |
return; |
} |
} |
|
|
|
|
|
|
while (sshbuf_len(buf) > 0) { |
while (sshbuf_len(buf) > 0) { |
if ((r = sshbuf_get_u8(buf, &opcode)) != 0) |
if ((r = sshbuf_get_u8(buf, &opcode)) != 0) |
fatal("%s: packet error: %s", __func__, ssh_err(r)); |
fatal_fr(r, "parse opcode"); |
switch (opcode) { |
switch (opcode) { |
case TTY_OP_END: |
case TTY_OP_END: |
goto set; |
goto set; |
|
|
case TTY_OP_ISPEED: |
case TTY_OP_ISPEED: |
if ((r = sshbuf_get_u32(buf, &baud)) != 0) |
if ((r = sshbuf_get_u32(buf, &baud)) != 0) |
fatal("%s: packet error: %s", |
fatal_fr(r, "parse ispeed"); |
__func__, ssh_err(r)); |
|
if (failure != -1 && |
if (failure != -1 && |
cfsetispeed(&tio, baud_to_speed(baud)) == -1) |
cfsetispeed(&tio, baud_to_speed(baud)) == -1) |
error("cfsetispeed failed for %d", baud); |
error("cfsetispeed failed for %d", baud); |
|
|
|
|
case TTY_OP_OSPEED: |
case TTY_OP_OSPEED: |
if ((r = sshbuf_get_u32(buf, &baud)) != 0) |
if ((r = sshbuf_get_u32(buf, &baud)) != 0) |
fatal("%s: packet error: %s", |
fatal_fr(r, "parse ospeed"); |
__func__, ssh_err(r)); |
|
if (failure != -1 && |
if (failure != -1 && |
cfsetospeed(&tio, baud_to_speed(baud)) == -1) |
cfsetospeed(&tio, baud_to_speed(baud)) == -1) |
error("cfsetospeed failed for %d", baud); |
error("cfsetospeed failed for %d", baud); |
|
|
#define TTYCHAR(NAME, OP) \ |
#define TTYCHAR(NAME, OP) \ |
case OP: \ |
case OP: \ |
if ((r = sshbuf_get_u32(buf, &u)) != 0) \ |
if ((r = sshbuf_get_u32(buf, &u)) != 0) \ |
fatal("%s: packet error: %s", __func__, \ |
fatal_fr(r, "parse %s", #NAME); \ |
ssh_err(r)); \ |
|
tio.c_cc[NAME] = u; \ |
tio.c_cc[NAME] = u; \ |
break; |
break; |
#define TTYMODE(NAME, FIELD, OP) \ |
#define TTYMODE(NAME, FIELD, OP) \ |
case OP: \ |
case OP: \ |
if ((r = sshbuf_get_u32(buf, &u)) != 0) \ |
if ((r = sshbuf_get_u32(buf, &u)) != 0) \ |
fatal("%s: packet error: %s", __func__, \ |
fatal_fr(r, "parse %s", #NAME); \ |
ssh_err(r)); \ |
|
if (u) \ |
if (u) \ |
tio.FIELD |= NAME; \ |
tio.FIELD |= NAME; \ |
else \ |
else \ |
|
|
*/ |
*/ |
if (opcode > 0 && opcode < 160) { |
if (opcode > 0 && opcode < 160) { |
if ((r = sshbuf_get_u32(buf, NULL)) != 0) |
if ((r = sshbuf_get_u32(buf, NULL)) != 0) |
fatal("%s: packet error: %s", __func__, |
fatal_fr(r, "parse arg"); |
ssh_err(r)); |
|
break; |
break; |
} else { |
} else { |
logit("%s: unknown opcode %d", __func__, |
logit_f("unknown opcode %d", opcode); |
opcode); |
|
goto set; |
goto set; |
} |
} |
} |
} |
|
|
len = sshbuf_len(buf); |
len = sshbuf_len(buf); |
sshbuf_free(buf); |
sshbuf_free(buf); |
if (len > 0) { |
if (len > 0) { |
logit("%s: %zu bytes left", __func__, len); |
logit_f("%zu bytes left", len); |
return; /* Don't process bytes passed */ |
return; /* Don't process bytes passed */ |
} |
} |
if (failure == -1) |
if (failure == -1) |