mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-12-02 01:17:52 +03:00
improve error handling in options.c
Signed-off-by: Andreas Schneider <mail@cynapses.org>
This commit is contained in:
committed by
Andreas Schneider
parent
f1f17f18dc
commit
ff52e3630f
@@ -120,6 +120,7 @@ int ssh_options_copy(ssh_session src, ssh_session *dest) {
|
|||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static char *get_username_from_uid(ssh_session session, uid_t uid){
|
static char *get_username_from_uid(ssh_session session, uid_t uid){
|
||||||
struct passwd *pwd = NULL;
|
struct passwd *pwd = NULL;
|
||||||
|
char *name;
|
||||||
|
|
||||||
pwd = getpwuid(uid);
|
pwd = getpwuid(uid);
|
||||||
|
|
||||||
@@ -128,7 +129,14 @@ static char *get_username_from_uid(ssh_session session, uid_t uid){
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return strdup(pwd->pw_name);
|
name = strdup(pwd->pw_name);
|
||||||
|
|
||||||
|
if (name == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -144,6 +152,7 @@ static int ssh_options_set_algo(ssh_session session, int algo,
|
|||||||
SAFE_FREE(session->wanted_methods[algo]);
|
SAFE_FREE(session->wanted_methods[algo]);
|
||||||
session->wanted_methods[algo] = strdup(list);
|
session->wanted_methods[algo] = strdup(list);
|
||||||
if (session->wanted_methods[algo] == NULL) {
|
if (session->wanted_methods[algo] == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,8 +167,10 @@ static char *dir_expand_dup(ssh_session session, const char *value, int allowssh
|
|||||||
size_t lv = strlen(value + 1), lh = strlen(homedir);
|
size_t lv = strlen(value + 1), lh = strlen(homedir);
|
||||||
|
|
||||||
new = malloc(lv + lh + 1);
|
new = malloc(lv + lh + 1);
|
||||||
if (new == NULL)
|
if (new == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
memcpy(new, homedir, lh);
|
memcpy(new, homedir, lh);
|
||||||
memcpy(new + lh, value + 1, lv + 1);
|
memcpy(new + lh, value + 1, lv + 1);
|
||||||
return new;
|
return new;
|
||||||
@@ -176,13 +187,20 @@ static char *dir_expand_dup(ssh_session session, const char *value, int allowssh
|
|||||||
ls = strlen(session->sshdir);
|
ls = strlen(session->sshdir);
|
||||||
|
|
||||||
new = malloc(lv + ls + 1);
|
new = malloc(lv + ls + 1);
|
||||||
if (new == NULL)
|
if (new == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
memcpy(new, session->sshdir, ls);
|
memcpy(new, session->sshdir, ls);
|
||||||
memcpy(new + ls, value, lv + 1);
|
memcpy(new + ls, value, lv + 1);
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
return strdup(value);
|
new = strdup(value);
|
||||||
|
if (new == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -350,6 +368,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
case SSH_OPTIONS_HOST:
|
case SSH_OPTIONS_HOST:
|
||||||
q = strdup(value);
|
q = strdup(value);
|
||||||
if (q == NULL) {
|
if (q == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
p = strchr(q, '@');
|
p = strchr(q, '@');
|
||||||
@@ -361,6 +380,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
session->host = strdup(p + 1);
|
session->host = strdup(p + 1);
|
||||||
if (session->host == NULL) {
|
if (session->host == NULL) {
|
||||||
SAFE_FREE(q);
|
SAFE_FREE(q);
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,6 +388,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
session->username = strdup(q);
|
session->username = strdup(q);
|
||||||
SAFE_FREE(q);
|
SAFE_FREE(q);
|
||||||
if (session->username == NULL) {
|
if (session->username == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -389,6 +410,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
} else {
|
} else {
|
||||||
q = strdup(value);
|
q = strdup(value);
|
||||||
if (q == NULL) {
|
if (q == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
i = strtol(q, &p, 10);
|
i = strtol(q, &p, 10);
|
||||||
@@ -408,6 +430,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
GetUserName(NULL, &size); //Get Size
|
GetUserName(NULL, &size); //Get Size
|
||||||
q = malloc(size);
|
q = malloc(size);
|
||||||
if (q == NULL) {
|
if (q == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (GetUserName(q, &size)) {
|
if (GetUserName(q, &size)) {
|
||||||
@@ -426,6 +449,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
} else { /* username provided */
|
} else { /* username provided */
|
||||||
session->username = strdup(value);
|
session->username = strdup(value);
|
||||||
if (session->username == NULL) {
|
if (session->username == NULL) {
|
||||||
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,6 +474,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
case SSH_OPTIONS_IDENTITY:
|
case SSH_OPTIONS_IDENTITY:
|
||||||
|
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
SAFE_FREE(session->identity);
|
SAFE_FREE(session->identity);
|
||||||
@@ -476,6 +501,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_TIMEOUT:
|
case SSH_OPTIONS_TIMEOUT:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
long *x = (long *) value;
|
long *x = (long *) value;
|
||||||
@@ -485,6 +511,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_TIMEOUT_USEC:
|
case SSH_OPTIONS_TIMEOUT_USEC:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
long *x = (long *) value;
|
long *x = (long *) value;
|
||||||
@@ -494,6 +521,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_SSH1:
|
case SSH_OPTIONS_SSH1:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
int *x = (int *) value;
|
int *x = (int *) value;
|
||||||
@@ -502,6 +530,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_SSH2:
|
case SSH_OPTIONS_SSH2:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
int *x = (int *) value;
|
int *x = (int *) value;
|
||||||
@@ -510,6 +539,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_LOG_VERBOSITY:
|
case SSH_OPTIONS_LOG_VERBOSITY:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
int *x = (int *) value;
|
int *x = (int *) value;
|
||||||
@@ -518,30 +548,38 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
}
|
}
|
||||||
case SSH_OPTIONS_CIPHERS_C_S:
|
case SSH_OPTIONS_CIPHERS_C_S:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
ssh_options_set_algo(session, SSH_CRYPT_C_S, value);
|
if (ssh_options_set_algo(session, SSH_CRYPT_C_S, value) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_CIPHERS_S_C:
|
case SSH_OPTIONS_CIPHERS_S_C:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
ssh_options_set_algo(session, SSH_CRYPT_S_C, value);
|
if (ssh_options_set_algo(session, SSH_CRYPT_S_C, value) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_COMPRESSION_C_S:
|
case SSH_OPTIONS_COMPRESSION_C_S:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
ssh_options_set_algo(session, SSH_COMP_C_S, value);
|
if (ssh_options_set_algo(session, SSH_COMP_C_S, value) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_OPTIONS_COMPRESSION_S_C:
|
case SSH_OPTIONS_COMPRESSION_S_C:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
ssh_options_set_algo(session, SSH_COMP_S_C, value);
|
if (ssh_options_set_algo(session, SSH_COMP_S_C, value) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -566,6 +604,7 @@ static int ssh_bind_options_set_algo(ssh_bind sshbind, int algo,
|
|||||||
SAFE_FREE(sshbind->wanted_methods[algo]);
|
SAFE_FREE(sshbind->wanted_methods[algo]);
|
||||||
sshbind->wanted_methods[algo] = strdup(list);
|
sshbind->wanted_methods[algo] = strdup(list);
|
||||||
if (sshbind->wanted_methods[algo] == NULL) {
|
if (sshbind->wanted_methods[algo] == NULL) {
|
||||||
|
ssh_set_error_oom(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,23 +625,28 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case SSH_BIND_OPTIONS_HOSTKEY:
|
case SSH_BIND_OPTIONS_HOSTKEY:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
ssh_bind_options_set_algo(sshbind, SSH_HOSTKEYS, value);
|
if (ssh_bind_options_set_algo(sshbind, SSH_HOSTKEYS, value) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_BIND_OPTIONS_BINDADDR:
|
case SSH_BIND_OPTIONS_BINDADDR:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
sshbind->bindaddr = strdup(value);
|
sshbind->bindaddr = strdup(value);
|
||||||
if (sshbind->bindaddr == NULL) {
|
if (sshbind->bindaddr == NULL) {
|
||||||
|
ssh_set_error_oom(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_BIND_OPTIONS_BINDPORT:
|
case SSH_BIND_OPTIONS_BINDPORT:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
int *x = (int *) value;
|
int *x = (int *) value;
|
||||||
@@ -611,30 +655,36 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
|
|||||||
break;
|
break;
|
||||||
case SSH_BIND_OPTIONS_DSAKEY:
|
case SSH_BIND_OPTIONS_DSAKEY:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
sshbind->dsakey = strdup(value);
|
sshbind->dsakey = strdup(value);
|
||||||
if (sshbind->dsakey == NULL) {
|
if (sshbind->dsakey == NULL) {
|
||||||
|
ssh_set_error_oom(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_BIND_OPTIONS_RSAKEY:
|
case SSH_BIND_OPTIONS_RSAKEY:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
sshbind->rsakey = strdup(value);
|
sshbind->rsakey = strdup(value);
|
||||||
if (sshbind->rsakey == NULL) {
|
if (sshbind->rsakey == NULL) {
|
||||||
|
ssh_set_error_oom(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_BIND_OPTIONS_BANNER:
|
case SSH_BIND_OPTIONS_BANNER:
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(sshbind, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
sshbind->banner = strdup(value);
|
sshbind->banner = strdup(value);
|
||||||
if (sshbind->banner == NULL) {
|
if (sshbind->banner == NULL) {
|
||||||
|
ssh_set_error_oom(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -669,7 +719,11 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
|
|||||||
*/
|
*/
|
||||||
int ssh_set_status_callback(ssh_session session,
|
int ssh_set_status_callback(ssh_session session,
|
||||||
void (*callback)(void *arg, float status), void *arg) {
|
void (*callback)(void *arg, float status), void *arg) {
|
||||||
if (session == NULL || callback == NULL || session->callbacks == NULL) {
|
if (session == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (callback == NULL || session->callbacks == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,7 +751,11 @@ int ssh_set_status_callback(ssh_session session,
|
|||||||
*/
|
*/
|
||||||
int ssh_set_log_callback(ssh_session session, ssh_log_callback cb,
|
int ssh_set_log_callback(ssh_session session, ssh_log_callback cb,
|
||||||
void *userdata) {
|
void *userdata) {
|
||||||
if (session == NULL || cb == NULL || session->callbacks == NULL) {
|
if (session == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (cb == NULL || session->callbacks == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -722,7 +780,11 @@ int ssh_set_log_callback(ssh_session session, ssh_log_callback cb,
|
|||||||
*/
|
*/
|
||||||
int ssh_set_auth_callback(ssh_session session, ssh_auth_callback cb,
|
int ssh_set_auth_callback(ssh_session session, ssh_auth_callback cb,
|
||||||
void *userdata) {
|
void *userdata) {
|
||||||
if (session == NULL || cb == NULL || session->callbacks == NULL) {
|
if (session == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (cb == NULL || session->callbacks == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -785,6 +847,7 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
|
|||||||
|
|
||||||
save = malloc(argc * sizeof(char *));
|
save = malloc(argc * sizeof(char *));
|
||||||
if (save == NULL) {
|
if (save == NULL) {
|
||||||
|
ssh_set_error_oom(options);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -836,6 +899,7 @@ int ssh_options_getopt(ssh_options options, int *argcptr, char **argv) {
|
|||||||
save[current] = strdup(opt);
|
save[current] = strdup(opt);
|
||||||
if (save[current] == NULL) {
|
if (save[current] == NULL) {
|
||||||
SAFE_FREE(save);
|
SAFE_FREE(save);
|
||||||
|
ssh_set_error_oom(options);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
current++;
|
current++;
|
||||||
@@ -937,7 +1001,11 @@ int ssh_options_parse_config(ssh_options opt, const char *filename) {
|
|||||||
char *expanded_filename;
|
char *expanded_filename;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (opt == NULL || opt->host == NULL) {
|
if (opt == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (opt->host == NULL) {
|
||||||
|
ssh_set_error_invalid(opt, __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user