From: Berker Peksag Date: Fri, 20 Feb 2015 10:10:33 +0000 (+0200) Subject: Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc9d41d71820b255ba21683578aac7c9129cf0ce;p=python Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty docstrings. Initial patch by Yuyang Guo. --- diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 0647d1e8ff..b56d385bf7 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -255,7 +255,7 @@ def synopsis(filename, cache={}): 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 @@ class ModuleScanner: 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 --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index c11c06b524..5bb97e245f 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -3,6 +3,7 @@ import sys import difflib import __builtin__ import re +import py_compile import pydoc import contextlib import inspect @@ -382,6 +383,34 @@ class PydocDocTest(unittest.TestCase): 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 --git a/Misc/NEWS b/Misc/NEWS index 2f171c26c3..6a5f90aebd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,9 @@ Core and Builtins 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.