upstream: allow sshpkt_fatal() to take a varargs format; we'll

use this to give packet-related fatal error messages more context (esp. the
remote endpoint) ok markus@

OpenBSD-Commit-ID: de57211f9543426b515a8a10a4f481666b2b2a50
This commit is contained in:
djm@openbsd.org 2019-01-19 21:33:13 +00:00 committed by Damien Miller
parent 0fa174ebe1
commit ad60b1179c
4 changed files with 36 additions and 18 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: dispatch.c,v 1.31 2017/05/31 07:00:13 markus Exp $ */
/* $OpenBSD: dispatch.c,v 1.32 2019/01/19 21:33:13 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
*
@ -47,7 +47,7 @@ dispatch_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
(r = sshpkt_put_u32(ssh, seq)) != 0 ||
(r = sshpkt_send(ssh)) != 0 ||
(r = ssh_packet_write_wait(ssh)) != 0)
sshpkt_fatal(ssh, __func__, r);
sshpkt_fatal(ssh, r, "%s", __func__);
return 0;
}
@ -131,5 +131,5 @@ ssh_dispatch_run_fatal(struct ssh *ssh, int mode, volatile sig_atomic_t *done)
int r;
if ((r = ssh_dispatch_run(ssh, mode, done)) != 0)
sshpkt_fatal(ssh, __func__, r);
sshpkt_fatal(ssh, r, "%s", __func__);
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: opacket.c,v 1.7 2017/10/20 01:56:39 djm Exp $ */
/* $OpenBSD: opacket.c,v 1.9 2019/01/19 21:33:14 djm Exp $ */
/* Written by Markus Friedl. Placed in the public domain. */
#include "includes.h"
@ -238,7 +238,7 @@ packet_read_seqnr(u_int32_t *seqnr)
int r;
if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
return type;
}
@ -249,7 +249,7 @@ packet_read_poll_seqnr(u_int32_t *seqnr)
int r;
if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
return type;
}
@ -266,7 +266,7 @@ packet_process_incoming(const char *buf, u_int len)
int r;
if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
}
void
@ -275,7 +275,7 @@ packet_write_wait(void)
int r;
if ((r = ssh_packet_write_wait(active_state)) != 0)
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
}
void
@ -284,7 +284,7 @@ packet_write_poll(void)
int r;
if ((r = ssh_packet_write_poll(active_state)) != 0)
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
}
void
@ -293,7 +293,7 @@ packet_read_expect(int expected_type)
int r;
if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
sshpkt_fatal(active_state, __func__, r);
sshpkt_fatal(active_state, r, "%s", __func__);
}
void

View File

@ -1,4 +1,4 @@
/* $OpenBSD: packet.c,v 1.279 2019/01/04 03:23:00 djm Exp $ */
/* $OpenBSD: packet.c,v 1.280 2019/01/19 21:33:14 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@ -1809,10 +1809,10 @@ sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l)
/*
* Pretty-print connection-terminating errors and exit.
*/
void
sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
static void
sshpkt_vfatal(struct ssh *ssh, int r, const char *fmt, va_list ap)
{
char remote_id[512];
char *tag = NULL, remote_id[512];
sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
@ -1846,6 +1846,11 @@ sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
}
/* FALLTHROUGH */
default:
if (vasprintf(&tag, fmt, ap) == -1) {
ssh_packet_clear_keys(ssh);
logdie("%s: could not allocate failure message",
__func__);
}
ssh_packet_clear_keys(ssh);
logdie("%s%sConnection %s %s: %s",
tag != NULL ? tag : "", tag != NULL ? ": " : "",
@ -1854,6 +1859,18 @@ sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
}
}
void
sshpkt_fatal(struct ssh *ssh, int r, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
sshpkt_vfatal(ssh, r, fmt, ap);
/* NOTREACHED */
va_end(ap);
logdie("%s: should have exited", __func__);
}
/*
* Logs the error plus constructs and sends a disconnect packet, closes the
* connection, and exits. This function never returns. The error message
@ -1889,10 +1906,10 @@ ssh_packet_disconnect(struct ssh *ssh, const char *fmt,...)
* for it to get sent.
*/
if ((r = sshpkt_disconnect(ssh, "%s", buf)) != 0)
sshpkt_fatal(ssh, __func__, r);
sshpkt_fatal(ssh, r, "%s", __func__);
if ((r = ssh_packet_write_wait(ssh)) != 0)
sshpkt_fatal(ssh, __func__, r);
sshpkt_fatal(ssh, r, "%s", __func__);
/* Close the connection. */
ssh_packet_close(ssh);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: packet.h,v 1.87 2019/01/19 21:31:32 djm Exp $ */
/* $OpenBSD: packet.h,v 1.88 2019/01/19 21:33:14 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@ -176,7 +176,8 @@ int sshpkt_send(struct ssh *ssh);
int sshpkt_disconnect(struct ssh *, const char *fmt, ...)
__attribute__((format(printf, 2, 3)));
int sshpkt_add_padding(struct ssh *, u_char);
void sshpkt_fatal(struct ssh *ssh, const char *tag, int r);
void sshpkt_fatal(struct ssh *ssh, int r, const char *fmt, ...)
__attribute__((format(printf, 3, 4)));
int sshpkt_msg_ignore(struct ssh *, u_int);
int sshpkt_put(struct ssh *ssh, const void *v, size_t len);