comparison Python/pythonrun.c @ 38455:1a23706139ca legacy-trunk

PyErr_Display(), PyErr_WriteUnraisable(): Coverity found a cut-and-paste bug in both: `className` was referenced before being checked for NULL.
author Tim Peters <tim.peters@gmail.com>
date Sun, 28 May 2006 10:41:29 +0000
parents 4c0823f0a0a1
children 42808526511c
comparison
equal deleted inserted replaced
38454:631c207c3692 38455:1a23706139ca
661 } 661 }
662 662
663 /* Parse input from a file and execute it */ 663 /* Parse input from a file and execute it */
664 664
665 int 665 int
666 PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, 666 PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
667 PyCompilerFlags *flags) 667 PyCompilerFlags *flags)
668 { 668 {
669 if (filename == NULL) 669 if (filename == NULL)
670 filename = "???"; 670 filename = "???";
671 if (Py_FdIsInteractive(fp, filename)) { 671 if (Py_FdIsInteractive(fp, filename)) {
742 PyErr_Clear(); 742 PyErr_Clear();
743 else if (PyString_Check(w)) 743 else if (PyString_Check(w))
744 ps2 = PyString_AsString(w); 744 ps2 = PyString_AsString(w);
745 } 745 }
746 arena = PyArena_New(); 746 arena = PyArena_New();
747 mod = PyParser_ASTFromFile(fp, filename, 747 mod = PyParser_ASTFromFile(fp, filename,
748 Py_single_input, ps1, ps2, 748 Py_single_input, ps1, ps2,
749 flags, &errcode, arena); 749 flags, &errcode, arena);
750 Py_XDECREF(v); 750 Py_XDECREF(v);
751 Py_XDECREF(w); 751 Py_XDECREF(w);
752 if (mod == NULL) { 752 if (mod == NULL) {
1130 } 1130 }
1131 if (err) { 1131 if (err) {
1132 /* Don't do anything else */ 1132 /* Don't do anything else */
1133 } 1133 }
1134 else if (PyExceptionClass_Check(exception)) { 1134 else if (PyExceptionClass_Check(exception)) {
1135 PyObject* moduleName;
1135 char* className = PyExceptionClass_Name(exception); 1136 char* className = PyExceptionClass_Name(exception);
1136 char *dot = strrchr(className, '.'); 1137 if (className != NULL) {
1137 PyObject* moduleName; 1138 char *dot = strrchr(className, '.');
1138 if (dot != NULL) 1139 if (dot != NULL)
1139 className = dot+1; 1140 className = dot+1;
1141 }
1142
1140 moduleName = PyObject_GetAttrString(exception, "__module__"); 1143 moduleName = PyObject_GetAttrString(exception, "__module__");
1141
1142 if (moduleName == NULL) 1144 if (moduleName == NULL)
1143 err = PyFile_WriteString("<unknown>", f); 1145 err = PyFile_WriteString("<unknown>", f);
1144 else { 1146 else {
1145 char* modstr = PyString_AsString(moduleName); 1147 char* modstr = PyString_AsString(moduleName);
1146 if (modstr && strcmp(modstr, "exceptions")) 1148 if (modstr && strcmp(modstr, "exceptions"))
1182 if (err != 0) 1184 if (err != 0)
1183 PyErr_Clear(); 1185 PyErr_Clear();
1184 } 1186 }
1185 1187
1186 PyObject * 1188 PyObject *
1187 PyRun_StringFlags(const char *str, int start, PyObject *globals, 1189 PyRun_StringFlags(const char *str, int start, PyObject *globals,
1188 PyObject *locals, PyCompilerFlags *flags) 1190 PyObject *locals, PyCompilerFlags *flags)
1189 { 1191 {
1190 PyObject *ret = NULL; 1192 PyObject *ret = NULL;
1191 PyArena *arena = PyArena_New(); 1193 PyArena *arena = PyArena_New();
1192 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags, 1194 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags,
1229 Py_DECREF(co); 1231 Py_DECREF(co);
1230 return v; 1232 return v;
1231 } 1233 }
1232 1234
1233 static PyObject * 1235 static PyObject *
1234 run_pyc_file(FILE *fp, const char *filename, PyObject *globals, 1236 run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
1235 PyObject *locals, PyCompilerFlags *flags) 1237 PyObject *locals, PyCompilerFlags *flags)
1236 { 1238 {
1237 PyCodeObject *co; 1239 PyCodeObject *co;
1238 PyObject *v; 1240 PyObject *v;
1239 long magic; 1241 long magic;
1298 return st; 1300 return st;
1299 } 1301 }
1300 1302
1301 /* Preferred access to parser is through AST. */ 1303 /* Preferred access to parser is through AST. */
1302 mod_ty 1304 mod_ty
1303 PyParser_ASTFromString(const char *s, const char *filename, int start, 1305 PyParser_ASTFromString(const char *s, const char *filename, int start,
1304 PyCompilerFlags *flags, PyArena *arena) 1306 PyCompilerFlags *flags, PyArena *arena)
1305 { 1307 {
1306 mod_ty mod; 1308 mod_ty mod;
1307 perrdetail err; 1309 perrdetail err;
1308 node *n = PyParser_ParseStringFlagsFilename(s, filename, 1310 node *n = PyParser_ParseStringFlagsFilename(s, filename,
1309 &_PyParser_Grammar, start, &err, 1311 &_PyParser_Grammar, start, &err,
1310 PARSER_FLAGS(flags)); 1312 PARSER_FLAGS(flags));
1311 if (n) { 1313 if (n) {
1312 mod = PyAST_FromNode(n, flags, filename, arena); 1314 mod = PyAST_FromNode(n, flags, filename, arena);
1313 PyNode_Free(n); 1315 PyNode_Free(n);
1314 return mod; 1316 return mod;
1318 return NULL; 1320 return NULL;
1319 } 1321 }
1320 } 1322 }
1321 1323
1322 mod_ty 1324 mod_ty
1323 PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, 1325 PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
1324 char *ps2, PyCompilerFlags *flags, int *errcode, 1326 char *ps2, PyCompilerFlags *flags, int *errcode,
1325 PyArena *arena) 1327 PyArena *arena)
1326 { 1328 {
1327 mod_ty mod; 1329 mod_ty mod;
1328 perrdetail err; 1330 perrdetail err;
1349 perrdetail err; 1351 perrdetail err;
1350 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, 1352 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1351 start, NULL, NULL, &err, flags); 1353 start, NULL, NULL, &err, flags);
1352 if (n == NULL) 1354 if (n == NULL)
1353 err_input(&err); 1355 err_input(&err);
1354 1356
1355 return n; 1357 return n;
1356 } 1358 }
1357 1359
1358 /* Simplified interface to parsestring -- return node or set exception */ 1360 /* Simplified interface to parsestring -- return node or set exception */
1359 1361