changeset: 94697:43641e03692a branch: 2.7 parent: 94691:a40481bbb62b user: Berker Peksag date: Fri Feb 20 12:10:33 2015 +0200 files: Lib/pydoc.py Lib/test/test_pydoc.py Misc/NEWS description: Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty docstrings. Initial patch by Yuyang Guo. diff -r a40481bbb62b -r 43641e03692a Lib/pydoc.py --- a/Lib/pydoc.py Thu Feb 19 22:28:36 2015 -0600 +++ b/Lib/pydoc.py Fri Feb 20 12:10:33 2015 +0200 @@ -255,7 +255,7 @@ if info and 'b' in info[2]: # binary modules have to be imported try: module = imp.load_module('__temp__', file, filename, info[1:]) except: return None - result = (module.__doc__ or '').splitlines()[0] + result = module.__doc__.splitlines()[0] if module.__doc__ else None del sys.modules['__temp__'] else: # text modules can be directly examined result = source_synopsis(file) @@ -2020,7 +2020,7 @@ path = None else: module = loader.load_module(modname) - desc = (module.__doc__ or '').splitlines()[0] + desc = module.__doc__.splitlines()[0] if module.__doc__ else '' path = getattr(module,'__file__',None) if find(lower(modname + ' - ' + desc), key) >= 0: callback(path, modname, desc) diff -r a40481bbb62b -r 43641e03692a Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py Thu Feb 19 22:28:36 2015 -0600 +++ b/Lib/test/test_pydoc.py Fri Feb 20 12:10:33 2015 +0200 @@ -3,6 +3,7 @@ import difflib import __builtin__ import re +import py_compile import pydoc import contextlib import inspect @@ -382,6 +383,34 @@ self.assertEqual(stripid(""), "") + def test_synopsis(self): + with test.test_support.temp_cwd() as test_dir: + init_path = os.path.join(test_dir, 'dt.py') + with open(init_path, 'w') as fobj: + fobj.write('''\ +""" +my doc + +second line +""" +foo = 1 +''') + py_compile.compile(init_path) + synopsis = pydoc.synopsis(init_path, {}) + self.assertEqual(synopsis, 'my doc') + + def test_synopsis_sourceless_empty_doc(self): + with test.test_support.temp_cwd() as test_dir: + init_path = os.path.join(test_dir, 'foomod42.py') + cached_path = os.path.join(test_dir, 'foomod42.pyc') + with open(init_path, 'w') as fobj: + fobj.write("foo = 1") + py_compile.compile(init_path) + synopsis = pydoc.synopsis(init_path, {}) + self.assertIsNone(synopsis) + synopsis_cached = pydoc.synopsis(cached_path, {}) + self.assertIsNone(synopsis_cached) + class PydocImportTest(PydocBaseTest): diff -r a40481bbb62b -r 43641e03692a Misc/NEWS --- a/Misc/NEWS Thu Feb 19 22:28:36 2015 -0600 +++ b/Misc/NEWS Fri Feb 20 12:10:33 2015 +0200 @@ -18,6 +18,9 @@ Library ------- +- Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty + docstrings. Initial patch by Yuyang Guo. + - Issue #22885: Fixed arbitrary code execution vulnerability in the dumbdbm module. Original patch by Claudiu Popa.