pathod: fix leaking fds

This commit is contained in:
Thomas Kriechbaumer 2017-05-24 17:25:12 +02:00
parent 673ed5b45e
commit cfed4432a0
5 changed files with 18 additions and 23 deletions

View File

@ -1,7 +1,7 @@
import os
import string import string
import random import random
import mmap import mmap
import sys import sys
DATATYPES = dict( DATATYPES = dict(
@ -74,24 +74,20 @@ class RandomGenerator:
class FileGenerator: class FileGenerator:
def __init__(self, path): def __init__(self, path):
self.path = path self.path = path
self.fp = open(path, "rb")
self.map = mmap.mmap(self.fp.fileno(), 0, access=mmap.ACCESS_READ)
def __len__(self): def __len__(self):
return len(self.map) return os.path.getsize(self.path)
def __getitem__(self, x): def __getitem__(self, x):
if isinstance(x, slice): with open(self.path, mode="rb") as f:
return self.map.__getitem__(x) if isinstance(x, slice):
# A slice of length 1 returns a byte object (not an integer) with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mapped:
return self.map.__getitem__(slice(x, x + 1 or self.map.size())) return mapped.__getitem__(x)
else:
f.seek(x)
return f.read(1)
def __repr__(self): def __repr__(self):
return "<%s" % self.path return "<%s" % self.path
def close(self):
self.map.close()
self.fp.close()

View File

@ -216,7 +216,8 @@ def args_pathod(argv, stdout_=sys.stdout, stderr_=sys.stderr):
anchors = [] anchors = []
for patt, spec in args.anchors: for patt, spec in args.anchors:
if os.path.isfile(spec): if os.path.isfile(spec):
data = open(spec).read() with open(spec) as f:
data = f.read()
spec = data spec = data
try: try:
arex = re.compile(patt) arex = re.compile(patt)

View File

@ -14,16 +14,14 @@ def test_randomgenerator():
def test_filegenerator(tmpdir): def test_filegenerator(tmpdir):
f = tmpdir.join("foo") f = tmpdir.join("foo")
f.write(b"x" * 10000) f.write(b"abcdefghijklmnopqrstuvwxyz" * 1000)
g = generators.FileGenerator(str(f)) g = generators.FileGenerator(str(f))
assert len(g) == 10000 assert len(g) == 26000
assert g[0] == b"x" assert g[0] == b"a"
assert g[-1] == b"x" assert g[2:7] == b"cdefg"
assert g[0:5] == b"xxxxx"
assert len(g[1:10]) == 9 assert len(g[1:10]) == 9
assert len(g[10000:10001]) == 0 assert len(g[26000:26001]) == 0
assert repr(g) assert repr(g)
g.close()
def test_transform_generator(): def test_transform_generator():

View File

@ -2,7 +2,6 @@ import os
import requests import requests
import pytest import pytest
from mitmproxy.test import tutils
from pathod import test from pathod import test
from pathod.pathod import SSLOptions, CA_CERT_NAME from pathod.pathod import SSLOptions, CA_CERT_NAME
@ -27,7 +26,7 @@ class TestDaemonManual:
d = test.Daemon(ssl=True, ssloptions=ssloptions) d = test.Daemon(ssl=True, ssloptions=ssloptions)
rsp = requests.get( rsp = requests.get(
"https://localhost:%s/p/202:da" % d.port, "https://localhost:%s/p/202:da" % d.port,
verify=os.path.join(d.thread.server.ssloptions.confdir, CA_CERT_NAME)) verify=os.path.expanduser(os.path.join(d.thread.server.ssloptions.confdir, CA_CERT_NAME)))
assert rsp.ok assert rsp.ok
assert rsp.status_code == 202 assert rsp.status_code == 202
d.shutdown() d.shutdown()

View File

@ -1,3 +1,4 @@
import os
import tempfile import tempfile
import re import re
import shutil import shutil