]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: have sshpkt_fatal() save/restore errno before we
authordjm@openbsd.org <djm@openbsd.org>
Thu, 30 Jan 2020 07:20:05 +0000 (07:20 +0000)
committerDamien Miller <djm@mindrot.org>
Thu, 30 Jan 2020 07:22:34 +0000 (18:22 +1100)
potentially call strerror() (via ssh_err()); ok dtucker

OpenBSD-Commit-ID: 5590df31d21405498c848245b85c24acb84ad787

packet.c

index 38d3ea2391083c1aa16209943795ca31d6d17f7a..6d3e9172db6cdfa4306d78603384b6742c66c581 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.289 2020/01/23 10:53:04 dtucker Exp $ */
+/* $OpenBSD: packet.c,v 1.290 2020/01/30 07:20:05 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1850,6 +1850,7 @@ static void
 sshpkt_vfatal(struct ssh *ssh, int r, const char *fmt, va_list ap)
 {
        char *tag = NULL, remote_id[512];
+       int oerrno = errno;
 
        sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
 
@@ -1877,6 +1878,7 @@ sshpkt_vfatal(struct ssh *ssh, int r, const char *fmt, va_list ap)
        case SSH_ERR_NO_HOSTKEY_ALG_MATCH:
                if (ssh && ssh->kex && ssh->kex->failed_choice) {
                        ssh_packet_clear_keys(ssh);
+                       errno = oerrno;
                        logdie("Unable to negotiate with %s: %s. "
                            "Their offer: %s", remote_id, ssh_err(r),
                            ssh->kex->failed_choice);
@@ -1889,6 +1891,7 @@ sshpkt_vfatal(struct ssh *ssh, int r, const char *fmt, va_list ap)
                            __func__);
                }
                ssh_packet_clear_keys(ssh);
+               errno = oerrno;
                logdie("%s%sConnection %s %s: %s",
                    tag != NULL ? tag : "", tag != NULL ? ": " : "",
                    ssh->state->server_side ? "from" : "to",