[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-2-1' - common/Seccomp.cpp kit/Kit.cpp loolwsd.xml.in wsd/Admin.cpp wsd/AdminModel.hpp wsd/LOOLWSD.cpp

Marco Cecchetti marco.cecchetti at collabora.com
Tue Sep 26 12:03:33 UTC 2017


 common/Seccomp.cpp |   19 ++++++++++++++++++-
 kit/Kit.cpp        |    7 ++++++-
 loolwsd.xml.in     |    1 +
 wsd/Admin.cpp      |    8 ++++++--
 wsd/AdminModel.hpp |    3 ++-
 wsd/LOOLWSD.cpp    |    3 +++
 6 files changed, 36 insertions(+), 5 deletions(-)

New commits:
commit c95a5ce3f86272c7f9711bb6b358c1dde5bc2eb8
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Tue Sep 26 13:15:11 2017 +0200

    wsd: support for FSIZE and NOFILE system limits
    
    The routine for handling the configuration for the max file size
    limit, was wrongly using NOFILE. Now we handle both limits correctly.
    
    Change-Id: Ie8b63617286f66af6d4eb1b35b9e4f4b28f3c2a6
    Reviewed-on: https://gerrit.libreoffice.org/42803
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/common/Seccomp.cpp b/common/Seccomp.cpp
index ee074b3c..8eebdb12 100644
--- a/common/Seccomp.cpp
+++ b/common/Seccomp.cpp
@@ -269,11 +269,28 @@ bool handleSetrlimitCommand(const std::vector<std::string>& tokens)
                 lim = RLIM_INFINITY;
 
             rlimit rlim = { lim, lim };
+            if (setrlimit(RLIMIT_FSIZE, &rlim) != 0)
+                LOG_SYS("Failed to set RLIMIT_NOFILE to " << lim << " bytes.");
+
+            if (getrlimit(RLIMIT_FSIZE, &rlim) == 0)
+                LOG_INF("RLIMIT_FSIZE is " << rlim.rlim_max << " bytes after setting it to " << lim << " bytes.");
+            else
+                LOG_SYS("Failed to get RLIMIT_FSIZE.");
+
+            return true;
+        }
+        else if (tokens[1] == "limit_num_open_files")
+        {
+            rlim_t lim = std::stoi(tokens[2]);
+            if (lim <= 0)
+                lim = RLIM_INFINITY;
+
+            rlimit rlim = { lim, lim };
             if (setrlimit(RLIMIT_NOFILE, &rlim) != 0)
                 LOG_SYS("Failed to set RLIMIT_NOFILE to " << lim << " bytes.");
 
             if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
-                LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " bytes after setting it to " << lim << " bytes.");
+                LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " files after setting it to " << lim << " files.");
             else
                 LOG_SYS("Failed to get RLIMIT_NOFILE.");
 
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 789e4d80..d4037818 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -1914,8 +1914,13 @@ void lokit_main(const std::string& childRoot,
         else
             LOG_SYS("Failed to get RLIMIT_STACK.");
 
+        if (getrlimit(RLIMIT_FSIZE, &rlim) == 0)
+            LOG_INF("RLIMIT_FSIZE is " << rlim.rlim_max << " bytes.");
+        else
+            LOG_SYS("Failed to get RLIMIT_FSIZE.");
+
         if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
-            LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " bytes.");
+            LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " files.");
         else
             LOG_SYS("Failed to get RLIMIT_NOFILE.");
 
diff --git a/loolwsd.xml.in b/loolwsd.xml.in
index 5097d9ac..940c8567 100644
--- a/loolwsd.xml.in
+++ b/loolwsd.xml.in
@@ -23,6 +23,7 @@
         <limit_data_mem_kb desc="The maximum memory data segment allowed to each document process. 0 for unlimited." type="uint">0</limit_data_mem_kb>
         <limit_stack_mem_kb desc="The maximum stack size allowed to each document process. 0 for unlimited." type="uint">8000</limit_stack_mem_kb>
         <limit_file_size_mb desc="The maximum file size allowed to each documen process to write. 0 for unlimited." type="uint">50</limit_file_size_mb>
+        <limit_num_open_files desc="The maximum number of files allowed to each documen process to open. 0 for unlimited." type="uint">1024</limit_num_open_files>
     </per_document>
 
     <per_view desc="View-specific settings.">
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index 5ea725a7..2948029e 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -165,7 +165,8 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
         const DocProcSettings& docProcSettings = _admin->getDefDocProcSettings();
         oss << "limit_virt_mem_mb=" << docProcSettings.LimitVirtMemMb << ' '
             << "limit_stack_mem_kb=" << docProcSettings.LimitStackMemKb << ' '
-            << "limit_file_size_mb=" << docProcSettings.LimitFileSizeMb << ' ';
+            << "limit_file_size_mb=" << docProcSettings.LimitFileSizeMb << ' '
+            << "limit_num_open_files=" << docProcSettings.LimitNumberOpenFiles << ' ';
 
         sendTextFrame(oss.str());
     }
@@ -235,6 +236,8 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
                     docProcSettings.LimitStackMemKb = settingVal;
                 else if (settingName == "limit_file_size_mb")
                     docProcSettings.LimitFileSizeMb = settingVal;
+                else if (settingName == "limit_num_open_files")
+                    docProcSettings.LimitNumberOpenFiles = settingVal;
                 else
                     LOG_ERR("Unknown limit: " << settingName);
 
@@ -508,7 +511,8 @@ void Admin::notifyForkit()
     std::ostringstream oss;
     oss << "setconfig limit_virt_mem_mb " << _defDocProcSettings.LimitVirtMemMb << '\n'
         << "setconfig limit_stack_mem_kb " << _defDocProcSettings.LimitStackMemKb << '\n'
-        << "setconfig limit_file_size_mb " << _defDocProcSettings.LimitFileSizeMb << '\n';
+        << "setconfig limit_file_size_mb " << _defDocProcSettings.LimitFileSizeMb << '\n'
+        << "setconfig limit_num_open_files " << _defDocProcSettings.LimitNumberOpenFiles << '\n';
 
     if (_forKitWritePipe != -1)
         IoUtil::writeToPipe(_forKitWritePipe, oss.str());
diff --git a/wsd/AdminModel.hpp b/wsd/AdminModel.hpp
index d20f6fcd..0368a151 100644
--- a/wsd/AdminModel.hpp
+++ b/wsd/AdminModel.hpp
@@ -68,6 +68,7 @@ struct DocProcSettings
     size_t LimitDataMemKb;
     size_t LimitStackMemKb;
     size_t LimitFileSizeMb;
+    size_t LimitNumberOpenFiles;
 };
 
 /// A document in Admin controller.
@@ -132,7 +133,7 @@ private:
     std::time_t _start;
     std::time_t _lastActivity;
     std::time_t _end = 0;
-    
+
     /// Per-doc kit process settings.
     DocProcSettings _docProcSettings;
 };
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 01293fc9..c9a44397 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -631,6 +631,7 @@ void LOOLWSD::initialize(Application& self)
             { "per_document.limit_virt_mem_mb", "0" },
             { "per_document.limit_stack_mem_kb", "8000" },
             { "per_document.limit_file_size_mb", "50" },
+            { "per_document.limit_num_open_files", "1024" },
             { "per_view.out_of_focus_timeout_secs", "60" },
             { "per_view.idle_timeout_secs", "900" },
             { "loleaflet_html", "loleaflet.html" },
@@ -812,6 +813,7 @@ void LOOLWSD::initialize(Application& self)
     docProcSettings.LimitVirtMemMb = getConfigValue<int>("per_document.limit_virt_mem_mb", 0);
     docProcSettings.LimitStackMemKb = getConfigValue<int>("per_document.limit_stack_mem_kb", 0);
     docProcSettings.LimitFileSizeMb = getConfigValue<int>("per_document.limit_file_size_mb", 0);
+    docProcSettings.LimitNumberOpenFiles = getConfigValue<int>("per_document.limit_num_open_files", 0);
     Admin::instance().setDefDocProcSettings(docProcSettings, false);
 
 #if ENABLE_DEBUG
@@ -1199,6 +1201,7 @@ bool LOOLWSD::createForKit()
     ossRLimits << "limit_virt_mem_mb:" << docProcSettings.LimitVirtMemMb;
     ossRLimits << ";limit_stack_mem_kb:" << docProcSettings.LimitStackMemKb;
     ossRLimits << ";limit_file_size_mb:" << docProcSettings.LimitFileSizeMb;
+    ossRLimits << ";limit_num_open_files:" << docProcSettings.LimitNumberOpenFiles;
     args.push_back("--rlimits=" + ossRLimits.str());
 
     if (UnitWSD::get().hasKitHooks())


More information about the Libreoffice-commits mailing list