summaryrefslogtreecommitdiff
path: root/libgcompat/resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgcompat/resource.c')
-rw-r--r--libgcompat/resource.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libgcompat/resource.c b/libgcompat/resource.c
new file mode 100644
index 0000000..029b31e
--- /dev/null
+++ b/libgcompat/resource.c
@@ -0,0 +1,37 @@
+#include <sys/resource.h> /* setrlimit, struct rlimit */
+#include <assert.h> /* assert */
+#include <dlfcn.h> /* dlsym, RTLD_NEXT */
+#include <stdlib.h> /* NULL */
+#include <string.h> /* memcpy */
+
+/* Sigh.
+ * Valve compiled Steam against the glibc2.2 version of setrlimit.
+ * This broken version aliased 0 to RLIM_INFINITY.
+ *
+ * So, what you have to do is: if you want to run steam with this gcompat,
+ * ensure you compile *without* defining NO_BROKEN_SHADOW_SETRLIMIT.
+ * If you do *not* want to run steam with this gcompat, define it.
+ *
+ * The only problem with enabling this all the time is that if a binary
+ * really does need a ulimit to be 0 for any reason (such as coredumps), it
+ * very obviously won't work here.
+ */
+#ifndef NO_BROKEN_SHADOW_SETRLIMIT
+int (*real_rlimit)(int, const struct rlimit *);
+
+int setrlimit(int resource, const struct rlimit *rlim)
+{
+ struct rlimit my_rlim;
+ real_rlimit = dlsym(RTLD_NEXT, "setrlimit");
+ assert(real_rlimit != NULL);
+
+ memcpy(&my_rlim, rlim, sizeof(struct rlimit));
+
+ if(my_rlim.rlim_cur == 0)
+ {
+ my_rlim.rlim_cur = my_rlim.rlim_max;
+ }
+
+ return real_rlimit(resource, &my_rlim);
+}
+#endif