mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
bus errors or SystemError being raised. As a side effect of fixing this, a bad DECREF that could be triggered when 'message' and 'category' were both None was fixed. Closes issue 3211. Thanks JP Calderone for the bug report.
This commit is contained in:
parent
80821f7cf4
commit
dea1b5653f
4 changed files with 34 additions and 5 deletions
|
@ -301,6 +301,21 @@ class WarnTests(unittest.TestCase):
|
|||
warning_tests.__name__ = module_name
|
||||
sys.argv = argv
|
||||
|
||||
def test_warn_explicit_type_errors(self):
|
||||
# warn_explicit() shoud error out gracefully if it is given objects
|
||||
# of the wrong types.
|
||||
# lineno is expected to be an integer.
|
||||
self.assertRaises(TypeError, self.module.warn_explicit,
|
||||
None, UserWarning, None, None)
|
||||
# Either 'message' needs to be an instance of Warning or 'category'
|
||||
# needs to be a subclass.
|
||||
self.assertRaises(TypeError, self.module.warn_explicit,
|
||||
None, None, None, 1)
|
||||
# 'registry' must be a dict or None.
|
||||
self.assertRaises((TypeError, AttributeError),
|
||||
self.module.warn_explicit,
|
||||
None, Warning, None, 1, registry=42)
|
||||
|
||||
|
||||
|
||||
class CWarnTests(BaseTest, WarnTests):
|
||||
|
|
|
@ -202,6 +202,7 @@ def warn(message, category=None, stacklevel=1):
|
|||
|
||||
def warn_explicit(message, category, filename, lineno,
|
||||
module=None, registry=None, module_globals=None):
|
||||
lineno = int(lineno)
|
||||
if module is None:
|
||||
module = filename or "<unknown>"
|
||||
if module[-3:].lower() == ".py":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue