dnl No fork on MinGW, disable some self-tests until we fix them.
dnl Check clock_gettime and pthread_mutex_lock in libc (avoid linking to other libs)
-AC_CHECK_FUNCS([fork inet_ntop inet_pton getrusage getpwuid_r nanosleep daemon getpid clock_gettime iconv localtime vasprintf],,)
+AC_CHECK_FUNCS([fork inet_ntop inet_pton getrusage getpwuid_r nanosleep daemon getpid clock_gettime iconv localtime fmemopen vasprintf],,)
if test "$ac_cv_func_vasprintf" != "yes";then
AC_MSG_CHECKING([for va_copy])
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <atfork.h>
#include <system-keys.h>
#include "str.h"
+#include "global.h"
/* Minimum library versions we accept. */
#define GNUTLS_MIN_LIBTASN1_VERSION "0.3.4"
_gnutls_register_accel_crypto();
_gnutls_cryptodev_init();
+ _gnutls_load_system_priorities();
#ifdef ENABLE_FIPS140
/* These self tests are performed on the overriden algorithms
_gnutls_cryptodev_deinit();
_gnutls_supplemental_deinit();
+ _gnutls_unload_system_priorities();
#ifdef ENABLE_PKCS11
/* Do not try to deinitialize the PKCS #11 libraries
#define MAX_ELEMENTS 64
+char *_gnutls_resolve_priorities(const char* priorities);
static void prio_remove(priority_st * priority_list, unsigned int algo);
static void prio_add(priority_st * priority_list, unsigned int algo);
static void
return NULL;
}
+static const char *system_priority_file = SYSTEM_PRIORITY_FILE;
+static char *system_priority_buf = NULL;
+static size_t system_priority_buf_size = 0;
+
+void _gnutls_load_system_priorities(void)
+{
+ gnutls_datum_t data;
+ const char *p;
+ int ret;
+
+ p = getenv("GNUTLS_SYSTEM_PRIORITY_FILE");
+ if (p != NULL)
+ system_priority_file = p;
+
+#ifdef HAVE_FMEMOPEN
+ ret = gnutls_load_file(system_priority_file, &data);
+ if (ret < 0)
+ return;
+
+ system_priority_buf = (char*)data.data;
+ system_priority_buf_size = data.size;
+#endif
+ return;
+}
+
+void _gnutls_unload_system_priorities(void)
+{
+#ifdef HAVE_FMEMOPEN
+ gnutls_free(system_priority_buf);
+#endif
+ system_priority_buf = NULL;
+ system_priority_buf_size = 0;
+}
+
/* Returns the new priorities if SYSTEM is specified in
* an allocated string, or just a copy of the provided
* priorities, appended with any additional present in
*
* The returned string must be released using free().
*/
-static char *resolve_priorities(const char* priorities)
+char *_gnutls_resolve_priorities(const char* priorities)
{
char *p = (char*)priorities;
char *additional = NULL;
ss_len = strlen(ss);
}
- fp = fopen(SYSTEM_PRIORITY_FILE, "r");
+#ifdef HAVE_FMEMOPEN
+ fp = fmemopen(system_priority_buf, system_priority_buf_size, "r");
+#endif
+ if (fp == NULL)
+ fp = fopen(system_priority_file, "r");
if (fp == NULL) {/* fail */
ret = NULL;
goto finish;
if (priorities == NULL)
priorities = "NORMAL";
- darg = resolve_priorities(priorities);
+ darg = _gnutls_resolve_priorities(priorities);
if (darg == NULL) {
gnutls_assert();
goto error;