Discussion:
[Python-3000-checkins] r66140 - in python/branches/py3k: Lib/test/test_warnings.py Misc/NEWS Python/_warnings.c
brett.cannon
2008-09-02 04:01:43 UTC
Permalink
Author: brett.cannon
Date: Tue Sep 2 06:01:42 2008
New Revision: 66140

Log:
The _warnings module did not properly handle cases where strings were not being
passed in as the message to use for a warning. Fixed along with making the code
more robust against other errors where return values were not checked.

Closes issue 3639.
Code review by Benjamin Peterson.


Modified:
python/branches/py3k/Lib/test/test_warnings.py
python/branches/py3k/Misc/NEWS
python/branches/py3k/Python/_warnings.c

Modified: python/branches/py3k/Lib/test/test_warnings.py
==============================================================================
--- python/branches/py3k/Lib/test/test_warnings.py (original)
+++ python/branches/py3k/Lib/test/test_warnings.py Tue Sep 2 06:01:42 2008
@@ -202,6 +202,16 @@
self.assertEqual(str(w.message), text)
self.assert_(w.category is UserWarning)

+ # Issue 3639
+ def test_warn_nonstandard_types(self):
+ # warn() should handle non-standard types without issue.
+ for ob in (Warning, None, 42):
+ with support.catch_warning(self.module) as w:
+ self.module.warn(ob)
+ # Don't directly compare objects since
+ # ``Warning() != Warning()``.
+ self.assertEquals(str(w.message), str(UserWarning(ob)))
+
def test_filename(self):
with warnings_state(self.module):
with support.catch_warning(self.module) as w:
@@ -315,7 +325,6 @@
self.module.warn_explicit,
None, Warning, None, 1, registry=42)

-
class CWarnTests(BaseTest, WarnTests):
module = c_warnings


Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Tue Sep 2 06:01:42 2008
@@ -12,6 +12,9 @@
Core and Builtins
-----------------

+- Issue 3639: The _warnings module could segfault the interpreter when
+ unexpected types were passed in as arguments.
+
- Issue #3712: The memoryview object had a reference leak and didn't support
cyclic garbage collection.


Modified: python/branches/py3k/Python/_warnings.c
==============================================================================
--- python/branches/py3k/Python/_warnings.c (original)
+++ python/branches/py3k/Python/_warnings.c Tue Sep 2 06:01:42 2008
@@ -258,6 +258,8 @@
/* Print " source_line\n" */
if (sourceline) {
char *source_line_str = _PyUnicode_AsString(sourceline);
+ if (source_line_str == NULL)
+ return;
while (*source_line_str == ' ' || *source_line_str == '\t' ||
*source_line_str == '\014')
source_line_str++;
@@ -266,8 +268,9 @@
PyFile_WriteString("\n", f_stderr);
}
else
- _Py_DisplaySourceLine(f_stderr, _PyUnicode_AsString(filename),
- lineno, 2);
+ if (_Py_DisplaySourceLine(f_stderr, _PyUnicode_AsString(filename),
+ lineno, 2) < 0)
+ return;
PyErr_Clear();
}

@@ -366,8 +369,11 @@
PyObject *to_str = PyObject_Str(item);
const char *err_str = "???";

- if (to_str != NULL)
+ if (to_str != NULL) {
err_str = _PyUnicode_AsString(to_str);
+ if (err_str == NULL)
+ goto cleanup;
+ }
PyErr_Format(PyExc_RuntimeError,
"Unrecognized action (%s) in warnings.filters:\n %s",
action, err_str);
@@ -498,7 +504,9 @@
}
else {
const char *module_str = _PyUnicode_AsString(*module);
- if (module_str && strcmp(module_str, "__main__") == 0) {
+ if (module_str == NULL)
+ goto handle_error;
+ if (strcmp(module_str, "__main__") == 0) {
PyObject *argv = PySys_GetObject("argv");
if (argv != NULL && PyList_Size(argv) > 0) {
int is_true;

Loading...