summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorMarkus Friedl <markus@cvs.openbsd.org>2018-07-09 21:20:27 +0000
committerMarkus Friedl <markus@cvs.openbsd.org>2018-07-09 21:20:27 +0000
commit3e48ff42e1ac615c9535907eb6b38bb5d8bbc577 (patch)
tree4d1c759a4fb7b09c7ad14f1bc0773f248797cf8e /usr.bin
parent54ce0dc4e28a072a31db4bdcb09caa02e6d66953 (diff)
ttymodes: switch to sshbuf API; ok djm@
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/ssh/clientloop.c4
-rw-r--r--usr.bin/ssh/packet.h6
-rw-r--r--usr.bin/ssh/session.c6
-rw-r--r--usr.bin/ssh/ttymodes.c128
4 files changed, 80 insertions, 64 deletions
diff --git a/usr.bin/ssh/clientloop.c b/usr.bin/ssh/clientloop.c
index 881cd7065c2..80d94720a60 100644
--- a/usr.bin/ssh/clientloop.c
+++ b/usr.bin/ssh/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.315 2018/07/09 21:03:30 markus Exp $ */
+/* $OpenBSD: clientloop.c,v 1.316 2018/07/09 21:20:26 markus Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -2195,7 +2195,7 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem,
packet_put_int((u_int)ws.ws_ypixel);
if (tiop == NULL)
tiop = get_saved_tio();
- tty_make_modes(-1, tiop);
+ ssh_tty_make_modes(ssh, -1, tiop);
packet_send();
/* XXX wait for reply */
c->client_tty = 1;
diff --git a/usr.bin/ssh/packet.h b/usr.bin/ssh/packet.h
index 6d270c33947..1c67b9f653a 100644
--- a/usr.bin/ssh/packet.h
+++ b/usr.bin/ssh/packet.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.h,v 1.85 2018/07/06 09:03:02 sf Exp $ */
+/* $OpenBSD: packet.h,v 1.86 2018/07/09 21:20:26 markus Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -133,8 +133,8 @@ int ssh_packet_not_very_much_data_to_write(struct ssh *);
int ssh_packet_connection_is_on_socket(struct ssh *);
int ssh_packet_remaining(struct ssh *);
-void tty_make_modes(int, struct termios *);
-void tty_parse_modes(int, int *);
+void ssh_tty_make_modes(struct ssh *, int, struct termios *);
+void ssh_tty_parse_modes(struct ssh *, int);
void ssh_packet_set_alive_timeouts(struct ssh *, int);
int ssh_packet_inc_alive_timeouts(struct ssh *);
diff --git a/usr.bin/ssh/session.c b/usr.bin/ssh/session.c
index 6fb5b43d8ba..7be0f0b6145 100644
--- a/usr.bin/ssh/session.c
+++ b/usr.bin/ssh/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.301 2018/07/03 10:59:35 djm Exp $ */
+/* $OpenBSD: session.c,v 1.302 2018/07/09 21:20:26 markus Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
@@ -1567,7 +1567,6 @@ static int
session_pty_req(struct ssh *ssh, Session *s)
{
u_int len;
- int n_bytes;
if (!auth_opts->permit_pty_flag || !options.permit_tty) {
debug("Allocating a pty not permitted for this connection.");
@@ -1602,8 +1601,7 @@ session_pty_req(struct ssh *ssh, Session *s)
}
debug("session_pty_req: session %d alloc %s", s->self, s->tty);
- n_bytes = packet_remaining();
- tty_parse_modes(s->ttyfd, &n_bytes);
+ ssh_tty_parse_modes(ssh, s->ttyfd);
if (!use_privsep)
pty_setowner(s->pw, s->tty);
diff --git a/usr.bin/ssh/ttymodes.c b/usr.bin/ssh/ttymodes.c
index 65e0888a11a..53459622256 100644
--- a/usr.bin/ssh/ttymodes.c
+++ b/usr.bin/ssh/ttymodes.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ttymodes.c,v 1.33 2018/02/16 04:43:11 dtucker Exp $ */
+/* $OpenBSD: ttymodes.c,v 1.34 2018/07/09 21:20:26 markus Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -53,8 +53,8 @@
#include "packet.h"
#include "log.h"
#include "compat.h"
-#include "buffer.h"
-#include "compat.h"
+#include "sshbuf.h"
+#include "ssherr.h"
#define TTY_OP_END 0
/*
@@ -248,17 +248,18 @@ baud_to_speed(int baud)
* being constructed.
*/
void
-tty_make_modes(int fd, struct termios *tiop)
+ssh_tty_make_modes(struct ssh *ssh, int fd, struct termios *tiop)
{
struct termios tio;
- int baud;
- Buffer buf;
+ struct sshbuf *buf;
+ int r, ibaud, obaud;
- buffer_init(&buf);
+ if ((buf = sshbuf_new()) == NULL)
+ fatal("%s: sshbuf_new failed", __func__);
if (tiop == NULL) {
if (fd == -1) {
- debug("tty_make_modes: no fd or tio");
+ debug("%s: no fd or tio", __func__);
goto end;
}
if (tcgetattr(fd, &tio) == -1) {
@@ -269,27 +270,28 @@ tty_make_modes(int fd, struct termios *tiop)
tio = *tiop;
/* Store input and output baud rates. */
- baud = speed_to_baud(cfgetospeed(&tio));
- buffer_put_char(&buf, TTY_OP_OSPEED);
- buffer_put_int(&buf, baud);
- baud = speed_to_baud(cfgetispeed(&tio));
- buffer_put_char(&buf, TTY_OP_ISPEED);
- buffer_put_int(&buf, baud);
+ obaud = speed_to_baud(cfgetospeed(&tio));
+ ibaud = speed_to_baud(cfgetispeed(&tio));
+ if ((r = sshbuf_put_u8(buf, TTY_OP_OSPEED)) != 0 ||
+ (r = sshbuf_put_u32(buf, obaud)) != 0 ||
+ (r = sshbuf_put_u8(buf, TTY_OP_ISPEED)) != 0 ||
+ (r = sshbuf_put_u32(buf, ibaud)) != 0)
+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
/* Store values of mode flags. */
#define TTYCHAR(NAME, OP) \
- buffer_put_char(&buf, OP); \
- buffer_put_int(&buf, tio.c_cc[NAME]);
+ if ((r = sshbuf_put_u8(buf, OP)) != 0 || \
+ (r = sshbuf_put_u32(buf, tio.c_cc[NAME])) != 0) \
+ fatal("%s: buffer error: %s", __func__, ssh_err(r)); \
#define SSH_TTYMODE_IUTF8 42 /* for SSH_BUG_UTF8TTYMODE */
#define TTYMODE(NAME, FIELD, OP) \
if (OP == SSH_TTYMODE_IUTF8 && (datafellows & SSH_BUG_UTF8TTYMODE)) { \
debug3("%s: SSH_BUG_UTF8TTYMODE", __func__); \
- } else { \
- buffer_put_char(&buf, OP); \
- buffer_put_int(&buf, ((tio.FIELD & NAME) != 0)); \
- }
+ } else if ((r = sshbuf_put_u8(buf, OP)) != 0 || \
+ (r = sshbuf_put_u32(buf, ((tio.FIELD & NAME) != 0))) != 0) \
+ fatal("%s: buffer error: %s", __func__, ssh_err(r)); \
#include "ttymodes.h"
@@ -298,9 +300,10 @@ tty_make_modes(int fd, struct termios *tiop)
end:
/* Mark end of mode data. */
- buffer_put_char(&buf, TTY_OP_END);
- packet_put_string(buffer_ptr(&buf), buffer_len(&buf));
- buffer_free(&buf);
+ if ((r = sshbuf_put_u8(buf, TTY_OP_END)) != 0 ||
+ (r = sshpkt_put_stringb(ssh, buf)) != 0)
+ fatal("%s: packet error: %s", __func__, ssh_err(r));
+ sshbuf_free(buf);
}
/*
@@ -308,16 +311,24 @@ end:
* manner from a packet being read.
*/
void
-tty_parse_modes(int fd, int *n_bytes_ptr)
+ssh_tty_parse_modes(struct ssh *ssh, int fd)
{
struct termios tio;
- int opcode, baud;
- int n_bytes = 0;
- int failure = 0;
-
- *n_bytes_ptr = packet_get_int();
- if (*n_bytes_ptr == 0)
+ struct sshbuf *buf;
+ const u_char *data;
+ u_char opcode;
+ u_int baud, u;
+ int r, failure = 0;
+ size_t len;
+
+ if ((r = sshpkt_get_string_direct(ssh, &data, &len)) != 0)
+ fatal("%s: packet error: %s", __func__, ssh_err(r));
+ if (len == 0)
+ return;
+ if ((buf = sshbuf_from(data, len)) == NULL) {
+ error("%s: sshbuf_from failed", __func__);
return;
+ }
/*
* Get old attributes for the terminal. We will modify these
@@ -329,42 +340,48 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
failure = -1;
}
- for (;;) {
- n_bytes += 1;
- opcode = packet_get_char();
+ while (sshbuf_len(buf) > 0) {
+ if ((r = sshbuf_get_u8(buf, &opcode)) != 0)
+ fatal("%s: packet error: %s", __func__, ssh_err(r));
switch (opcode) {
case TTY_OP_END:
goto set;
case TTY_OP_ISPEED:
- n_bytes += 4;
- baud = packet_get_int();
+ if ((r = sshbuf_get_u32(buf, &baud)) != 0)
+ fatal("%s: packet error: %s",
+ __func__, ssh_err(r));
if (failure != -1 &&
cfsetispeed(&tio, baud_to_speed(baud)) == -1)
error("cfsetispeed failed for %d", baud);
break;
case TTY_OP_OSPEED:
- n_bytes += 4;
- baud = packet_get_int();
+ if ((r = sshbuf_get_u32(buf, &baud)) != 0)
+ fatal("%s: packet error: %s",
+ __func__, ssh_err(r));
if (failure != -1 &&
cfsetospeed(&tio, baud_to_speed(baud)) == -1)
error("cfsetospeed failed for %d", baud);
break;
#define TTYCHAR(NAME, OP) \
- case OP: \
- n_bytes += 4; \
- tio.c_cc[NAME] = packet_get_int(); \
- break;
+ case OP: \
+ if ((r = sshbuf_get_u32(buf, &u)) != 0) \
+ fatal("%s: packet error: %s", __func__, \
+ ssh_err(r)); \
+ tio.c_cc[NAME] = u; \
+ break;
#define TTYMODE(NAME, FIELD, OP) \
- case OP: \
- n_bytes += 4; \
- if (packet_get_int()) \
- tio.FIELD |= NAME; \
- else \
- tio.FIELD &= ~NAME; \
- break;
+ case OP: \
+ if ((r = sshbuf_get_u32(buf, &u)) != 0) \
+ fatal("%s: packet error: %s", __func__, \
+ ssh_err(r)); \
+ if (u) \
+ tio.FIELD |= NAME; \
+ else \
+ tio.FIELD &= ~NAME; \
+ break;
#include "ttymodes.h"
@@ -382,11 +399,12 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
* to stop.
*/
if (opcode > 0 && opcode < 160) {
- n_bytes += 4;
- (void) packet_get_int();
+ if ((r = sshbuf_get_u32(buf, NULL)) != 0)
+ fatal("%s: packet error: %s", __func__,
+ ssh_err(r));
break;
} else {
- logit("parse_tty_modes: unknown opcode %d",
+ logit("%s: unknown opcode %d", __func__,
opcode);
goto set;
}
@@ -394,10 +412,10 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
}
set:
- if (*n_bytes_ptr != n_bytes) {
- *n_bytes_ptr = n_bytes;
- logit("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d",
- *n_bytes_ptr, n_bytes);
+ len = sshbuf_len(buf);
+ sshbuf_free(buf);
+ if (len > 0) {
+ logit("%s: %zu bytes left", __func__, len);
return; /* Don't process bytes passed */
}
if (failure == -1)