mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-08-05 20:55:46 +03:00
misc: Fix OpenSSH banner parsing
Signed-off-by: Lucas Mulling <lucas.mulling@suse.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Norbert Pocs <norbertpocs0@gmail.com>
This commit is contained in:
committed by
Lucas Mülling
parent
bfae56634c
commit
d758990d39
@@ -1426,6 +1426,7 @@ int ssh_analyze_banner(ssh_session session, int server)
|
|||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
unsigned long int major = 0UL;
|
unsigned long int major = 0UL;
|
||||||
unsigned long int minor = 0UL;
|
unsigned long int minor = 0UL;
|
||||||
|
int off = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The banner is typical:
|
* The banner is typical:
|
||||||
@@ -1445,8 +1446,9 @@ int ssh_analyze_banner(ssh_session session, int server)
|
|||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
minor = strtoul(openssh + 10, &tmp, 10);
|
off = major >= 10 ? 11 : 10;
|
||||||
if ((tmp == (openssh + 10)) ||
|
minor = strtoul(openssh + off, &tmp, 10);
|
||||||
|
if ((tmp == (openssh + off)) ||
|
||||||
((errno == ERANGE) && (major == ULONG_MAX)) ||
|
((errno == ERANGE) && (major == ULONG_MAX)) ||
|
||||||
((errno != 0) && (major == 0)) ||
|
((errno != 0) && (major == 0)) ||
|
||||||
(minor > 100)) {
|
(minor > 100)) {
|
||||||
|
@@ -574,6 +574,18 @@ static void torture_pubkey_hash(void **state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void torture_openssh_banner_version(void **state)
|
||||||
|
{
|
||||||
|
struct torture_state *s = *state;
|
||||||
|
ssh_session session = s->ssh.session;
|
||||||
|
|
||||||
|
int openssh_version = ssh_get_openssh_version(session);
|
||||||
|
int cmake_openssh_version = SSH_VERSION_INT(OPENSSH_VERSION_MAJOR, OPENSSH_VERSION_MINOR, 0);
|
||||||
|
|
||||||
|
assert_int_equal(openssh_version, cmake_openssh_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int torture_run_tests(void) {
|
int torture_run_tests(void) {
|
||||||
int rc;
|
int rc;
|
||||||
struct CMUnitTest tests[] = {
|
struct CMUnitTest tests[] = {
|
||||||
@@ -619,6 +631,9 @@ int torture_run_tests(void) {
|
|||||||
cmocka_unit_test_setup_teardown(torture_pubkey_hash,
|
cmocka_unit_test_setup_teardown(torture_pubkey_hash,
|
||||||
session_setup,
|
session_setup,
|
||||||
session_teardown),
|
session_teardown),
|
||||||
|
cmocka_unit_test_setup_teardown(torture_openssh_banner_version,
|
||||||
|
session_setup,
|
||||||
|
session_teardown),
|
||||||
};
|
};
|
||||||
|
|
||||||
ssh_init();
|
ssh_init();
|
||||||
|
@@ -448,6 +448,7 @@ static void torture_ssh_analyze_banner(void **state) {
|
|||||||
assert_server_banner_accepted("SSH-2.0-OpenSSH");
|
assert_server_banner_accepted("SSH-2.0-OpenSSH");
|
||||||
assert_int_equal(0, session->openssh);
|
assert_int_equal(0, session->openssh);
|
||||||
|
|
||||||
|
|
||||||
/* OpenSSH banners: big enough to extract major and minor versions */
|
/* OpenSSH banners: big enough to extract major and minor versions */
|
||||||
assert_client_banner_accepted("SSH-2.0-OpenSSH_5.9p1");
|
assert_client_banner_accepted("SSH-2.0-OpenSSH_5.9p1");
|
||||||
assert_int_equal(SSH_VERSION_INT(5, 9, 0), session->openssh);
|
assert_int_equal(SSH_VERSION_INT(5, 9, 0), session->openssh);
|
||||||
@@ -487,6 +488,10 @@ static void torture_ssh_analyze_banner(void **state) {
|
|||||||
assert_server_banner_accepted("SSH-2.0-OpenSSH-keyscan");
|
assert_server_banner_accepted("SSH-2.0-OpenSSH-keyscan");
|
||||||
assert_int_equal(0, session->openssh);
|
assert_int_equal(0, session->openssh);
|
||||||
|
|
||||||
|
/* OpenSSH banners: Double digit in major version */
|
||||||
|
assert_server_banner_accepted("SSH-2.0-OpenSSH_10.0p1");
|
||||||
|
assert_int_equal(SSH_VERSION_INT(10, 0, 0), session->openssh);
|
||||||
|
|
||||||
ssh_free(session);
|
ssh_free(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user