diff --git a/lib/core/threads.py b/lib/core/threads.py index 0c5b21b70..55ba2aaff 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -9,12 +9,14 @@ See the file 'doc/COPYING' for copying permission import difflib import threading +import time from lib.core.data import kb from lib.core.data import logger from lib.core.datatype import advancedDict from lib.core.exception import sqlmapThreadException from lib.core.settings import MAX_NUMBER_OF_THREADS +from lib.core.settings import PYVERSION shared = advancedDict() @@ -98,20 +100,25 @@ def runThreads(numThreads, threadFunction, cleanupFunction=None, forwardExceptio # Start the threads for numThread in range(numThreads): thread = threading.Thread(target=exceptionHandledFunction, name=str(numThread), args=[threadFunction]) + + # Reference: http://stackoverflow.com/questions/190010/daemon-threads-explanation + if PYVERSION >= "2.6": + thread.daemon = True + else: + thread.setDaemon(True) + thread.start() threads.append(thread) # And wait for them to all finish try: alive = True - while alive: alive = False - for thread in threads: if thread.isAlive(): alive = True - thread.join(1) + time.sleep(1) except KeyboardInterrupt: kb.threadContinue = False diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py index 47734cb63..7294e9f26 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -43,6 +43,7 @@ from lib.core.settings import INFERENCE_UNKNOWN_CHAR from lib.core.settings import INFERENCE_GREATER_CHAR from lib.core.settings import INFERENCE_EQUALS_CHAR from lib.core.settings import INFERENCE_NOT_EQUALS_CHAR +from lib.core.settings import PYVERSION from lib.core.unescaper import unescaper from lib.request.connect import Connect as Request @@ -413,6 +414,12 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None # Start the threads for numThread in range(numThreads): thread = threading.Thread(target=downloadThread, name=str(numThread)) + + if PYVERSION >= "2.6": + thread.daemon = True + else: + thread.setDaemon(True) + thread.start() threads.append(thread) @@ -424,7 +431,8 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None for thread in threads: if thread.isAlive(): alive = True - thread.join(5) + time.sleep(1) + except KeyboardInterrupt: kb.threadContinue = False raise diff --git a/sqlmap.py b/sqlmap.py index e97e59f21..dbc9cbad2 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -129,8 +129,8 @@ def main(): kb.threadContinue = False kb.threadException = True - # just in case handling of leftover threads - raise SystemExit + # Reference: http://stackoverflow.com/questions/1635080/terminate-a-multi-thread-python-program + os._exit(0) if __name__ == "__main__": main()