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)

Reply via email to