bin/find-can-be-private-symbols.functions.results | 1 + desktop/source/lib/init.cxx | 22 +++++++++++++++++++++- sal/osl/unx/random.cxx | 8 +++++++- 3 files changed, 29 insertions(+), 2 deletions(-)
New commits: commit b99082e4f3d4e4d13433ca062ba98da7cd14aa9a Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri Apr 5 14:56:13 2024 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Mon Apr 15 15:28:41 2024 +0200 lok: provide global random symbol to find random device. This is vital for lok when used in a jail with no random device, but with an inherited file-handle to /dev/urandom. Use 'dup' to avoid changing code that wants to 'close' the handle after use. Change-Id: I15f40fb251f180a2394af030f56e47f2bf9651d4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166113 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> 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<unsigned short, LanguageTypeTag>) 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 <fcntl.h> +#endif #ifdef LINUX -#include <fcntl.h> #if defined __GLIBC__ # include <malloc.h> # 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 <errno.h> #include <fcntl.h> #include <unistd.h> +#include <dlfcn.h> 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<int (*)()>(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)