Commit 66fda2ac by Ned Batchelder

A better (working) way to limit memory usage.

parent 6327480f
...@@ -68,7 +68,9 @@ if hasattr(sys, 'real_prefix'): ...@@ -68,7 +68,9 @@ if hasattr(sys, 'real_prefix'):
LIMITS = { LIMITS = {
# CPU seconds, defaulting to 1. # CPU seconds, defaulting to 1.
"CPU": 1, "CPU": 1,
# Total process virutal memory, in bytes, defaulting to 30 Mb.
"VMEM": 30000000,
} }
...@@ -168,17 +170,17 @@ def set_process_limits(): ...@@ -168,17 +170,17 @@ def set_process_limits():
""" """
Set limits on this processs, to be used first in a child process. Set limits on this processs, to be used first in a child process.
""" """
# No subprocesses or files
resource.setrlimit(resource.RLIMIT_NPROC, (0, 0))
resource.setrlimit(resource.RLIMIT_FSIZE, (0, 0))
# CPU seconds, not wall clock time. # CPU seconds, not wall clock time.
cpu = LIMITS["CPU"] cpu = LIMITS["CPU"]
resource.setrlimit(resource.RLIMIT_CPU, (cpu, cpu)) resource.setrlimit(resource.RLIMIT_CPU, (cpu, cpu))
resource.setrlimit(resource.RLIMIT_NPROC, (0, 0)) # no subprocesses # Total process virtual memory.
resource.setrlimit(resource.RLIMIT_FSIZE, (0, 0)) # no files vmem = LIMITS["VMEM"]
resource.setrlimit(resource.RLIMIT_AS, (vmem, vmem))
mem = 32 * (2 ** 20) # 32 MB should be enough for anyone, right? :)
resource.setrlimit(resource.RLIMIT_STACK, (mem, mem))
resource.setrlimit(resource.RLIMIT_RSS, (mem, mem))
resource.setrlimit(resource.RLIMIT_DATA, (mem, mem))
class ProcessKillerThread(threading.Thread): class ProcessKillerThread(threading.Thread):
......
...@@ -84,14 +84,14 @@ class TestFeatures(JailCodeHelpers, unittest.TestCase): ...@@ -84,14 +84,14 @@ class TestFeatures(JailCodeHelpers, unittest.TestCase):
class TestLimits(JailCodeHelpers, unittest.TestCase): class TestLimits(JailCodeHelpers, unittest.TestCase):
def test_cant_use_too_much_memory(self): def test_cant_use_too_much_memory(self):
res = jailpy(code="print len(range(100000000))") res = jailpy(code="print len(bytearray(50000000))")
self.assertNotEqual(res.status, 0)
self.assertEqual(res.stdout, "") self.assertEqual(res.stdout, "")
self.assertNotEqual(res.status, 0)
def test_cant_use_too_much_cpu(self): def test_cant_use_too_much_cpu(self):
res = jailpy(code="print sum(xrange(100000000))") res = jailpy(code="print sum(xrange(100000000))")
self.assertNotEqual(res.status, 0)
self.assertEqual(res.stdout, "") self.assertEqual(res.stdout, "")
self.assertNotEqual(res.status, 0)
def test_cant_use_too_much_time(self): def test_cant_use_too_much_time(self):
raise SkipTest # TODO: test this once we can kill sleeping processes. raise SkipTest # TODO: test this once we can kill sleeping processes.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment