-/* $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.
*
(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;
}
int r;
if ((r = ssh_dispatch_run(ssh, mode, done)) != 0)
- sshpkt_fatal(ssh, __func__, r);
+ sshpkt_fatal(ssh, r, "%s", __func__);
}
-/* $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"
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;
}
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;
}
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
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
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
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
-/* $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
/*
* 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));
}
/* 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 ? ": " : "",
}
}
+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
* 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);
-/* $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>
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);