Skip to content

Commit

Permalink
Merge pull request #1919 from anirudnits/infinite-loop
Browse files Browse the repository at this point in the history
Infinite loop for unmatched parenthesis
  • Loading branch information
timothycrosley committed May 11, 2022
2 parents cad1a24 + a4f8fb6 commit 71c1e92
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
6 changes: 5 additions & 1 deletion isort/core.py
Expand Up @@ -7,7 +7,7 @@
from isort.settings import DEFAULT_CONFIG, Config

from . import output, parse
from .exceptions import FileSkipComment
from .exceptions import ExistingSyntaxErrors, FileSkipComment
from .format import format_natural, remove_whitespace
from .settings import FILE_SKIP_COMMENTS

Expand Down Expand Up @@ -303,6 +303,10 @@ def process(
else:
while ")" not in stripped_line:
line = input_stream.readline()

if not line: # end of file without closing parenthesis
raise ExistingSyntaxErrors("Parenthesis is not closed")

stripped_line = line.strip().split("#")[0]
import_statement += line

Expand Down
18 changes: 18 additions & 0 deletions tests/unit/test_isort.py
Expand Up @@ -5562,3 +5562,21 @@ def seekable(self):
test_input = NonSeekableTestStream("import m2\n" "import m1\n" "not_import = 7")
identified_imports = list(map(str, api.find_imports_in_stream(test_input)))
assert identified_imports == [":1 import m2", ":2 import m1"]


def test_infinite_loop_in_unmatched_parenthesis() -> None:
test_input = "from os import ("

# ensure a syntax error is raised for unmatched parenthesis
with pytest.raises(ExistingSyntaxErrors):
isort.code(test_input)

test_input = """from os import (
path,
walk
)
"""

# ensure other cases are handled correctly
assert isort.code(test_input) == "from os import path, walk\n"

0 comments on commit 71c1e92

Please sign in to comment.