]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authordjm@openbsd.org <djm@openbsd.org>
Fri, 3 Feb 2017 23:03:33 +0000 (23:03 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 3 Feb 2017 23:08:15 +0000 (10:08 +1100)
add ssh_packet_set_log_preamble() to allow inclusion of a
preamble string in disconnect messages; ok markus@

Upstream-ID: 34cb41182cd76d414c214ccb01c01707849afead

packet.c
packet.h

index 6b9d3525ba2f3716c5e2448f91b14d57a7cc9758..94e8460ca929d7249ef33b5615549258b4ddbe93 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.244 2017/02/03 02:56:00 dtucker Exp $ */
+/* $OpenBSD: packet.c,v 1.245 2017/02/03 23:03:33 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -352,6 +352,25 @@ ssh_packet_get_mux(struct ssh *ssh)
        return ssh->state->mux;
 }
 
+int
+ssh_packet_set_log_preamble(struct ssh *ssh, const char *fmt, ...)
+{
+       va_list args;
+       int r;
+
+       free(ssh->log_preamble);
+       if (fmt == NULL)
+               ssh->log_preamble = NULL;
+       else {
+               va_start(args, fmt);
+               r = vasprintf(&ssh->log_preamble, fmt, args);
+               va_end(args);
+               if (r < 0 || ssh->log_preamble == NULL)
+                       return SSH_ERR_ALLOC_FAIL;
+       }
+       return 0;
+}
+
 int
 ssh_packet_stop_discard(struct ssh *ssh)
 {
@@ -2074,27 +2093,36 @@ ssh_packet_send_debug(struct ssh *ssh, const char *fmt,...)
                fatal("%s: %s", __func__, ssh_err(r));
 }
 
+static void
+fmt_connection_id(struct ssh *ssh, char *s, size_t l)
+{
+       snprintf(s, l, "%.200s%s%s port %d",
+           ssh->log_preamble ? ssh->log_preamble : "",
+           ssh->log_preamble ? " " : "",
+           ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+}
+
 /*
  * Pretty-print connection-terminating errors and exit.
  */
 void
 sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
 {
+       char remote_id[512];
+
+       fmt_connection_id(ssh, remote_id, sizeof(remote_id));
+
        switch (r) {
        case SSH_ERR_CONN_CLOSED:
-               logdie("Connection closed by %.200s port %d",
-                   ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+               logdie("Connection closed by %s", remote_id);
        case SSH_ERR_CONN_TIMEOUT:
-               logdie("Connection %s %.200s port %d timed out",
-                   ssh->state->server_side ? "from" : "to",
-                   ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+               logdie("Connection %s %s timed out",
+                   ssh->state->server_side ? "from" : "to", remote_id);
        case SSH_ERR_DISCONNECTED:
-               logdie("Disconnected from %.200s port %d",
-                   ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+               logdie("Disconnected from %s", remote_id);
        case SSH_ERR_SYSTEM_ERROR:
                if (errno == ECONNRESET)
-                       logdie("Connection reset by %.200s port %d",
-                           ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+                       logdie("Connection reset by %s", remote_id);
                /* FALLTHROUGH */
        case SSH_ERR_NO_CIPHER_ALG_MATCH:
        case SSH_ERR_NO_MAC_ALG_MATCH:
@@ -2102,17 +2130,16 @@ sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
        case SSH_ERR_NO_KEX_ALG_MATCH:
        case SSH_ERR_NO_HOSTKEY_ALG_MATCH:
                if (ssh && ssh->kex && ssh->kex->failed_choice) {
-                       logdie("Unable to negotiate with %.200s port %d: %s. "
-                           "Their offer: %s", ssh_remote_ipaddr(ssh),
-                           ssh_remote_port(ssh), ssh_err(r),
+                       logdie("Unable to negotiate with %s: %s. "
+                           "Their offer: %s", remote_id, ssh_err(r),
                            ssh->kex->failed_choice);
                }
                /* FALLTHROUGH */
        default:
-               logdie("%s%sConnection %s %.200s port %d: %s",
+               logdie("%s%sConnection %s %s: %s",
                    tag != NULL ? tag : "", tag != NULL ? ": " : "",
                    ssh->state->server_side ? "from" : "to",
-                   ssh_remote_ipaddr(ssh), ssh_remote_port(ssh), ssh_err(r));
+                   remote_id, ssh_err(r));
        }
 }
 
@@ -2125,7 +2152,7 @@ sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
 void
 ssh_packet_disconnect(struct ssh *ssh, const char *fmt,...)
 {
-       char buf[1024];
+       char buf[1024], remote_id[512];
        va_list args;
        static int disconnecting = 0;
        int r;
@@ -2138,12 +2165,13 @@ ssh_packet_disconnect(struct ssh *ssh, const char *fmt,...)
         * Format the message.  Note that the caller must make sure the
         * message is of limited size.
         */
+       fmt_connection_id(ssh, remote_id, sizeof(remote_id));
        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf), fmt, args);
        va_end(args);
 
        /* Display the error locally */
-       logit("Disconnecting: %.100s", buf);
+       logit("Disconnecting %s: %.100s", remote_id, buf);
 
        /*
         * Send the disconnect message to the other side, and wait
index c33dd17df1d819ba5ef9f6f6c0d9f5f627228d6f..0d25b352c73f68584e08ab7dc51aff4aa5edd7a6 100644 (file)
--- a/packet.h
+++ b/packet.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.h,v 1.75 2017/02/03 02:56:00 dtucker Exp $ */
+/* $OpenBSD: packet.h,v 1.76 2017/02/03 23:03:33 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -62,6 +62,9 @@ struct ssh {
        char *local_ipaddr;
        int local_port;
 
+       /* Optional preamble for log messages (e.g. username) */
+       char *log_preamble;
+
        /* Dispatcher table */
        dispatch_fn *dispatch[DISPATCH_MAX];
        /* number of packets to ignore in the dispatcher */
@@ -104,6 +107,8 @@ void     ssh_packet_set_server(struct ssh *);
 void     ssh_packet_set_authenticated(struct ssh *);
 void     ssh_packet_set_mux(struct ssh *);
 int     ssh_packet_get_mux(struct ssh *);
+int     ssh_packet_set_log_preamble(struct ssh *, const char *, ...)
+    __attribute__((format(printf, 2, 3)));
 
 int     ssh_packet_log_type(u_char);