PyFile_WriteString now returns an error indicator instead of calling
PyErr_Clear().  Add checking of those errors.
diff --git a/Python/marshal.c b/Python/marshal.c
index 6880bdf..6a8ec46 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -354,11 +354,11 @@
 #else
 	if (r_long(p) != 0) {
 		PyObject *f = PySys_GetObject("stderr");
-		PyErr_Clear();
 		if (f != NULL)
-			PyFile_WriteString(
+			(void) PyFile_WriteString(
 			    "Warning: un-marshal 64-bit int in 32-bit mode\n",
 			    f);
+		PyErr_Clear();
 	}
 #endif
 	return x;
diff --git a/Python/traceback.c b/Python/traceback.c
index 06fcc53..53b84f3 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -132,16 +132,19 @@
 	return 0;
 }
 
-static void
+static int
 tb_displayline(f, filename, lineno, name)
 	PyObject *f;
 	char *filename;
 	int lineno;
 	char *name;
 {
+	int err = 0;
 	FILE *xfp;
 	char linebuf[1000];
 	int i;
+	if (filename == NULL || name == NULL)
+		return -1;
 #ifdef MPW
 	/* This is needed by MPW's File and Line commands */
 #define FMT "  File \"%.900s\"; line %d # in %s\n"
@@ -165,6 +168,10 @@
 			char namebuf[MAXPATHLEN+1];
 			for (i = 0; i < npath; i++) {
 				PyObject *v = PyList_GetItem(path, i);
+				if (v == NULL) {
+					PyErr_Clear();
+					break;
+				}
 				if (PyString_Check(v)) {
 					int len;
 					len = PyString_Size(v);
@@ -186,9 +193,9 @@
 		}
 	}
 	sprintf(linebuf, FMT, filename, lineno, name);
-	PyFile_WriteString(linebuf, f);
-	if (xfp == NULL)
-		return;
+	err = PyFile_WriteString(linebuf, f);
+	if (xfp == NULL || err != 0)
+		return err;
 	for (i = 0; i < lineno; i++) {
 		if (fgets(linebuf, sizeof linebuf, xfp) == NULL)
 			break;
@@ -197,32 +204,36 @@
 		char *p = linebuf;
 		while (*p == ' ' || *p == '\t' || *p == '\014')
 			p++;
-		PyFile_WriteString("    ", f);
-		PyFile_WriteString(p, f);
-		if (strchr(p, '\n') == NULL)
-			PyFile_WriteString("\n", f);
+		err = PyFile_WriteString("    ", f);
+		if (err == 0) {
+			err = PyFile_WriteString(p, f);
+			if (err == 0 && strchr(p, '\n') == NULL)
+				err = PyFile_WriteString("\n", f);
+		}
 	}
 	fclose(xfp);
+	return err;
 }
 
-static void
+static int
 tb_printinternal(tb, f, limit)
 	tracebackobject *tb;
 	PyObject *f;
 	int limit;
 {
+	int err = 0;
 	int depth = 0;
 	tracebackobject *tb1 = tb;
 	while (tb1 != NULL) {
 		depth++;
 		tb1 = tb1->tb_next;
 	}
-	while (tb != NULL && !PyOS_InterruptOccurred()) {
+	while (tb != NULL && err == 0) {
 		if (depth <= limit) {
 			if (Py_OptimizeFlag)
 				tb->tb_lineno = PyCode_Addr2Line(
 					tb->tb_frame->f_code, tb->tb_lasti);
-			tb_displayline(f,
+			err = tb_displayline(f,
 			    PyString_AsString(
 				    tb->tb_frame->f_code->co_filename),
 			    tb->tb_lineno,
@@ -230,7 +241,10 @@
 		}
 		depth--;
 		tb = tb->tb_next;
+		if (err == 0)
+			err = PyErr_CheckSignals();
 	}
+	return err;
 }
 
 int
@@ -238,6 +252,7 @@
 	PyObject *v;
 	PyObject *f;
 {
+	int err;
 	PyObject *limitv;
 	int limit = 1000;
 	if (v == NULL)
@@ -252,7 +267,8 @@
 		if (limit <= 0)
 			return 0;
 	}
-	PyFile_WriteString("Traceback (innermost last):\n", f);
-	tb_printinternal((tracebackobject *)v, f, limit);
-	return 0;
+	err = PyFile_WriteString("Traceback (innermost last):\n", f);
+	if (!err)
+		err = tb_printinternal((tracebackobject *)v, f, limit);
+	return err;
 }