From 6553daa22b535596e73d35a8ee38e14b29fbbba3 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Thu, 14 Aug 2014 16:08:06 +0400 Subject: [PATCH] Limiting data and stack size by setrlimit. --- Makefile.mk | 3 +- src/libruntime/jerry-libc.h | 2 ++ src/libruntime/target/linux/jerry-libc.c | 40 ++++++++++++++++++++++++ src/main.c | 3 ++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Makefile.mk b/Makefile.mk index 8e133fd84..1e4d397bc 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -232,7 +232,8 @@ BUILD_DATE=$(shell date +'%d/%m/%Y') CFLAGS_JERRY = $(CFLAGS_WARNINGS) $(CFLAGS_WERROR) $(CFLAGS_WFATAL_ERRORS) DEFINES_JERRY = -DMEM_HEAP_CHUNK_SIZE=$$((64)) -DMEM_HEAP_AREA_SIZE=$$((2 * 1024 + 512)) -DMEM_STATS \ - -DCONFIG_ECMA_REFERENCE_COUNTER_WIDTH=$$((10)) + -DCONFIG_ECMA_REFERENCE_COUNTER_WIDTH=$$((10)) \ + -DCONFIG_MEM_STACK_LIMIT=$$((4 * 1024)) -DCONFIG_MEM_DATA_LIMIT_MINUS_HEAP_SIZE=$$((1024)) DEFINES_JERRY += -DJERRY_BUILD_DATE="\"$(BUILD_DATE)\"" \ -DJERRY_COMMIT_HASH="\"$(GIT_HASH)\"" \ diff --git a/src/libruntime/jerry-libc.h b/src/libruntime/jerry-libc.h index ea90d36ed..a191040a1 100644 --- a/src/libruntime/jerry-libc.h +++ b/src/libruntime/jerry-libc.h @@ -100,6 +100,8 @@ extern size_t __fread (void *, size_t, size_t, _FILE *); extern size_t __fwrite (const void *, size_t, size_t, _FILE *); extern int __fprintf (_FILE *, const char *, ...); +extern void jrt_set_mem_limits (size_t data_size, size_t stack_size); + #define DBL_MANT_DIG (52) #define DBL_DIG (10) #define DBL_MIN_EXP (-324) diff --git a/src/libruntime/target/linux/jerry-libc.c b/src/libruntime/target/linux/jerry-libc.c index bc6fbb6d4..0b496a75a 100644 --- a/src/libruntime/target/linux/jerry-libc.c +++ b/src/libruntime/target/linux/jerry-libc.c @@ -22,6 +22,8 @@ #include +#include + #ifdef LIBC_RAW #ifdef __TARGET_HOST_x64 @@ -349,6 +351,25 @@ __fwrite (const void *ptr, /**< data to write */ return bytes_written; } /* __fwrite */ +/** + * Setup new memory limits + */ +void +jrt_set_mem_limits (size_t data_size, /**< limit for data + bss + brk heap */ + size_t stack_size) /**< limit for stack */ +{ + struct rlimit data_limit = { data_size, data_size }; + struct rlimit stack_limit = { stack_size, stack_size }; + + int ret; + + SYSCALL_2 (__NR_setrlimit, RLIMIT_DATA, &data_limit, ret); + JERRY_ASSERT (ret == 0); + + SYSCALL_2 (__NR_setrlimit, RLIMIT_STACK, &stack_limit, ret); + JERRY_ASSERT (ret == 0); +} /* jrt_set_mem_limits */ + #elif defined (LIBC_MUSL) #include @@ -474,6 +495,25 @@ __fwrite (const void *ptr, /**< data to write */ return fwrite (ptr, size, nmemb, stream); } /* __fwrite */ +/** + * Setup new memory limits + */ +void +jrt_set_mem_limits (size_t data_size, /**< limit for data + bss + brk heap */ + size_t stack_size) /**< limit for stack */ +{ + struct rlimit data_limit = { data_size, data_size }; + struct rlimit stack_limit = { stack_size, stack_size }; + + int ret; + + ret = setrlimit (RLIMIT_DATA, &data_limit); + JERRY_ASSERT (ret == 0); + + ret = setrlimit (RLIMIT_STACK, &stack_limit); + JERRY_ASSERT (ret == 0); +} /* jrt_set_mem_limits */ + #else /* !LIBC_RAW && !LIBC_MUSL */ # error "!LIBC_RAW && !LIBC_MUSL" #endif /* !LIBC_RAW && !LIBC_MUSL */ diff --git a/src/main.c b/src/main.c index 569cf83cf..7e9b3ef21 100644 --- a/src/main.c +++ b/src/main.c @@ -170,6 +170,9 @@ main (int argc __unused, int i; size_t files_counter = 0; + jrt_set_mem_limits (MEM_HEAP_AREA_SIZE + CONFIG_MEM_DATA_LIMIT_MINUS_HEAP_SIZE, + CONFIG_MEM_STACK_LIMIT); + for (i = 1; i < argc; i++) { if (!__strcmp ("-v", argv[i]))