summaryrefslogtreecommitdiff
path: root/sal/osl/unx/salinit.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sal/osl/unx/salinit.cxx')
-rw-r--r--sal/osl/unx/salinit.cxx32
1 files changed, 32 insertions, 0 deletions
diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx
index bc9fc221f7e9..2396388aafff 100644
--- a/sal/osl/unx/salinit.cxx
+++ b/sal/osl/unx/salinit.cxx
@@ -28,12 +28,44 @@
#include "sal/config.h"
+#if defined MACOSX
+#include <cassert>
+#include <limits>
+#include <unistd.h>
+#endif
+
#include "osl/process.h"
#include "sal/types.h"
extern "C" {
SAL_DLLPUBLIC void SAL_CALL sal_detail_initialize(int argc, char ** argv) {
+#if defined MACOSX
+ // On Mac OS X, soffice can restart itself via exec (see restartOnMac in
+ // desktop/source/app/app.cxx), which leaves all file descriptors open,
+ // which in turn can have unwanted effects (see
+ // <https://bugs.freedesktop.org/show_bug.cgi?id=50603> "Unable to update
+ // LibreOffice without resetting user profile"). But closing fds in
+ // restartOnMac before calling exec does not work, as additional threads
+ // might still be running then, wich can still use those fds and cause
+ // crashes. Therefore, the simples solution is to close fds at process
+ // start (as early as possible, so that no other threads have been created
+ // yet that might already have opened some fds); this is done for all kinds
+ // of processes here, not just soffice, but hopefully none of our processes
+ // rely on being spawned with certain fds already open. Unfortunately, Mac
+ // OS X appears to have no better interface to close all fds (like
+ // closefrom):
+ long openMax = sysconf(_SC_OPEN_MAX);
+ if (openMax == -1) {
+ // Some random value, but hopefully sysconf never returns -1 anyway:
+ openMax = 1024;
+ }
+ assert(openMax >= 0 && openMax <= std::numeric_limits< int >::max());
+ for (int fd = 3; fd < openMax; ++fd) {
+ close(fd);
+ }
+#endif
+
osl_setCommandArgs(argc, argv);
}