1
1

Fixed a bunch of smallish bugs

http://linuxtesting.org/upstream-tracker/test_results/libssh/current/test_results.html
for a whole list
Этот коммит содержится в:
Aris Adamantiadis 2010-10-20 14:47:11 +02:00
родитель 8e2699e161
Коммит 98221f4e36
5 изменённых файлов: 56 добавлений и 17 удалений

Просмотреть файл

@ -423,6 +423,12 @@ int ssh_userauth_offer_pubkey(ssh_session session, const char *username,
ssh_string algo = NULL; ssh_string algo = NULL;
int rc = SSH_AUTH_ERROR; int rc = SSH_AUTH_ERROR;
if(session==NULL)
return SSH_AUTH_ERROR;
if(publickey==NULL){
ssh_set_error(session,SSH_FATAL,"invalid arguments");
return SSH_AUTH_ERROR;
}
enter_function(); enter_function();
#ifdef WITH_SSH1 #ifdef WITH_SSH1
@ -540,6 +546,12 @@ int ssh_userauth_pubkey(ssh_session session, const char *username,
ssh_string pkstr = NULL; ssh_string pkstr = NULL;
int rc = SSH_AUTH_ERROR; int rc = SSH_AUTH_ERROR;
if(session==NULL)
return SSH_AUTH_ERROR;
if(privatekey==NULL){
ssh_set_error(session,SSH_FATAL,"invalid arguments");
return SSH_AUTH_ERROR;
}
enter_function(); enter_function();
#if 0 #if 0
@ -1583,6 +1595,8 @@ int ssh_userauth_kbdint(ssh_session session, const char *user,
* @returns The number of prompts. * @returns The number of prompts.
*/ */
int ssh_userauth_kbdint_getnprompts(ssh_session session) { int ssh_userauth_kbdint_getnprompts(ssh_session session) {
if(session==NULL || session->kbdint == NULL)
return SSH_ERROR;
return session->kbdint->nprompts; return session->kbdint->nprompts;
} }
@ -1597,6 +1611,8 @@ int ssh_userauth_kbdint_getnprompts(ssh_session session) {
* @returns The name of the message block. Do not free it. * @returns The name of the message block. Do not free it.
*/ */
const char *ssh_userauth_kbdint_getname(ssh_session session) { const char *ssh_userauth_kbdint_getname(ssh_session session) {
if(session==NULL || session->kbdint == NULL)
return NULL;
return session->kbdint->name; return session->kbdint->name;
} }
@ -1612,6 +1628,8 @@ const char *ssh_userauth_kbdint_getname(ssh_session session) {
*/ */
const char *ssh_userauth_kbdint_getinstruction(ssh_session session) { const char *ssh_userauth_kbdint_getinstruction(ssh_session session) {
if(session==NULL || session->kbdint == NULL)
return NULL;
return session->kbdint->instruction; return session->kbdint->instruction;
} }
@ -1633,7 +1651,9 @@ const char *ssh_userauth_kbdint_getinstruction(ssh_session session) {
*/ */
const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i, const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i,
char *echo) { char *echo) {
if (i > session->kbdint->nprompts) { if(session==NULL || session->kbdint == NULL)
return NULL;
if (i > session->kbdint->nprompts) {
return NULL; return NULL;
} }
@ -1660,7 +1680,8 @@ const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i,
*/ */
int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i, int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,
const char *answer) { const char *answer) {
if (session == NULL || answer == NULL || i > session->kbdint->nprompts) { if (session == NULL || answer == NULL || session->kbdint == NULL ||
i > session->kbdint->nprompts) {
return -1; return -1;
} }

Просмотреть файл

@ -832,23 +832,24 @@ int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash) {
unsigned char *h; unsigned char *h;
if (session == NULL || hash == NULL) { if (session == NULL || hash == NULL) {
return -1; return SSH_ERROR;
} }
*hash = NULL; *hash = NULL;
if (session->current_crypto == NULL || if (session->current_crypto == NULL ||
session->current_crypto->server_pubkey == NULL){ session->current_crypto->server_pubkey == NULL){
ssh_set_error(session,SSH_FATAL,"No current cryptographic context"); ssh_set_error(session,SSH_FATAL,"No current cryptographic context");
return SSH_ERROR;
} }
h = malloc(sizeof(unsigned char *) * MD5_DIGEST_LEN); h = malloc(sizeof(unsigned char *) * MD5_DIGEST_LEN);
if (h == NULL) { if (h == NULL) {
return -1; return SSH_ERROR;
} }
ctx = md5_init(); ctx = md5_init();
if (ctx == NULL) { if (ctx == NULL) {
SAFE_FREE(h); SAFE_FREE(h);
return -1; return SSH_ERROR;
} }
pubkey = session->current_crypto->server_pubkey; pubkey = session->current_crypto->server_pubkey;
@ -877,6 +878,10 @@ void ssh_clean_pubkey_hash(unsigned char **hash) {
} }
ssh_string ssh_get_pubkey(ssh_session session){ ssh_string ssh_get_pubkey(ssh_session session){
if(session==NULL || session->current_crypto ==NULL ||
session->current_crypto->server_pubkey==NULL)
return NULL;
else
return ssh_string_copy(session->current_crypto->server_pubkey); return ssh_string_copy(session->current_crypto->server_pubkey);
} }

Просмотреть файл

@ -802,7 +802,7 @@ ssh_private_key privatekey_from_file(ssh_session session, const char *filename,
#endif #endif
return NULL; return NULL;
} }
ZERO_STRUCTP(privkey);
privkey->type = type; privkey->type = type;
privkey->dsa_priv = dsa; privkey->dsa_priv = dsa;
privkey->rsa_priv = rsa; privkey->rsa_priv = rsa;
@ -955,23 +955,28 @@ int ssh_publickey_to_file(ssh_session session, const char *file,
unsigned char *pubkey_64; unsigned char *pubkey_64;
size_t len; size_t len;
int rc; int rc;
if(session==NULL)
return SSH_ERROR;
if(file==NULL || pubkey==NULL){
ssh_set_error(session, SSH_FATAL, "Invalid parameters");
return SSH_ERROR;
}
pubkey_64 = bin_to_base64(pubkey->string, ssh_string_len(pubkey)); pubkey_64 = bin_to_base64(pubkey->string, ssh_string_len(pubkey));
if (pubkey_64 == NULL) { if (pubkey_64 == NULL) {
return -1; return SSH_ERROR;
} }
user = ssh_get_local_username(session); user = ssh_get_local_username(session);
if (user == NULL) { if (user == NULL) {
SAFE_FREE(pubkey_64); SAFE_FREE(pubkey_64);
return -1; return SSH_ERROR;
} }
rc = gethostname(host, sizeof(host)); rc = gethostname(host, sizeof(host));
if (rc < 0) { if (rc < 0) {
SAFE_FREE(user); SAFE_FREE(user);
SAFE_FREE(pubkey_64); SAFE_FREE(pubkey_64);
return -1; return SSH_ERROR;
} }
snprintf(buffer, sizeof(buffer), "%s %s %s@%s\n", snprintf(buffer, sizeof(buffer), "%s %s %s@%s\n",
@ -990,7 +995,7 @@ int ssh_publickey_to_file(ssh_session session, const char *file,
if (fp == NULL) { if (fp == NULL) {
ssh_set_error(session, SSH_REQUEST_DENIED, ssh_set_error(session, SSH_REQUEST_DENIED,
"Error opening %s: %s", file, strerror(errno)); "Error opening %s: %s", file, strerror(errno));
return -1; return SSH_ERROR;
} }
len = strlen(buffer); len = strlen(buffer);
@ -999,11 +1004,11 @@ int ssh_publickey_to_file(ssh_session session, const char *file,
"Unable to write to %s", file); "Unable to write to %s", file);
fclose(fp); fclose(fp);
unlink(file); unlink(file);
return -1; return SSH_ERROR;
} }
fclose(fp); fclose(fp);
return 0; return SSH_OK;
} }
/** /**

Просмотреть файл

@ -329,7 +329,7 @@ ssh_public_key publickey_from_privatekey(ssh_private_key prv) {
if (key == NULL) { if (key == NULL) {
return NULL; return NULL;
} }
ZERO_STRUCTP(key);
key->type = prv->type; key->type = prv->type;
switch(key->type) { switch(key->type) {
case SSH_KEYTYPE_DSS: case SSH_KEYTYPE_DSS:
@ -466,6 +466,9 @@ ssh_public_key publickey_from_privatekey(ssh_private_key prv) {
} }
#endif #endif
break; break;
default:
publickey_free(key);
return NULL;
} }
key->type_c = ssh_type_to_char(prv->type); key->type_c = ssh_type_to_char(prv->type);
@ -715,7 +718,8 @@ ssh_string publickey_to_string(ssh_public_key key) {
ssh_string_fill(ret, buffer_get_rest(buf), buffer_get_rest_len(buf)); ssh_string_fill(ret, buffer_get_rest(buf), buffer_get_rest_len(buf));
error: error:
ssh_buffer_free(buf); ssh_buffer_free(buf);
ssh_string_free(type); if(type != NULL)
ssh_string_free(type);
return ret; return ret;
} }

Просмотреть файл

@ -131,8 +131,12 @@ size_t ssh_string_len(struct ssh_string_struct *s) {
* string may not be readable with regular libc functions. * string may not be readable with regular libc functions.
*/ */
char *ssh_string_to_char(struct ssh_string_struct *s) { char *ssh_string_to_char(struct ssh_string_struct *s) {
size_t len = ntohl(s->size) + 1; size_t len;
char *new = malloc(len); char *new;
if(s==NULL)
return NULL;
len = ntohl(s->size) + 1;
new = malloc(len);
if (new == NULL) { if (new == NULL) {
return NULL; return NULL;