Project

General

Profile

Bug #14387 » 0001-thread_pthread.c-make-get_main_stack-portable-on-lin.patch

Patch that fixes the issue - ncopa (Natanael Copa), 03/16/2018 12:59 PM

View differences:

thread_pthread.c
# define MAINSTACKADDR_AVAILABLE 0
# endif
#endif
#if MAINSTACKADDR_AVAILABLE && !defined(get_main_stack)
# define get_main_stack(addr, size) get_stack(addr, size)
#endif
#ifdef STACKADDR_AVAILABLE
/*
......
return 0;
#undef CHECK_ERR
}
#if defined(__linux__) && !defined(__GLIBC__) && defined(HAVE_GETRLIMIT)
#ifndef PAGE_SIZE
#include <unistd.h>
#define PAGE_SIZE sysconf(_SC_PAGE_SIZE)
#endif
static int
get_main_stack(void **addr, size_t *size)
{
size_t start, end, limit, prevend = 0;
struct rlimit r;
FILE *f;
char buf[PATH_MAX+80], s[8];
int n;
STACK_GROW_DIR_DETECTION;
f = fopen("/proc/self/maps", "re");
if (!f)
return -1;
n = 0;
while (fgets(buf, sizeof buf, f)) {
n = sscanf(buf, "%zx-%zx %*s %*s %*s %*s %7s", &start, &end, s);
if (n >= 2) {
if (n == 3 && strcmp(s, "[stack]") == 0)
break;
prevend = end;
}
n = 0;
}
fclose(f);
if (n == 0)
return -1;
limit = 100 << 20; /* 100MB stack limit */
if (getrlimit(RLIMIT_STACK, &r)==0 && r.rlim_cur < limit)
limit = r.rlim_cur & -PAGE_SIZE;
if (limit > end) limit = end;
if (prevend < end - limit) prevend = end - limit;
if (start > prevend) start = prevend;
*addr = IS_STACK_DIR_UPPER() ? (void *)start : (void *)end;
*size = end - start;
return 0;
}
#else
# define get_main_stack(addr, size) get_stack(addr, size)
#endif
#endif
static struct {
    (1-1/1)