version 1.157, 2020/02/26 13:40:09 |
version 1.158, 2020/03/13 04:01:56 |
|
|
kex_exchange_identification(struct ssh *ssh, int timeout_ms, |
kex_exchange_identification(struct ssh *ssh, int timeout_ms, |
const char *version_addendum) |
const char *version_addendum) |
{ |
{ |
int remote_major, remote_minor, mismatch; |
int remote_major, remote_minor, mismatch, oerrno = 0; |
size_t len, i, n; |
size_t len, i, n; |
int r, expect_nl; |
int r, expect_nl; |
u_char c; |
u_char c; |
|
|
PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION, |
PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION, |
version_addendum == NULL ? "" : " ", |
version_addendum == NULL ? "" : " ", |
version_addendum == NULL ? "" : version_addendum)) != 0) { |
version_addendum == NULL ? "" : version_addendum)) != 0) { |
|
oerrno = errno; |
error("%s: sshbuf_putf: %s", __func__, ssh_err(r)); |
error("%s: sshbuf_putf: %s", __func__, ssh_err(r)); |
goto out; |
goto out; |
} |
} |
|
|
if (atomicio(vwrite, ssh_packet_get_connection_out(ssh), |
if (atomicio(vwrite, ssh_packet_get_connection_out(ssh), |
sshbuf_mutable_ptr(our_version), |
sshbuf_mutable_ptr(our_version), |
sshbuf_len(our_version)) != sshbuf_len(our_version)) { |
sshbuf_len(our_version)) != sshbuf_len(our_version)) { |
error("%s: write: %.100s", __func__, strerror(errno)); |
oerrno = errno; |
|
debug("%s: write: %.100s", __func__, strerror(errno)); |
r = SSH_ERR_SYSTEM_ERROR; |
r = SSH_ERR_SYSTEM_ERROR; |
goto out; |
goto out; |
} |
} |
if ((r = sshbuf_consume_end(our_version, 2)) != 0) { /* trim \r\n */ |
if ((r = sshbuf_consume_end(our_version, 2)) != 0) { /* trim \r\n */ |
|
oerrno = errno; |
error("%s: sshbuf_consume_end: %s", __func__, ssh_err(r)); |
error("%s: sshbuf_consume_end: %s", __func__, ssh_err(r)); |
goto out; |
goto out; |
} |
} |
|
|
r = SSH_ERR_CONN_TIMEOUT; |
r = SSH_ERR_CONN_TIMEOUT; |
goto out; |
goto out; |
} else if (r == -1) { |
} else if (r == -1) { |
|
oerrno = errno; |
error("%s: %s", |
error("%s: %s", |
__func__, strerror(errno)); |
__func__, strerror(errno)); |
r = SSH_ERR_SYSTEM_ERROR; |
r = SSH_ERR_SYSTEM_ERROR; |
|
|
r = SSH_ERR_CONN_CLOSED; |
r = SSH_ERR_CONN_CLOSED; |
goto out; |
goto out; |
} else if (len != 1) { |
} else if (len != 1) { |
|
oerrno = errno; |
error("%s: read: %.100s", |
error("%s: read: %.100s", |
__func__, strerror(errno)); |
__func__, strerror(errno)); |
r = SSH_ERR_SYSTEM_ERROR; |
r = SSH_ERR_SYSTEM_ERROR; |
|
|
goto invalid; |
goto invalid; |
} |
} |
if ((r = sshbuf_put_u8(peer_version, c)) != 0) { |
if ((r = sshbuf_put_u8(peer_version, c)) != 0) { |
|
oerrno = errno; |
error("%s: sshbuf_put: %s", |
error("%s: sshbuf_put: %s", |
__func__, ssh_err(r)); |
__func__, ssh_err(r)); |
goto out; |
goto out; |
|
|
free(our_version_string); |
free(our_version_string); |
free(peer_version_string); |
free(peer_version_string); |
free(remote_version); |
free(remote_version); |
|
if (r == SSH_ERR_SYSTEM_ERROR) |
|
errno = oerrno; |
return r; |
return r; |
} |
} |
|
|