From 2b58008b911d9dc8354b9001e22b594fa6456dd1 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Wed, 8 Feb 2017 04:31:15 +0000 Subject: resource: new setrlimit stub for broken glibc2.2 compat --- resource.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 resource.c diff --git a/resource.c b/resource.c new file mode 100644 index 0000000..029b31e --- /dev/null +++ b/resource.c @@ -0,0 +1,37 @@ +#include /* setrlimit, struct rlimit */ +#include /* assert */ +#include /* dlsym, RTLD_NEXT */ +#include /* NULL */ +#include /* 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 -- cgit v1.2.3-70-g09d2