summaryrefslogtreecommitdiff
path: root/libgcompat/resource.c
blob: 029b31e6f9151e694721f09d966874dd7fc7b74e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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