summaryrefslogblamecommitdiff
path: root/libgcompat/resource.c
blob: 4a7ab4ec41af563289a2870fb869acb33ec4cd27 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13




                                                        







                                                                          
  














                                                                           
                                    





                                                    
#include <assert.h>       /* assert */
#include <dlfcn.h>        /* dlsym, RTLD_NEXT */
#include <stdlib.h>       /* NULL */
#include <string.h>       /* memcpy */
#include <sys/resource.h> /* setrlimit, struct rlimit */

/* 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