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.
diff --git a/Python/_warnings.c b/Python/_warnings.c
index a08219e..84558d1 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -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;