mirror of
				https://github.com/jtesta/ssh-audit.git
				synced 2025-10-31 13:35:26 +01:00 
			
		
		
		
	Fixed Windows-specific crash when multiple threads are used (#152).
This commit is contained in:
		| @@ -2,12 +2,12 @@ | |||||||
|  |  | ||||||
| An executable can only be made on a Windows host because the PyInstaller tool (https://www.pyinstaller.org/) does not support cross-compilation. | An executable can only be made on a Windows host because the PyInstaller tool (https://www.pyinstaller.org/) does not support cross-compilation. | ||||||
|  |  | ||||||
| 1.) Install Python v3.9.x from https://www.python.org/.  To make life easier, check the option to add Python to the PATH environment variable. | 1.) Install Python v3.11.x from https://www.python.org/.  To make life easier, check the option to add Python to the PATH environment variable. | ||||||
|  |  | ||||||
| 2.) Using pip, install pyinstaller and colorama: | 2.) Using pip, install pyinstaller, colorama, and idna: | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
|     pip install pyinstaller colorama |     pip install -U pyinstaller colorama idna | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 3.) Install Cygwin (https://www.cygwin.com/). | 3.) Install Cygwin (https://www.cygwin.com/). | ||||||
|   | |||||||
| @@ -61,6 +61,9 @@ from ssh_audit.ssh_socket import SSH_Socket | |||||||
| from ssh_audit.utils import Utils | from ssh_audit.utils import Utils | ||||||
| from ssh_audit.versionvulnerabilitydb import VersionVulnerabilityDB | from ssh_audit.versionvulnerabilitydb import VersionVulnerabilityDB | ||||||
|  |  | ||||||
|  |  | ||||||
|  | no_idna_workaround = False | ||||||
|  |  | ||||||
| # Only import colorama under Windows.  Other OSes can natively handle terminal colors. | # Only import colorama under Windows.  Other OSes can natively handle terminal colors. | ||||||
| if sys.platform == 'win32': | if sys.platform == 'win32': | ||||||
|     try: |     try: | ||||||
| @@ -69,6 +72,14 @@ if sys.platform == 'win32': | |||||||
|     except ImportError: |     except ImportError: | ||||||
|         pass |         pass | ||||||
|  |  | ||||||
|  |     # This is a workaround for a Python bug that causes a crash on Windows when multiple threads are used (see https://github.com/python/cpython/issues/73474).  Importing the idna module and using it in a no-op seems to fix the issue.  Otherwise, if idna isn't available at run-time, force single threaded scans. | ||||||
|  |     try: | ||||||
|  |         import idna  # noqa: F401 | ||||||
|  |  | ||||||
|  |         ''.encode('idna') | ||||||
|  |     except ImportError: | ||||||
|  |         no_idna_workaround = True | ||||||
|  |  | ||||||
|  |  | ||||||
| def usage(uout: OutputBuffer, err: Optional[str] = None) -> None: | def usage(uout: OutputBuffer, err: Optional[str] = None) -> None: | ||||||
|     retval = exitcodes.GOOD |     retval = exitcodes.GOOD | ||||||
| @@ -753,8 +764,15 @@ def process_commandline(out: OutputBuffer, args: List[str], usage_cb: Callable[. | |||||||
|             aconf.policy_file = a |             aconf.policy_file = a | ||||||
|         elif o in ('-T', '--targets'): |         elif o in ('-T', '--targets'): | ||||||
|             aconf.target_file = a |             aconf.target_file = a | ||||||
|  |  | ||||||
|  |             # If we're on Windows, and we can't use the idna workaround, force only one thread to be used (otherwise a crash would occur). | ||||||
|  |             if no_idna_workaround: | ||||||
|  |                 print("\nWARNING: the idna module was not found on this system, thus only single-threaded scanning will be done (this is a workaround for this Windows-specific crash: https://github.com/python/cpython/issues/73474).  Multi-threaded scanning can be enabled by installing the idna module (pip install idna).\n") | ||||||
|  |                 aconf.threads = 1 | ||||||
|         elif o == '--threads': |         elif o == '--threads': | ||||||
|             aconf.threads = int(a) |             aconf.threads = int(a) | ||||||
|  |             if no_idna_workaround: | ||||||
|  |                 aconf.threads = 1 | ||||||
|         elif o in ('-L', '--list-policies'): |         elif o in ('-L', '--list-policies'): | ||||||
|             aconf.list_policies = True |             aconf.list_policies = True | ||||||
|         elif o == '--lookup': |         elif o == '--lookup': | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Joe Testa
					Joe Testa