mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-12 03:00:26 +09:00
knownhosts, config: Avoid using MT-unsafe implementations of strtok()
Use the POSIX strtok_r() or equivalent implementations to resolve. Thanks to @wez1 for the early review. Fixes #104 Signed-off-by: Gene Oden <goden@fb.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org> Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
This commit is contained in:
@@ -890,7 +890,7 @@ ssh_config_parse_line(ssh_session session,
|
|||||||
case SOC_PROTOCOL:
|
case SOC_PROTOCOL:
|
||||||
p = ssh_config_get_str_tok(&s, NULL);
|
p = ssh_config_get_str_tok(&s, NULL);
|
||||||
if (p && *parsing) {
|
if (p && *parsing) {
|
||||||
char *a, *b;
|
char *a, *b, *save = NULL;
|
||||||
b = strdup(p);
|
b = strdup(p);
|
||||||
if (b == NULL) {
|
if (b == NULL) {
|
||||||
SAFE_FREE(x);
|
SAFE_FREE(x);
|
||||||
@@ -900,7 +900,7 @@ ssh_config_parse_line(ssh_session session,
|
|||||||
i = 0;
|
i = 0;
|
||||||
ssh_options_set(session, SSH_OPTIONS_SSH2, &i);
|
ssh_options_set(session, SSH_OPTIONS_SSH2, &i);
|
||||||
|
|
||||||
for (a = strtok(b, ","); a; a = strtok(NULL, ",")) {
|
for (a = strtok_r(b, ",", &save); a; a = strtok_r(NULL, ",", &save)) {
|
||||||
switch (atoi(a)) {
|
switch (atoi(a)) {
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -621,6 +621,7 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
struct ssh_knownhosts_entry *e = NULL;
|
struct ssh_knownhosts_entry *e = NULL;
|
||||||
char *known_host = NULL;
|
char *known_host = NULL;
|
||||||
char *p;
|
char *p;
|
||||||
|
char *save_tok = NULL;
|
||||||
enum ssh_keytypes_e key_type;
|
enum ssh_keytypes_e key_type;
|
||||||
int match = 0;
|
int match = 0;
|
||||||
int rc = SSH_OK;
|
int rc = SSH_OK;
|
||||||
@@ -631,7 +632,7 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* match pattern for hostname or hashed hostname */
|
/* match pattern for hostname or hashed hostname */
|
||||||
p = strtok(known_host, " ");
|
p = strtok_r(known_host, " ", &save_tok);
|
||||||
if (p == NULL ) {
|
if (p == NULL ) {
|
||||||
free(known_host);
|
free(known_host);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
@@ -652,9 +653,11 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
match = match_hashed_hostname(hostname, p);
|
match = match_hashed_hostname(hostname, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (q = strtok(p, ",");
|
save_tok = NULL;
|
||||||
|
|
||||||
|
for (q = strtok_r(p, ",", &save_tok);
|
||||||
q != NULL;
|
q != NULL;
|
||||||
q = strtok(NULL, ",")) {
|
q = strtok_r(NULL, ",", &save_tok)) {
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
if (q[0] == '[' && hostname[0] != '[') {
|
if (q[0] == '[' && hostname[0] != '[') {
|
||||||
@@ -702,7 +705,9 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = strtok(known_host, " ");
|
save_tok = NULL;
|
||||||
|
|
||||||
|
p = strtok_r(known_host, " ", &save_tok);
|
||||||
if (p == NULL ) {
|
if (p == NULL ) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -715,7 +720,7 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* pubkey type */
|
/* pubkey type */
|
||||||
p = strtok(NULL, " ");
|
p = strtok_r(NULL, " ", &save_tok);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -729,7 +734,7 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* public key */
|
/* public key */
|
||||||
p = strtok(NULL, " ");
|
p = strtok_r(NULL, " ", &save_tok);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -747,7 +752,7 @@ int ssh_known_hosts_parse_line(const char *hostname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* comment */
|
/* comment */
|
||||||
p = strtok(NULL, " ");
|
p = strtok_r(NULL, " ", &save_tok);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
p = strstr(line, p);
|
p = strstr(line, p);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user