diff --git a/webkitgtk-2.9.3-memory-limit.patch b/webkitgtk-2.9.3-memory-limit.patch index a9311ae..48e0ba4 100644 --- a/webkitgtk-2.9.3-memory-limit.patch +++ b/webkitgtk-2.9.3-memory-limit.patch @@ -1,8 +1,27 @@ +diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp +index 98b1dbf..13ebca6 100644 +--- a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp ++++ b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp +@@ -105,6 +105,14 @@ public: + m_parameters.extraInitializationData.add("plugin-path", argv[2]); + return ChildProcessMainBase::parseCommandLine(argc, argv); + } ++ ++ void setAddressSpaceLimit() override ++ { ++ // Override with no implementation so that address space will be unlimited. We don't control ++ // how much AS plugins want to use. E.g. the JVM tries to allocate 34 TB of AS, and the ++ // plugin process will hang, causing the web process to hang, if it fails to do so. The huge ++ // AS is probably to implement ASLR, so it should be permitted. ++ } + }; + + int PluginProcessMainUnix(int argc, char** argv) diff --git a/Source/WebKit2/Shared/unix/ChildProcessMain.cpp b/Source/WebKit2/Shared/unix/ChildProcessMain.cpp -index 628be687ac16c1cdeff01403def118c7ab87e580..8d3a654ffdc289f52804b89cb97f0104828d7341 100644 +index 628be68..a2e5339 100644 --- a/Source/WebKit2/Shared/unix/ChildProcessMain.cpp +++ b/Source/WebKit2/Shared/unix/ChildProcessMain.cpp -@@ -26,7 +26,10 @@ +@@ -26,7 +26,16 @@ #include "config.h" #include "ChildProcessMain.h" @@ -10,16 +29,27 @@ index 628be687ac16c1cdeff01403def118c7ab87e580..8d3a654ffdc289f52804b89cb97f0104 #include +#include +#include ++ ++// The address space limit is currently set to 5 GB. In practice, this causes a ++// runaway web process to cap out at about 1.4 GB of allocated memory. ++#ifndef WEBKIT_CHILD_RLIMIT_AS ++#define WEBKIT_CHILD_RLIMIT_AS 5000000000l ++#endif namespace WebKit { -@@ -40,4 +43,25 @@ bool ChildProcessMainBase::parseCommandLine(int argc, char** argv) +@@ -40,4 +49,26 @@ bool ChildProcessMainBase::parseCommandLine(int argc, char** argv) return true; } -+void ChildProcessMainBase::setProcessResourceLimits() ++void ChildProcessMainBase::setAddressSpaceLimit() +{ +#ifdef _LARGEFILE64_SOURCE ++ rlim64_t addressSpaceLimit = WEBKIT_CHILD_RLIMIT_AS; ++ char* limitFromEnvironment = getenv("WEBKIT_CHILD_RLIMIT_AS"); ++ if (limitFromEnvironment) ++ addressSpaceLimit = atoll(limitFromEnvironment); ++ + // Prevent runaway web processes from allocating too much address space. + // + // It seems like it would be much better to use RLIMIT_DATA here, which should limit the @@ -27,11 +57,7 @@ index 628be687ac16c1cdeff01403def118c7ab87e580..8d3a654ffdc289f52804b89cb97f0104 + // RLIMIT_DATA does not apply to memory allocated with mmap(), so it is not really useful. + // For one, we use mmap() extensively in WTF::OSAllocator. For another, glibc's malloc() is + // implemented using mmap(), so RLIMIT_DATA is truely useless. -+ // -+ // The address space limit is currently set to 5 GB. In practice, this causes a runaway web -+ // process to cap out at about 1.4 GB of allocated memory. -+ static const auto addressSpaceLimitBytes = 5000000000l; -+ rlimit64 rlim = {addressSpaceLimitBytes, addressSpaceLimitBytes}; ++ rlimit64 rlim = {addressSpaceLimit, addressSpaceLimit}; + rlim.rlim_max = rlim.rlim_cur; + if (setrlimit64(RLIMIT_AS, &rlim)) + WTFLogAlways("Failed to set process address space limit: %s", strerror(errno)); @@ -40,14 +66,14 @@ index 628be687ac16c1cdeff01403def118c7ab87e580..8d3a654ffdc289f52804b89cb97f0104 + } // namespace WebKit diff --git a/Source/WebKit2/Shared/unix/ChildProcessMain.h b/Source/WebKit2/Shared/unix/ChildProcessMain.h -index 7b9029420d98fb6cf791aeff9307b2a85d1ac138..b3c90af3175418cad02fa9f8697d48bfb2a04011 100644 +index 7b90294..6c2c6f7 100644 --- a/Source/WebKit2/Shared/unix/ChildProcessMain.h +++ b/Source/WebKit2/Shared/unix/ChildProcessMain.h @@ -37,6 +37,7 @@ public: virtual bool platformInitialize() { return true; } virtual bool parseCommandLine(int argc, char** argv); virtual void platformFinalize() { } -+ virtual void setProcessResourceLimits(); ++ virtual void setAddressSpaceLimit(); const ChildProcessInitializationParameters& initializationParameters() const { return m_parameters; } @@ -55,7 +81,10 @@ index 7b9029420d98fb6cf791aeff9307b2a85d1ac138..b3c90af3175418cad02fa9f8697d48bf { ChildProcessMainType childMain; -+ childMain.setProcessResourceLimits(); ++ childMain.setAddressSpaceLimit(); + if (!childMain.platformInitialize()) return EXIT_FAILURE; + +-- +2.4.3 diff --git a/webkitgtk4.spec b/webkitgtk4.spec index f399d6d..4d745df 100644 --- a/webkitgtk4.spec +++ b/webkitgtk4.spec @@ -9,7 +9,7 @@ Name: webkitgtk4 Version: 2.9.4 -Release: 1%{?dist} +Release: 2%{?dist} Summary: GTK+ Web content engine library License: LGPLv2 @@ -224,10 +224,13 @@ make %{?_smp_mflags} -C %{_target_platform} %{_datadir}/gtk-doc/html/webkitdomgtk-4.0/ %changelog +* Tue Jul 28 2015 Michael Catanzaro - 2.9.4-2 +- Exempt the plugin process from the address space limit. + * Wed Jul 22 2015 Tomas Popela - 2.9.4-1 - Update to 2.9.4 -* Thu Jul 09 2015 Michael Catanzaro 2.9.3-3 +* Thu Jul 09 2015 Michael Catanzaro - 2.9.3-3 - Prevent runaway web processes from using unlimited memory. * Wed Jul 01 2015 Michael Catanzaro - 2.9.3-2