From 2cc8a5e4903b688f53e12141e3813d044dc05600 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 4 Jul 2010 18:11:51 +0000 Subject: [PATCH] Issue #9130: Fix validation of relative imports in parser module. --- Lib/test/test_parser.py | 20 ++++++++++++++++++++ Misc/NEWS | 2 ++ Modules/parsermodule.c | 7 ++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index 96f14f62bb..ade74311a5 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -189,6 +189,12 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase): self.check_suite("import sys as system, math") self.check_suite("import sys, math as my_math") + def test_relative_imports(self): + self.check_suite("from . import name") + self.check_suite("from .. import name") + self.check_suite("from .pkg import name") + self.check_suite("from ..pkg import name") + def test_pep263(self): self.check_suite("# -*- coding: iso-8859-1 -*-\n" "pass\n") @@ -464,6 +470,20 @@ class IllegalSyntaxTestCase(unittest.TestCase): (0, '')) self.check_bad_tree(tree, "malformed global ast") + def test_missing_import_source(self): + # from import a + tree = \ + (257, + (267, + (268, + (269, + (281, + (283, (1, 'from'), (1, 'import'), + (286, (284, (1, 'fred')))))), + (4, ''))), + (4, ''), (0, '')) + self.check_bad_tree(tree, "from import a") + class CompileTestCase(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index b7fe3f657f..bd640565aa 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -468,6 +468,8 @@ C-API Library ------- +- Issue #9130: Fix validation of relative imports in parser module. + - Issue #9128: Fix validation of class decorators in parser module. - Issue #9094: python -m pickletools will now disassemble pickle files diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index e60f23d7b2..bead663efe 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -1767,8 +1767,8 @@ count_from_dots(node *tree) return i-1; } -/* 'from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' | - * import_as_names +/* import_from: ('from' ('.'* dotted_name | '.'+) + * 'import' ('*' | '(' import_as_names ')' | import_as_names)) */ static int validate_import_from(node *tree) @@ -1778,7 +1778,8 @@ validate_import_from(node *tree) int havename = (TYPE(CHILD(tree, ndots + 1)) == dotted_name); int offset = ndots + havename; int res = validate_ntype(tree, import_from) - && (nch >= 4 + ndots) + && (offset >= 1) + && (nch >= 3 + offset) && validate_name(CHILD(tree, 0), "from") && (!havename || validate_dotted_name(CHILD(tree, ndots + 1))) && validate_name(CHILD(tree, offset + 1), "import"); -- 2.40.0