diff --git a/bin/find-can-be-private-symbols.functions.results b/bin/find-can-be-private-symbols.functions.results index bc776435eb0e..4080a49fb984 100644 --- a/bin/find-can-be-private-symbols.functions.results +++ b/bin/find-can-be-private-symbols.functions.results @@ -13449,6 +13449,7 @@ linguistic::SpellAlternatives::SetFailureType(short) linguistic::SpellAlternatives::SetWordLanguage(rtl::OUString const&, o3tl::strong_int) linguistic::SpellAlternatives::SpellAlternatives() load_BLAS +lok_open_urandom longdual_testset lower_utf(w_char, int) lp_solve_version diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 9b49a9c934a6..f1ca1291aed0 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -31,8 +31,10 @@ #undef HAVE_MALLOC_TRIM +#ifdef UNX +# include +#endif #ifdef LINUX -#include #if defined __GLIBC__ # include # define HAVE_MALLOC_TRIM @@ -234,6 +236,20 @@ using namespace bridge; using namespace uno; using namespace lang; +#ifdef UNX + +static int urandom = -1; + +extern "C" { + int SAL_JNI_EXPORT lok_open_urandom() + { + return dup(urandom); + } +}; + +#endif + + using LanguageToolCfg = officecfg::Office::Linguistic::GrammarChecking::LanguageTool; static LibLibreOffice_Impl *gImpl = nullptr; @@ -7903,6 +7919,10 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char const char* tz = ::getenv("TZ"); SfxLokHelper::setDefaultTimezone(!!tz, tz ? OStringToOUString(tz, RTL_TEXTENCODING_UTF8) : OUString()); +#ifdef UNX + if (urandom < 0) + urandom = open("/dev/urandom", O_RDONLY); +#endif } if (eStage != SECOND_INIT) diff --git a/sal/osl/unx/random.cxx b/sal/osl/unx/random.cxx index fbb2d7dedb90..743379818b57 100644 --- a/sal/osl/unx/random.cxx +++ b/sal/osl/unx/random.cxx @@ -13,13 +13,19 @@ #include #include #include +#include bool osl_get_system_random_data(char* buffer, size_t desired_len) { int fd; assert(buffer); - fd = open("/dev/urandom", O_RDONLY); + + static int (*lok_open_urandom)() + = reinterpret_cast(dlsym(RTLD_DEFAULT, "lok_open_urandom")); + if (!lok_open_urandom || (fd = lok_open_urandom()) < 0) + fd = open("/dev/urandom", O_RDONLY); + if (fd != -1) { while (desired_len)