1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-11-27 13:21:11 +03:00

init: Some initialization fixes.

- Check result of ssh_init() in privatekey_from_base64()
- Moved code from ssh_finalize() to appropriate subroutines
- Only initialize sockets once (caused mismatch of WSAStartup() and
  WSACleanup() calls and potential usage of bsd_poll when win_poll
  should be used)
This commit is contained in:
Oliver Stöneberg
2011-04-26 16:06:46 -07:00
committed by Andreas Schneider
parent 040a543f57
commit 3ae01ff9f5
4 changed files with 28 additions and 17 deletions

View File

@@ -140,6 +140,7 @@ int ssh_crypto_init(void) {
} }
bignum_bin2bn(p_value, P_LEN, p); bignum_bin2bn(p_value, P_LEN, p);
OpenSSL_add_all_algorithms(); OpenSSL_add_all_algorithms();
#endif #endif
ssh_crypto_initialized = 1; ssh_crypto_initialized = 1;
@@ -154,8 +155,13 @@ void ssh_crypto_finalize(void) {
g = NULL; g = NULL;
bignum_free(p); bignum_free(p);
p = NULL; p = NULL;
#ifdef HAVE_LIBGCRYPT
gcry_control(GCRYCTL_TERM_SECMEM);
#elif defined HAVE_LIBCRYPTO
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
#endif
ssh_crypto_initialized=0; ssh_crypto_initialized=0;
} }
} }

View File

@@ -73,15 +73,6 @@ int ssh_init(void) {
int ssh_finalize(void) { int ssh_finalize(void) {
ssh_crypto_finalize(); ssh_crypto_finalize();
ssh_socket_cleanup(); ssh_socket_cleanup();
#ifdef HAVE_LIBGCRYPT
gcry_control(GCRYCTL_TERM_SECMEM);
#elif defined HAVE_LIBCRYPTO
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
#endif
#ifdef _WIN32
WSACleanup();
#endif
/* It is important to finalize threading after CRYPTO because /* It is important to finalize threading after CRYPTO because
* it still depends on it */ * it still depends on it */
ssh_threads_finalize(); ssh_threads_finalize();

View File

@@ -988,7 +988,9 @@ ssh_private_key privatekey_from_base64(ssh_session session, const char *b64_pkey
} }
/* needed for openssl initialization */ /* needed for openssl initialization */
ssh_init(); if (ssh_init() < 0) {
return NULL;
}
ssh_log(session, SSH_LOG_RARE, "Trying to read privkey type=%s, passphase=%s, authcb=%s", ssh_log(session, SSH_LOG_RARE, "Trying to read privkey type=%s, passphase=%s, authcb=%s",
type ? type == SSH_KEYTYPE_DSS ? "ssh-dss" : "ssh-rsa": "unknown", type ? type == SSH_KEYTYPE_DSS ? "ssh-dss" : "ssh-rsa": "unknown",

View File

@@ -91,6 +91,8 @@ struct ssh_socket_struct {
ssh_poll_handle poll_out; ssh_poll_handle poll_out;
}; };
static int sockets_initialized = 0;
static int ssh_socket_unbuffered_read(ssh_socket s, void *buffer, uint32_t len); static int ssh_socket_unbuffered_read(ssh_socket s, void *buffer, uint32_t len);
static int ssh_socket_unbuffered_write(ssh_socket s, const void *buffer, static int ssh_socket_unbuffered_write(ssh_socket s, const void *buffer,
uint32_t len); uint32_t len);
@@ -100,16 +102,20 @@ static int ssh_socket_unbuffered_write(ssh_socket s, const void *buffer,
* \brief inits the socket system (windows specific) * \brief inits the socket system (windows specific)
*/ */
int ssh_socket_init(void) { int ssh_socket_init(void) {
if (sockets_initialized == 0) {
#ifdef _WIN32 #ifdef _WIN32
struct WSAData wsaData; struct WSAData wsaData;
/* Initiates use of the Winsock DLL by a process. */ /* Initiates use of the Winsock DLL by a process. */
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
return -1; return -1;
} }
#endif #endif
ssh_poll_init(); ssh_poll_init();
sockets_initialized = 1;
}
return 0; return 0;
} }
@@ -118,7 +124,13 @@ int ssh_socket_init(void) {
* @brief Cleanup the socket system. * @brief Cleanup the socket system.
*/ */
void ssh_socket_cleanup(void) { void ssh_socket_cleanup(void) {
if (sockets_initialized == 1) {
ssh_poll_cleanup(); ssh_poll_cleanup();
#ifdef _WIN32
WSACleanup();
#endif
sockets_initialized = 0;
}
} }