Changelog
Daniel S (28 April 2007)
+- Peter O'Gorman fixed libcurl to not init GnuTLS as early as we did before,
+ since it then inits libgcrypt and libgcrypt is being evil and EXITS the
+ application if it fails to get a fine random seed. That's really not a nice
+ thing to do by a library.
+
- Frank Hempel fixed a curl_easy_duphandle() crash on a handle that had
been removed from a multi handle, and then fixed another flaw that prevented
curl_easy_duphandle() to work even after the first fix - the handle was
o compilation on VMS 64-bit mode
o SCP/SFTP downloads could hang on the last bytes of a transfer
o curl_easy_duphandle() crash
+ o curl -V / curl_verion*() works even when GnuTLS is used on a system without
+ a good random source
This release includes the following known bugs:
fprintf(stderr, "|<%d>| %s", level, str);
}
#endif
-
+static bool gtls_inited = FALSE;
/*
* Custom push and pull callback functions used by GNU TLS to read and write
* to the socket. These functions are simple wrappers to send() and recv()
/* Global GnuTLS init, called from Curl_ssl_init() */
int Curl_gtls_init(void)
{
- gnutls_global_init();
+/* Unfortunately we can not init here, things like curl --version will
+ * fail to work if there is no egd socket available because libgcrypt
+ * will EXIT the application!!
+ * By doing the actual init later (before actually trying to use GnuTLS),
+ * we can at least provide basic info etc.
+ */
+ return 1;
+}
+
+static int _Curl_gtls_init(void)
+{
+ int ret = 1;
+ if (!gtls_inited) {
+ ret = gnutls_global_init()?0:1;
#ifdef GTLSDEBUG
- gnutls_global_set_log_function(tls_log_func);
- gnutls_global_set_log_level(2);
+ gnutls_global_set_log_function(tls_log_func);
+ gnutls_global_set_log_level(2);
#endif
- return 1;
+ gtls_inited = TRUE;
+ }
+ return ret;
}
int Curl_gtls_cleanup(void)
{
- gnutls_global_deinit();
+ if (gtls_inited)
+ gnutls_global_deinit();
return 1;
}
{
struct SessionHandle *data = conn->data;
int rc;
-
+ if (!gtls_inited)
+ _Curl_gtls_init();
do {
rc = gnutls_handshake(session);
void *ssl_sessionid;
size_t ssl_idsize;
+ if (!gtls_inited) _Curl_gtls_init();
/* GnuTLS only supports TLSv1 (and SSLv3?) */
if(data->set.ssl.version == CURL_SSLVERSION_SSLv2) {
failf(data, "GnuTLS does not support SSLv2");