diff --git a/doc/THANKS b/doc/THANKS index ca39fabb6..68d153ef2 100644 --- a/doc/THANKS +++ b/doc/THANKS @@ -27,6 +27,9 @@ Velky Brat Jack Butler for providing me with the sqlmap site favicon +Ulisses Castro + for reporting a bug + Roberto Castrogiovanni for reporting a minor bug diff --git a/lib/core/common.py b/lib/core/common.py index c0c9742b2..0ff377e90 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1239,13 +1239,20 @@ def getConsoleWidth(default=80): return width if width else default def parseXmlFile(xmlFile, handler): - checkFile(xmlFile) - xfile = codecs.open(xmlFile, 'rb', conf.dataEncoding) - content = xfile.read() - stream = StringIO(content) + if xmlFile not in kb.cache.content: + if conf.parseLock: + conf.parseLock.acquire() + if xmlFile not in kb.cache.content: + checkFile(xmlFile) + xfile = codecs.open(xmlFile, 'rb', conf.dataEncoding) + content = xfile.read() + kb.cache.content[xmlFile] = content + xfile.close() + if conf.parseLock: + conf.parseLock.release() + stream = StringIO(kb.cache.content[xmlFile]) parse(stream, handler) stream.close() - xfile.close() def readXmlFile(xmlFile): checkFile(xmlFile) diff --git a/lib/core/option.py b/lib/core/option.py index 62c9012e6..112a4096b 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -993,6 +993,7 @@ def __setConfAttributes(): conf.outputPath = None conf.paramDict = {} conf.parameters = {} + conf.parseLock = None conf.path = None conf.port = None conf.redirectHandled = False @@ -1022,6 +1023,7 @@ def __setKnowledgeBaseAttributes(): kb.bannerFp = advancedDict() kb.cache = advancedDict() + kb.cache.content = {} kb.cache.regex = {} kb.commonOutputs = None diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py index 7074e8fa6..99ac1e187 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -252,6 +252,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None iolock = threading.Lock() valuelock = threading.Lock() conf.seqLock = threading.Lock() + conf.parseLock = threading.Lock() conf.threadContinue = True def downloadThread(): @@ -416,6 +417,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None dataToStdout(infoMsg) conf.seqLock = None + conf.parseLock = None # No multi-threading (--threads = 1) else: