From c2ae057d0e455ed40127fec931b803ff628bffb7 Mon Sep 17 00:00:00 2001 From: Andy Moreton Date: Wed, 20 Dec 2017 20:07:54 -0500 Subject: [PATCH] Work around GnuTLS version issues with %DUMBFW (tiny change) * src/gnutls.c: Introduce HAVE_GNUTLS_EXT_GET_NAME and use it. (init_gnutls_functions): Use it. (Fgnutls_available_p): Use it (Bug#25061). Fix Vlibrary_cache bug. --- src/gnutls.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/gnutls.c b/src/gnutls.c index 8db201ae834..48ea25397a1 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -46,6 +46,10 @@ along with GNU Emacs. If not, see . */ # define HAVE_GNUTLS_MAC_GET_NONCE_SIZE #endif +#if GNUTLS_VERSION_NUMBER >= 0x030501 +# define HAVE_GNUTLS_EXT_GET_NAME +#endif + #ifdef HAVE_GNUTLS # ifdef WINDOWSNT @@ -237,6 +241,9 @@ DEF_DLL_FN (int, gnutls_hash_get_len, (gnutls_digest_algorithm_t)); DEF_DLL_FN (int, gnutls_hash, (gnutls_hash_hd_t, const void *, size_t)); DEF_DLL_FN (void, gnutls_hash_deinit, (gnutls_hash_hd_t, void *)); DEF_DLL_FN (void, gnutls_hash_output, (gnutls_hash_hd_t, void *)); +# ifdef HAVE_GNUTLS_EXT_GET_NAME +DEF_DLL_FN (const char *, gnutls_ext_get_name, (unsigned int)); +# endif # endif /* HAVE_GNUTLS3 */ @@ -356,6 +363,9 @@ init_gnutls_functions (void) LOAD_DLL_FN (library, gnutls_hash); LOAD_DLL_FN (library, gnutls_hash_deinit); LOAD_DLL_FN (library, gnutls_hash_output); +# ifdef HAVE_GNUTLS_EXT_GET_NAME + LOAD_DLL_FN (library, gnutls_ext_get_name); +# endif # endif /* HAVE_GNUTLS3 */ max_log_level = global_gnutls_log_level; @@ -469,8 +479,12 @@ init_gnutls_functions (void) # define gnutls_hash fn_gnutls_hash # define gnutls_hash_deinit fn_gnutls_hash_deinit # define gnutls_hash_output fn_gnutls_hash_output +# ifdef HAVE_GNUTLS_EXT_GET_NAME +# define gnutls_ext_get_name fn_gnutls_ext_get_name +# endif # endif /* HAVE_GNUTLS3 */ + /* This wrapper is called from fns.c, which doesn't know about the LOAD_DLL_FN stuff above. */ int @@ -2425,6 +2439,18 @@ Any GnuTLS extension with ID up to 100 #ifdef HAVE_GNUTLS +# ifdef WINDOWSNT + Lisp_Object found = Fassq (Qgnutls, Vlibrary_cache); + if (CONSP (found)) + return XCDR (found); + + /* Load the GnuTLS DLL and find exported functions. The external + library cache is updated after the capabilities have been + determined. */ + if (!init_gnutls_functions ()) + return Qnil; +# endif /* WINDOWSNT */ + capabilities = Fcons (intern("gnutls"), capabilities); # ifdef HAVE_GNUTLS3 @@ -2437,8 +2463,8 @@ Any GnuTLS extension with ID up to 100 # endif capabilities = Fcons (intern("macs"), capabilities); -# endif /* HAVE_GNUTLS3 */ +# ifdef HAVE_GNUTLS_EXT_GET_NAME for (unsigned int ext=0; ext < 100; ext++) { const char* name = gnutls_ext_get_name(ext); @@ -2447,18 +2473,11 @@ Any GnuTLS extension with ID up to 100 capabilities = Fcons (intern(name), capabilities); } } +# endif +# endif /* HAVE_GNUTLS3 */ # ifdef WINDOWSNT - Lisp_Object found = Fassq (Qgnutls, Vlibrary_cache); - if (CONSP (found)) - return XCDR (found); - else - { - Lisp_Object status; - status = init_gnutls_functions () ? capabilities : Qnil; - Vlibrary_cache = Fcons (Fcons (Qgnutls, status), Vlibrary_cache); - return status; - } + Vlibrary_cache = Fcons (Fcons (Qgnutls, capabilities), Vlibrary_cache); # endif /* WINDOWSNT */ #endif /* HAVE_GNUTLS */ -- 2.39.2