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:
committed by
Andreas Schneider
parent
040a543f57
commit
3ae01ff9f5
8
src/dh.c
8
src/dh.c
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
24
src/socket.c
24
src/socket.c
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user