1
0
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:
Bernhard R. Link
2009-10-04 14:19:19 +02:00
committed by Andreas Schneider
parent f1f17f18dc
commit ff52e3630f

View File

@@ -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;
} }