1 2 /* Error handling */ 3 4 #include "Python.h" 5 #include "pycore_initconfig.h" 6 #include "pycore_object.h" // _PyType_GetQualName 7 #include "pycore_pyerrors.h" 8 #include "pycore_pystate.h" // _PyThreadState_GET() 9 #include "pycore_sysmodule.h" 10 #include "pycore_traceback.h" 11 12 #ifndef __STDC__ 13 #ifndef MS_WINDOWS 14 extern char *strerror(int); 15 #endif 16 #endif 17 18 #ifdef MS_WINDOWS 19 #include <windows.h> 20 #include <winbase.h> 21 #endif 22 23 #include <ctype.h> 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 _Py_IDENTIFIER(__module__); 30 _Py_IDENTIFIER(builtins); 31 _Py_IDENTIFIER(stderr); 32 _Py_IDENTIFIER(flush); 33 34 /* Forward declarations */ 35 static PyObject * 36 _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, 37 const char *format, va_list vargs); 38 39 40 void _PyErr_Restore(PyThreadState * tstate,PyObject * type,PyObject * value,PyObject * traceback)41 _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value, 42 PyObject *traceback) 43 { 44 PyObject *oldtype, *oldvalue, *oldtraceback; 45 46 if (traceback != NULL && !PyTraceBack_Check(traceback)) { 47 /* XXX Should never happen -- fatal error instead? */ 48 /* Well, it could be None. */ 49 Py_DECREF(traceback); 50 traceback = NULL; 51 } 52 53 /* Save these in locals to safeguard against recursive 54 invocation through Py_XDECREF */ 55 oldtype = tstate->curexc_type; 56 oldvalue = tstate->curexc_value; 57 oldtraceback = tstate->curexc_traceback; 58 59 tstate->curexc_type = type; 60 tstate->curexc_value = value; 61 tstate->curexc_traceback = traceback; 62 63 Py_XDECREF(oldtype); 64 Py_XDECREF(oldvalue); 65 Py_XDECREF(oldtraceback); 66 } 67 68 void PyErr_Restore(PyObject * type,PyObject * value,PyObject * traceback)69 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) 70 { 71 PyThreadState *tstate = _PyThreadState_GET(); 72 _PyErr_Restore(tstate, type, value, traceback); 73 } 74 75 76 _PyErr_StackItem * _PyErr_GetTopmostException(PyThreadState * tstate)77 _PyErr_GetTopmostException(PyThreadState *tstate) 78 { 79 _PyErr_StackItem *exc_info = tstate->exc_info; 80 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && 81 exc_info->previous_item != NULL) 82 { 83 exc_info = exc_info->previous_item; 84 } 85 return exc_info; 86 } 87 88 static PyObject* _PyErr_CreateException(PyObject * exception_type,PyObject * value)89 _PyErr_CreateException(PyObject *exception_type, PyObject *value) 90 { 91 PyObject *exc; 92 93 if (value == NULL || value == Py_None) { 94 exc = _PyObject_CallNoArg(exception_type); 95 } 96 else if (PyTuple_Check(value)) { 97 exc = PyObject_Call(exception_type, value, NULL); 98 } 99 else { 100 exc = PyObject_CallOneArg(exception_type, value); 101 } 102 103 if (exc != NULL && !PyExceptionInstance_Check(exc)) { 104 PyErr_Format(PyExc_TypeError, 105 "calling %R should have returned an instance of " 106 "BaseException, not %s", 107 exception_type, Py_TYPE(exc)->tp_name); 108 Py_CLEAR(exc); 109 } 110 111 return exc; 112 } 113 114 void _PyErr_SetObject(PyThreadState * tstate,PyObject * exception,PyObject * value)115 _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) 116 { 117 PyObject *exc_value; 118 PyObject *tb = NULL; 119 120 if (exception != NULL && 121 !PyExceptionClass_Check(exception)) { 122 _PyErr_Format(tstate, PyExc_SystemError, 123 "_PyErr_SetObject: " 124 "exception %R is not a BaseException subclass", 125 exception); 126 return; 127 } 128 129 Py_XINCREF(value); 130 exc_value = _PyErr_GetTopmostException(tstate)->exc_value; 131 if (exc_value != NULL && exc_value != Py_None) { 132 /* Implicit exception chaining */ 133 Py_INCREF(exc_value); 134 if (value == NULL || !PyExceptionInstance_Check(value)) { 135 /* We must normalize the value right now */ 136 PyObject *fixed_value; 137 138 /* Issue #23571: functions must not be called with an 139 exception set */ 140 _PyErr_Clear(tstate); 141 142 fixed_value = _PyErr_CreateException(exception, value); 143 Py_XDECREF(value); 144 if (fixed_value == NULL) { 145 Py_DECREF(exc_value); 146 return; 147 } 148 149 value = fixed_value; 150 } 151 152 /* Avoid creating new reference cycles through the 153 context chain, while taking care not to hang on 154 pre-existing ones. 155 This is O(chain length) but context chains are 156 usually very short. Sensitive readers may try 157 to inline the call to PyException_GetContext. */ 158 if (exc_value != value) { 159 PyObject *o = exc_value, *context; 160 PyObject *slow_o = o; /* Floyd's cycle detection algo */ 161 int slow_update_toggle = 0; 162 while ((context = PyException_GetContext(o))) { 163 Py_DECREF(context); 164 if (context == value) { 165 PyException_SetContext(o, NULL); 166 break; 167 } 168 o = context; 169 if (o == slow_o) { 170 /* pre-existing cycle - all exceptions on the 171 path were visited and checked. */ 172 break; 173 } 174 if (slow_update_toggle) { 175 slow_o = PyException_GetContext(slow_o); 176 Py_DECREF(slow_o); 177 } 178 slow_update_toggle = !slow_update_toggle; 179 } 180 PyException_SetContext(value, exc_value); 181 } 182 else { 183 Py_DECREF(exc_value); 184 } 185 } 186 if (value != NULL && PyExceptionInstance_Check(value)) 187 tb = PyException_GetTraceback(value); 188 Py_XINCREF(exception); 189 _PyErr_Restore(tstate, exception, value, tb); 190 } 191 192 void PyErr_SetObject(PyObject * exception,PyObject * value)193 PyErr_SetObject(PyObject *exception, PyObject *value) 194 { 195 PyThreadState *tstate = _PyThreadState_GET(); 196 _PyErr_SetObject(tstate, exception, value); 197 } 198 199 /* Set a key error with the specified argument, wrapping it in a 200 * tuple automatically so that tuple keys are not unpacked as the 201 * exception arguments. */ 202 void _PyErr_SetKeyError(PyObject * arg)203 _PyErr_SetKeyError(PyObject *arg) 204 { 205 PyThreadState *tstate = _PyThreadState_GET(); 206 PyObject *tup = PyTuple_Pack(1, arg); 207 if (!tup) { 208 /* caller will expect error to be set anyway */ 209 return; 210 } 211 _PyErr_SetObject(tstate, PyExc_KeyError, tup); 212 Py_DECREF(tup); 213 } 214 215 void _PyErr_SetNone(PyThreadState * tstate,PyObject * exception)216 _PyErr_SetNone(PyThreadState *tstate, PyObject *exception) 217 { 218 _PyErr_SetObject(tstate, exception, (PyObject *)NULL); 219 } 220 221 222 void PyErr_SetNone(PyObject * exception)223 PyErr_SetNone(PyObject *exception) 224 { 225 PyThreadState *tstate = _PyThreadState_GET(); 226 _PyErr_SetNone(tstate, exception); 227 } 228 229 230 void _PyErr_SetString(PyThreadState * tstate,PyObject * exception,const char * string)231 _PyErr_SetString(PyThreadState *tstate, PyObject *exception, 232 const char *string) 233 { 234 PyObject *value = PyUnicode_FromString(string); 235 _PyErr_SetObject(tstate, exception, value); 236 Py_XDECREF(value); 237 } 238 239 void PyErr_SetString(PyObject * exception,const char * string)240 PyErr_SetString(PyObject *exception, const char *string) 241 { 242 PyThreadState *tstate = _PyThreadState_GET(); 243 _PyErr_SetString(tstate, exception, string); 244 } 245 246 247 PyObject* _Py_HOT_FUNCTION PyErr_Occurred(void)248 PyErr_Occurred(void) 249 { 250 /* The caller must hold the GIL. */ 251 assert(PyGILState_Check()); 252 253 PyThreadState *tstate = _PyThreadState_GET(); 254 return _PyErr_Occurred(tstate); 255 } 256 257 258 int PyErr_GivenExceptionMatches(PyObject * err,PyObject * exc)259 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) 260 { 261 if (err == NULL || exc == NULL) { 262 /* maybe caused by "import exceptions" that failed early on */ 263 return 0; 264 } 265 if (PyTuple_Check(exc)) { 266 Py_ssize_t i, n; 267 n = PyTuple_Size(exc); 268 for (i = 0; i < n; i++) { 269 /* Test recursively */ 270 if (PyErr_GivenExceptionMatches( 271 err, PyTuple_GET_ITEM(exc, i))) 272 { 273 return 1; 274 } 275 } 276 return 0; 277 } 278 /* err might be an instance, so check its class. */ 279 if (PyExceptionInstance_Check(err)) 280 err = PyExceptionInstance_Class(err); 281 282 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { 283 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc); 284 } 285 286 return err == exc; 287 } 288 289 290 int _PyErr_ExceptionMatches(PyThreadState * tstate,PyObject * exc)291 _PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc) 292 { 293 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc); 294 } 295 296 297 int PyErr_ExceptionMatches(PyObject * exc)298 PyErr_ExceptionMatches(PyObject *exc) 299 { 300 PyThreadState *tstate = _PyThreadState_GET(); 301 return _PyErr_ExceptionMatches(tstate, exc); 302 } 303 304 305 #ifndef Py_NORMALIZE_RECURSION_LIMIT 306 #define Py_NORMALIZE_RECURSION_LIMIT 32 307 #endif 308 309 /* Used in many places to normalize a raised exception, including in 310 eval_code2(), do_raise(), and PyErr_Print() 311 312 XXX: should PyErr_NormalizeException() also call 313 PyException_SetTraceback() with the resulting value and tb? 314 */ 315 void _PyErr_NormalizeException(PyThreadState * tstate,PyObject ** exc,PyObject ** val,PyObject ** tb)316 _PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, 317 PyObject **val, PyObject **tb) 318 { 319 int recursion_depth = 0; 320 tstate->recursion_headroom++; 321 PyObject *type, *value, *initial_tb; 322 323 restart: 324 type = *exc; 325 if (type == NULL) { 326 /* There was no exception, so nothing to do. */ 327 tstate->recursion_headroom--; 328 return; 329 } 330 331 value = *val; 332 /* If PyErr_SetNone() was used, the value will have been actually 333 set to NULL. 334 */ 335 if (!value) { 336 value = Py_None; 337 Py_INCREF(value); 338 } 339 340 /* Normalize the exception so that if the type is a class, the 341 value will be an instance. 342 */ 343 if (PyExceptionClass_Check(type)) { 344 PyObject *inclass = NULL; 345 int is_subclass = 0; 346 347 if (PyExceptionInstance_Check(value)) { 348 inclass = PyExceptionInstance_Class(value); 349 is_subclass = PyObject_IsSubclass(inclass, type); 350 if (is_subclass < 0) { 351 goto error; 352 } 353 } 354 355 /* If the value was not an instance, or is not an instance 356 whose class is (or is derived from) type, then use the 357 value as an argument to instantiation of the type 358 class. 359 */ 360 if (!is_subclass) { 361 PyObject *fixed_value = _PyErr_CreateException(type, value); 362 if (fixed_value == NULL) { 363 goto error; 364 } 365 Py_DECREF(value); 366 value = fixed_value; 367 } 368 /* If the class of the instance doesn't exactly match the 369 class of the type, believe the instance. 370 */ 371 else if (inclass != type) { 372 Py_INCREF(inclass); 373 Py_DECREF(type); 374 type = inclass; 375 } 376 } 377 *exc = type; 378 *val = value; 379 tstate->recursion_headroom--; 380 return; 381 382 error: 383 Py_DECREF(type); 384 Py_DECREF(value); 385 recursion_depth++; 386 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) { 387 _PyErr_SetString(tstate, PyExc_RecursionError, 388 "maximum recursion depth exceeded " 389 "while normalizing an exception"); 390 } 391 /* If the new exception doesn't set a traceback and the old 392 exception had a traceback, use the old traceback for the 393 new exception. It's better than nothing. 394 */ 395 initial_tb = *tb; 396 _PyErr_Fetch(tstate, exc, val, tb); 397 assert(*exc != NULL); 398 if (initial_tb != NULL) { 399 if (*tb == NULL) 400 *tb = initial_tb; 401 else 402 Py_DECREF(initial_tb); 403 } 404 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the 405 corresponding RecursionError could not be normalized, and the 406 MemoryError raised when normalize this RecursionError could not be 407 normalized. */ 408 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) { 409 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) { 410 Py_FatalError("Cannot recover from MemoryErrors " 411 "while normalizing exceptions."); 412 } 413 else { 414 Py_FatalError("Cannot recover from the recursive normalization " 415 "of an exception."); 416 } 417 } 418 goto restart; 419 } 420 421 422 void PyErr_NormalizeException(PyObject ** exc,PyObject ** val,PyObject ** tb)423 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) 424 { 425 PyThreadState *tstate = _PyThreadState_GET(); 426 _PyErr_NormalizeException(tstate, exc, val, tb); 427 } 428 429 430 void _PyErr_Fetch(PyThreadState * tstate,PyObject ** p_type,PyObject ** p_value,PyObject ** p_traceback)431 _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value, 432 PyObject **p_traceback) 433 { 434 *p_type = tstate->curexc_type; 435 *p_value = tstate->curexc_value; 436 *p_traceback = tstate->curexc_traceback; 437 438 tstate->curexc_type = NULL; 439 tstate->curexc_value = NULL; 440 tstate->curexc_traceback = NULL; 441 } 442 443 444 void PyErr_Fetch(PyObject ** p_type,PyObject ** p_value,PyObject ** p_traceback)445 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) 446 { 447 PyThreadState *tstate = _PyThreadState_GET(); 448 _PyErr_Fetch(tstate, p_type, p_value, p_traceback); 449 } 450 451 452 void _PyErr_Clear(PyThreadState * tstate)453 _PyErr_Clear(PyThreadState *tstate) 454 { 455 _PyErr_Restore(tstate, NULL, NULL, NULL); 456 } 457 458 459 void PyErr_Clear(void)460 PyErr_Clear(void) 461 { 462 PyThreadState *tstate = _PyThreadState_GET(); 463 _PyErr_Clear(tstate); 464 } 465 466 467 void _PyErr_GetExcInfo(PyThreadState * tstate,PyObject ** p_type,PyObject ** p_value,PyObject ** p_traceback)468 _PyErr_GetExcInfo(PyThreadState *tstate, 469 PyObject **p_type, PyObject **p_value, PyObject **p_traceback) 470 { 471 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); 472 *p_type = exc_info->exc_type; 473 *p_value = exc_info->exc_value; 474 *p_traceback = exc_info->exc_traceback; 475 476 Py_XINCREF(*p_type); 477 Py_XINCREF(*p_value); 478 Py_XINCREF(*p_traceback); 479 } 480 481 482 void PyErr_GetExcInfo(PyObject ** p_type,PyObject ** p_value,PyObject ** p_traceback)483 PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) 484 { 485 PyThreadState *tstate = _PyThreadState_GET(); 486 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); 487 } 488 489 void PyErr_SetExcInfo(PyObject * p_type,PyObject * p_value,PyObject * p_traceback)490 PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) 491 { 492 PyObject *oldtype, *oldvalue, *oldtraceback; 493 PyThreadState *tstate = _PyThreadState_GET(); 494 495 oldtype = tstate->exc_info->exc_type; 496 oldvalue = tstate->exc_info->exc_value; 497 oldtraceback = tstate->exc_info->exc_traceback; 498 499 tstate->exc_info->exc_type = p_type; 500 tstate->exc_info->exc_value = p_value; 501 tstate->exc_info->exc_traceback = p_traceback; 502 503 Py_XDECREF(oldtype); 504 Py_XDECREF(oldvalue); 505 Py_XDECREF(oldtraceback); 506 } 507 508 /* Like PyErr_Restore(), but if an exception is already set, 509 set the context associated with it. 510 511 The caller is responsible for ensuring that this call won't create 512 any cycles in the exception context chain. */ 513 void _PyErr_ChainExceptions(PyObject * exc,PyObject * val,PyObject * tb)514 _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) 515 { 516 if (exc == NULL) 517 return; 518 519 PyThreadState *tstate = _PyThreadState_GET(); 520 521 if (!PyExceptionClass_Check(exc)) { 522 _PyErr_Format(tstate, PyExc_SystemError, 523 "_PyErr_ChainExceptions: " 524 "exception %R is not a BaseException subclass", 525 exc); 526 return; 527 } 528 529 if (_PyErr_Occurred(tstate)) { 530 PyObject *exc2, *val2, *tb2; 531 _PyErr_Fetch(tstate, &exc2, &val2, &tb2); 532 _PyErr_NormalizeException(tstate, &exc, &val, &tb); 533 if (tb != NULL) { 534 PyException_SetTraceback(val, tb); 535 Py_DECREF(tb); 536 } 537 Py_DECREF(exc); 538 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2); 539 PyException_SetContext(val2, val); 540 _PyErr_Restore(tstate, exc2, val2, tb2); 541 } 542 else { 543 _PyErr_Restore(tstate, exc, val, tb); 544 } 545 } 546 547 /* Set the currently set exception's context to the given exception. 548 549 If the provided exc_info is NULL, then the current Python thread state's 550 exc_info will be used for the context instead. 551 552 This function can only be called when _PyErr_Occurred() is true. 553 Also, this function won't create any cycles in the exception context 554 chain to the extent that _PyErr_SetObject ensures this. */ 555 void _PyErr_ChainStackItem(_PyErr_StackItem * exc_info)556 _PyErr_ChainStackItem(_PyErr_StackItem *exc_info) 557 { 558 PyThreadState *tstate = _PyThreadState_GET(); 559 assert(_PyErr_Occurred(tstate)); 560 561 int exc_info_given; 562 if (exc_info == NULL) { 563 exc_info_given = 0; 564 exc_info = tstate->exc_info; 565 } else { 566 exc_info_given = 1; 567 } 568 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) { 569 return; 570 } 571 572 _PyErr_StackItem *saved_exc_info; 573 if (exc_info_given) { 574 /* Temporarily set the thread state's exc_info since this is what 575 _PyErr_SetObject uses for implicit exception chaining. */ 576 saved_exc_info = tstate->exc_info; 577 tstate->exc_info = exc_info; 578 } 579 580 PyObject *exc, *val, *tb; 581 _PyErr_Fetch(tstate, &exc, &val, &tb); 582 583 PyObject *exc2, *val2, *tb2; 584 exc2 = exc_info->exc_type; 585 val2 = exc_info->exc_value; 586 tb2 = exc_info->exc_traceback; 587 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2); 588 if (tb2 != NULL) { 589 PyException_SetTraceback(val2, tb2); 590 } 591 592 /* _PyErr_SetObject sets the context from PyThreadState. */ 593 _PyErr_SetObject(tstate, exc, val); 594 Py_DECREF(exc); // since _PyErr_Occurred was true 595 Py_XDECREF(val); 596 Py_XDECREF(tb); 597 598 if (exc_info_given) { 599 tstate->exc_info = saved_exc_info; 600 } 601 } 602 603 static PyObject * _PyErr_FormatVFromCause(PyThreadState * tstate,PyObject * exception,const char * format,va_list vargs)604 _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, 605 const char *format, va_list vargs) 606 { 607 PyObject *exc, *val, *val2, *tb; 608 609 assert(_PyErr_Occurred(tstate)); 610 _PyErr_Fetch(tstate, &exc, &val, &tb); 611 _PyErr_NormalizeException(tstate, &exc, &val, &tb); 612 if (tb != NULL) { 613 PyException_SetTraceback(val, tb); 614 Py_DECREF(tb); 615 } 616 Py_DECREF(exc); 617 assert(!_PyErr_Occurred(tstate)); 618 619 _PyErr_FormatV(tstate, exception, format, vargs); 620 621 _PyErr_Fetch(tstate, &exc, &val2, &tb); 622 _PyErr_NormalizeException(tstate, &exc, &val2, &tb); 623 Py_INCREF(val); 624 PyException_SetCause(val2, val); 625 PyException_SetContext(val2, val); 626 _PyErr_Restore(tstate, exc, val2, tb); 627 628 return NULL; 629 } 630 631 PyObject * _PyErr_FormatFromCauseTstate(PyThreadState * tstate,PyObject * exception,const char * format,...)632 _PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception, 633 const char *format, ...) 634 { 635 va_list vargs; 636 #ifdef HAVE_STDARG_PROTOTYPES 637 va_start(vargs, format); 638 #else 639 va_start(vargs); 640 #endif 641 _PyErr_FormatVFromCause(tstate, exception, format, vargs); 642 va_end(vargs); 643 return NULL; 644 } 645 646 PyObject * _PyErr_FormatFromCause(PyObject * exception,const char * format,...)647 _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) 648 { 649 PyThreadState *tstate = _PyThreadState_GET(); 650 va_list vargs; 651 #ifdef HAVE_STDARG_PROTOTYPES 652 va_start(vargs, format); 653 #else 654 va_start(vargs); 655 #endif 656 _PyErr_FormatVFromCause(tstate, exception, format, vargs); 657 va_end(vargs); 658 return NULL; 659 } 660 661 /* Convenience functions to set a type error exception and return 0 */ 662 663 int PyErr_BadArgument(void)664 PyErr_BadArgument(void) 665 { 666 PyThreadState *tstate = _PyThreadState_GET(); 667 _PyErr_SetString(tstate, PyExc_TypeError, 668 "bad argument type for built-in operation"); 669 return 0; 670 } 671 672 PyObject * _PyErr_NoMemory(PyThreadState * tstate)673 _PyErr_NoMemory(PyThreadState *tstate) 674 { 675 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) { 676 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been 677 initialized by _PyExc_Init() */ 678 Py_FatalError("Out of memory and PyExc_MemoryError is not " 679 "initialized yet"); 680 } 681 _PyErr_SetNone(tstate, PyExc_MemoryError); 682 return NULL; 683 } 684 685 PyObject * PyErr_NoMemory(void)686 PyErr_NoMemory(void) 687 { 688 PyThreadState *tstate = _PyThreadState_GET(); 689 return _PyErr_NoMemory(tstate); 690 } 691 692 PyObject * PyErr_SetFromErrnoWithFilenameObject(PyObject * exc,PyObject * filenameObject)693 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) 694 { 695 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL); 696 } 697 698 PyObject * PyErr_SetFromErrnoWithFilenameObjects(PyObject * exc,PyObject * filenameObject,PyObject * filenameObject2)699 PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2) 700 { 701 PyThreadState *tstate = _PyThreadState_GET(); 702 PyObject *message; 703 PyObject *v, *args; 704 int i = errno; 705 #ifdef MS_WINDOWS 706 WCHAR *s_buf = NULL; 707 #endif /* Unix/Windows */ 708 709 #ifdef EINTR 710 if (i == EINTR && PyErr_CheckSignals()) 711 return NULL; 712 #endif 713 714 #ifndef MS_WINDOWS 715 if (i != 0) { 716 const char *s = strerror(i); 717 message = PyUnicode_DecodeLocale(s, "surrogateescape"); 718 } 719 else { 720 /* Sometimes errno didn't get set */ 721 message = PyUnicode_FromString("Error"); 722 } 723 #else 724 if (i == 0) 725 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */ 726 else 727 { 728 /* Note that the Win32 errors do not lineup with the 729 errno error. So if the error is in the MSVC error 730 table, we use it, otherwise we assume it really _is_ 731 a Win32 error code 732 */ 733 if (i > 0 && i < _sys_nerr) { 734 message = PyUnicode_FromString(_sys_errlist[i]); 735 } 736 else { 737 int len = FormatMessageW( 738 FORMAT_MESSAGE_ALLOCATE_BUFFER | 739 FORMAT_MESSAGE_FROM_SYSTEM | 740 FORMAT_MESSAGE_IGNORE_INSERTS, 741 NULL, /* no message source */ 742 i, 743 MAKELANGID(LANG_NEUTRAL, 744 SUBLANG_DEFAULT), 745 /* Default language */ 746 (LPWSTR) &s_buf, 747 0, /* size not used */ 748 NULL); /* no args */ 749 if (len==0) { 750 /* Only ever seen this in out-of-mem 751 situations */ 752 s_buf = NULL; 753 message = PyUnicode_FromFormat("Windows Error 0x%x", i); 754 } else { 755 /* remove trailing cr/lf and dots */ 756 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) 757 s_buf[--len] = L'\0'; 758 message = PyUnicode_FromWideChar(s_buf, len); 759 } 760 } 761 } 762 #endif /* Unix/Windows */ 763 764 if (message == NULL) 765 { 766 #ifdef MS_WINDOWS 767 LocalFree(s_buf); 768 #endif 769 return NULL; 770 } 771 772 if (filenameObject != NULL) { 773 if (filenameObject2 != NULL) 774 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2); 775 else 776 args = Py_BuildValue("(iOO)", i, message, filenameObject); 777 } else { 778 assert(filenameObject2 == NULL); 779 args = Py_BuildValue("(iO)", i, message); 780 } 781 Py_DECREF(message); 782 783 if (args != NULL) { 784 v = PyObject_Call(exc, args, NULL); 785 Py_DECREF(args); 786 if (v != NULL) { 787 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); 788 Py_DECREF(v); 789 } 790 } 791 #ifdef MS_WINDOWS 792 LocalFree(s_buf); 793 #endif 794 return NULL; 795 } 796 797 PyObject * PyErr_SetFromErrnoWithFilename(PyObject * exc,const char * filename)798 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) 799 { 800 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; 801 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL); 802 Py_XDECREF(name); 803 return result; 804 } 805 806 #ifdef MS_WINDOWS 807 PyObject * PyErr_SetFromErrnoWithUnicodeFilename(PyObject * exc,const Py_UNICODE * filename)808 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename) 809 { 810 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL; 811 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL); 812 Py_XDECREF(name); 813 return result; 814 } 815 #endif /* MS_WINDOWS */ 816 817 PyObject * PyErr_SetFromErrno(PyObject * exc)818 PyErr_SetFromErrno(PyObject *exc) 819 { 820 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL); 821 } 822 823 #ifdef MS_WINDOWS 824 /* Windows specific error code handling */ PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject * exc,int ierr,PyObject * filenameObject)825 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( 826 PyObject *exc, 827 int ierr, 828 PyObject *filenameObject) 829 { 830 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr, 831 filenameObject, NULL); 832 } 833 PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject * exc,int ierr,PyObject * filenameObject,PyObject * filenameObject2)834 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( 835 PyObject *exc, 836 int ierr, 837 PyObject *filenameObject, 838 PyObject *filenameObject2) 839 { 840 PyThreadState *tstate = _PyThreadState_GET(); 841 int len; 842 WCHAR *s_buf = NULL; /* Free via LocalFree */ 843 PyObject *message; 844 PyObject *args, *v; 845 846 DWORD err = (DWORD)ierr; 847 if (err==0) { 848 err = GetLastError(); 849 } 850 851 len = FormatMessageW( 852 /* Error API error */ 853 FORMAT_MESSAGE_ALLOCATE_BUFFER | 854 FORMAT_MESSAGE_FROM_SYSTEM | 855 FORMAT_MESSAGE_IGNORE_INSERTS, 856 NULL, /* no message source */ 857 err, 858 MAKELANGID(LANG_NEUTRAL, 859 SUBLANG_DEFAULT), /* Default language */ 860 (LPWSTR) &s_buf, 861 0, /* size not used */ 862 NULL); /* no args */ 863 if (len==0) { 864 /* Only seen this in out of mem situations */ 865 message = PyUnicode_FromFormat("Windows Error 0x%x", err); 866 s_buf = NULL; 867 } else { 868 /* remove trailing cr/lf and dots */ 869 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) 870 s_buf[--len] = L'\0'; 871 message = PyUnicode_FromWideChar(s_buf, len); 872 } 873 874 if (message == NULL) 875 { 876 LocalFree(s_buf); 877 return NULL; 878 } 879 880 if (filenameObject == NULL) { 881 assert(filenameObject2 == NULL); 882 filenameObject = filenameObject2 = Py_None; 883 } 884 else if (filenameObject2 == NULL) 885 filenameObject2 = Py_None; 886 /* This is the constructor signature for OSError. 887 The POSIX translation will be figured out by the constructor. */ 888 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2); 889 Py_DECREF(message); 890 891 if (args != NULL) { 892 v = PyObject_Call(exc, args, NULL); 893 Py_DECREF(args); 894 if (v != NULL) { 895 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); 896 Py_DECREF(v); 897 } 898 } 899 LocalFree(s_buf); 900 return NULL; 901 } 902 PyErr_SetExcFromWindowsErrWithFilename(PyObject * exc,int ierr,const char * filename)903 PyObject *PyErr_SetExcFromWindowsErrWithFilename( 904 PyObject *exc, 905 int ierr, 906 const char *filename) 907 { 908 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; 909 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, 910 ierr, 911 name, 912 NULL); 913 Py_XDECREF(name); 914 return ret; 915 } 916 PyErr_SetExcFromWindowsErrWithUnicodeFilename(PyObject * exc,int ierr,const Py_UNICODE * filename)917 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename( 918 PyObject *exc, 919 int ierr, 920 const Py_UNICODE *filename) 921 { 922 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL; 923 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, 924 ierr, 925 name, 926 NULL); 927 Py_XDECREF(name); 928 return ret; 929 } 930 PyErr_SetExcFromWindowsErr(PyObject * exc,int ierr)931 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) 932 { 933 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); 934 } 935 PyErr_SetFromWindowsErr(int ierr)936 PyObject *PyErr_SetFromWindowsErr(int ierr) 937 { 938 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError, 939 ierr, NULL); 940 } 941 PyErr_SetFromWindowsErrWithFilename(int ierr,const char * filename)942 PyObject *PyErr_SetFromWindowsErrWithFilename( 943 int ierr, 944 const char *filename) 945 { 946 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; 947 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects( 948 PyExc_OSError, 949 ierr, name, NULL); 950 Py_XDECREF(name); 951 return result; 952 } 953 PyErr_SetFromWindowsErrWithUnicodeFilename(int ierr,const Py_UNICODE * filename)954 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( 955 int ierr, 956 const Py_UNICODE *filename) 957 { 958 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL; 959 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects( 960 PyExc_OSError, 961 ierr, name, NULL); 962 Py_XDECREF(name); 963 return result; 964 } 965 #endif /* MS_WINDOWS */ 966 967 PyObject * PyErr_SetImportErrorSubclass(PyObject * exception,PyObject * msg,PyObject * name,PyObject * path)968 PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, 969 PyObject *name, PyObject *path) 970 { 971 PyThreadState *tstate = _PyThreadState_GET(); 972 int issubclass; 973 PyObject *kwargs, *error; 974 975 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError); 976 if (issubclass < 0) { 977 return NULL; 978 } 979 else if (!issubclass) { 980 _PyErr_SetString(tstate, PyExc_TypeError, 981 "expected a subclass of ImportError"); 982 return NULL; 983 } 984 985 if (msg == NULL) { 986 _PyErr_SetString(tstate, PyExc_TypeError, 987 "expected a message argument"); 988 return NULL; 989 } 990 991 if (name == NULL) { 992 name = Py_None; 993 } 994 if (path == NULL) { 995 path = Py_None; 996 } 997 998 kwargs = PyDict_New(); 999 if (kwargs == NULL) { 1000 return NULL; 1001 } 1002 if (PyDict_SetItemString(kwargs, "name", name) < 0) { 1003 goto done; 1004 } 1005 if (PyDict_SetItemString(kwargs, "path", path) < 0) { 1006 goto done; 1007 } 1008 1009 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs); 1010 if (error != NULL) { 1011 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); 1012 Py_DECREF(error); 1013 } 1014 1015 done: 1016 Py_DECREF(kwargs); 1017 return NULL; 1018 } 1019 1020 PyObject * PyErr_SetImportError(PyObject * msg,PyObject * name,PyObject * path)1021 PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) 1022 { 1023 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path); 1024 } 1025 1026 void _PyErr_BadInternalCall(const char * filename,int lineno)1027 _PyErr_BadInternalCall(const char *filename, int lineno) 1028 { 1029 PyThreadState *tstate = _PyThreadState_GET(); 1030 _PyErr_Format(tstate, PyExc_SystemError, 1031 "%s:%d: bad argument to internal function", 1032 filename, lineno); 1033 } 1034 1035 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can 1036 export the entry point for existing object code: */ 1037 #undef PyErr_BadInternalCall 1038 void PyErr_BadInternalCall(void)1039 PyErr_BadInternalCall(void) 1040 { 1041 assert(0 && "bad argument to internal function"); 1042 PyThreadState *tstate = _PyThreadState_GET(); 1043 _PyErr_SetString(tstate, PyExc_SystemError, 1044 "bad argument to internal function"); 1045 } 1046 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) 1047 1048 1049 static PyObject * _PyErr_FormatV(PyThreadState * tstate,PyObject * exception,const char * format,va_list vargs)1050 _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, 1051 const char *format, va_list vargs) 1052 { 1053 PyObject* string; 1054 1055 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an 1056 exception set, it calls arbitrary Python code like PyObject_Repr() */ 1057 _PyErr_Clear(tstate); 1058 1059 string = PyUnicode_FromFormatV(format, vargs); 1060 1061 _PyErr_SetObject(tstate, exception, string); 1062 Py_XDECREF(string); 1063 return NULL; 1064 } 1065 1066 1067 PyObject * PyErr_FormatV(PyObject * exception,const char * format,va_list vargs)1068 PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) 1069 { 1070 PyThreadState *tstate = _PyThreadState_GET(); 1071 return _PyErr_FormatV(tstate, exception, format, vargs); 1072 } 1073 1074 1075 PyObject * _PyErr_Format(PyThreadState * tstate,PyObject * exception,const char * format,...)1076 _PyErr_Format(PyThreadState *tstate, PyObject *exception, 1077 const char *format, ...) 1078 { 1079 va_list vargs; 1080 #ifdef HAVE_STDARG_PROTOTYPES 1081 va_start(vargs, format); 1082 #else 1083 va_start(vargs); 1084 #endif 1085 _PyErr_FormatV(tstate, exception, format, vargs); 1086 va_end(vargs); 1087 return NULL; 1088 } 1089 1090 1091 PyObject * PyErr_Format(PyObject * exception,const char * format,...)1092 PyErr_Format(PyObject *exception, const char *format, ...) 1093 { 1094 PyThreadState *tstate = _PyThreadState_GET(); 1095 va_list vargs; 1096 #ifdef HAVE_STDARG_PROTOTYPES 1097 va_start(vargs, format); 1098 #else 1099 va_start(vargs); 1100 #endif 1101 _PyErr_FormatV(tstate, exception, format, vargs); 1102 va_end(vargs); 1103 return NULL; 1104 } 1105 1106 1107 PyObject * PyErr_NewException(const char * name,PyObject * base,PyObject * dict)1108 PyErr_NewException(const char *name, PyObject *base, PyObject *dict) 1109 { 1110 PyThreadState *tstate = _PyThreadState_GET(); 1111 PyObject *modulename = NULL; 1112 PyObject *mydict = NULL; 1113 PyObject *bases = NULL; 1114 PyObject *result = NULL; 1115 1116 const char *dot = strrchr(name, '.'); 1117 if (dot == NULL) { 1118 _PyErr_SetString(tstate, PyExc_SystemError, 1119 "PyErr_NewException: name must be module.class"); 1120 return NULL; 1121 } 1122 if (base == NULL) { 1123 base = PyExc_Exception; 1124 } 1125 if (dict == NULL) { 1126 dict = mydict = PyDict_New(); 1127 if (dict == NULL) 1128 goto failure; 1129 } 1130 1131 int r = _PyDict_ContainsId(dict, &PyId___module__); 1132 if (r < 0) { 1133 goto failure; 1134 } 1135 if (r == 0) { 1136 modulename = PyUnicode_FromStringAndSize(name, 1137 (Py_ssize_t)(dot-name)); 1138 if (modulename == NULL) 1139 goto failure; 1140 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0) 1141 goto failure; 1142 } 1143 if (PyTuple_Check(base)) { 1144 bases = base; 1145 /* INCREF as we create a new ref in the else branch */ 1146 Py_INCREF(bases); 1147 } else { 1148 bases = PyTuple_Pack(1, base); 1149 if (bases == NULL) 1150 goto failure; 1151 } 1152 /* Create a real class. */ 1153 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO", 1154 dot+1, bases, dict); 1155 failure: 1156 Py_XDECREF(bases); 1157 Py_XDECREF(mydict); 1158 Py_XDECREF(modulename); 1159 return result; 1160 } 1161 1162 1163 /* Create an exception with docstring */ 1164 PyObject * PyErr_NewExceptionWithDoc(const char * name,const char * doc,PyObject * base,PyObject * dict)1165 PyErr_NewExceptionWithDoc(const char *name, const char *doc, 1166 PyObject *base, PyObject *dict) 1167 { 1168 int result; 1169 PyObject *ret = NULL; 1170 PyObject *mydict = NULL; /* points to the dict only if we create it */ 1171 PyObject *docobj; 1172 1173 if (dict == NULL) { 1174 dict = mydict = PyDict_New(); 1175 if (dict == NULL) { 1176 return NULL; 1177 } 1178 } 1179 1180 if (doc != NULL) { 1181 docobj = PyUnicode_FromString(doc); 1182 if (docobj == NULL) 1183 goto failure; 1184 result = PyDict_SetItemString(dict, "__doc__", docobj); 1185 Py_DECREF(docobj); 1186 if (result < 0) 1187 goto failure; 1188 } 1189 1190 ret = PyErr_NewException(name, base, dict); 1191 failure: 1192 Py_XDECREF(mydict); 1193 return ret; 1194 } 1195 1196 1197 PyDoc_STRVAR(UnraisableHookArgs__doc__, 1198 "UnraisableHookArgs\n\ 1199 \n\ 1200 Type used to pass arguments to sys.unraisablehook."); 1201 1202 static PyTypeObject UnraisableHookArgsType; 1203 1204 static PyStructSequence_Field UnraisableHookArgs_fields[] = { 1205 {"exc_type", "Exception type"}, 1206 {"exc_value", "Exception value"}, 1207 {"exc_traceback", "Exception traceback"}, 1208 {"err_msg", "Error message"}, 1209 {"object", "Object causing the exception"}, 1210 {0} 1211 }; 1212 1213 static PyStructSequence_Desc UnraisableHookArgs_desc = { 1214 .name = "UnraisableHookArgs", 1215 .doc = UnraisableHookArgs__doc__, 1216 .fields = UnraisableHookArgs_fields, 1217 .n_in_sequence = 5 1218 }; 1219 1220 1221 PyStatus _PyErr_InitTypes(void)1222 _PyErr_InitTypes(void) 1223 { 1224 if (UnraisableHookArgsType.tp_name == NULL) { 1225 if (PyStructSequence_InitType2(&UnraisableHookArgsType, 1226 &UnraisableHookArgs_desc) < 0) { 1227 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type"); 1228 } 1229 } 1230 return _PyStatus_OK(); 1231 } 1232 1233 1234 static PyObject * make_unraisable_hook_args(PyThreadState * tstate,PyObject * exc_type,PyObject * exc_value,PyObject * exc_tb,PyObject * err_msg,PyObject * obj)1235 make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, 1236 PyObject *exc_value, PyObject *exc_tb, 1237 PyObject *err_msg, PyObject *obj) 1238 { 1239 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType); 1240 if (args == NULL) { 1241 return NULL; 1242 } 1243 1244 Py_ssize_t pos = 0; 1245 #define ADD_ITEM(exc_type) \ 1246 do { \ 1247 if (exc_type == NULL) { \ 1248 exc_type = Py_None; \ 1249 } \ 1250 Py_INCREF(exc_type); \ 1251 PyStructSequence_SET_ITEM(args, pos++, exc_type); \ 1252 } while (0) 1253 1254 1255 ADD_ITEM(exc_type); 1256 ADD_ITEM(exc_value); 1257 ADD_ITEM(exc_tb); 1258 ADD_ITEM(err_msg); 1259 ADD_ITEM(obj); 1260 #undef ADD_ITEM 1261 1262 if (_PyErr_Occurred(tstate)) { 1263 Py_DECREF(args); 1264 return NULL; 1265 } 1266 return args; 1267 } 1268 1269 1270 1271 /* Default implementation of sys.unraisablehook. 1272 1273 It can be called to log the exception of a custom sys.unraisablehook. 1274 1275 Do nothing if sys.stderr attribute doesn't exist or is set to None. */ 1276 static int write_unraisable_exc_file(PyThreadState * tstate,PyObject * exc_type,PyObject * exc_value,PyObject * exc_tb,PyObject * err_msg,PyObject * obj,PyObject * file)1277 write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, 1278 PyObject *exc_value, PyObject *exc_tb, 1279 PyObject *err_msg, PyObject *obj, PyObject *file) 1280 { 1281 if (obj != NULL && obj != Py_None) { 1282 if (err_msg != NULL && err_msg != Py_None) { 1283 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { 1284 return -1; 1285 } 1286 if (PyFile_WriteString(": ", file) < 0) { 1287 return -1; 1288 } 1289 } 1290 else { 1291 if (PyFile_WriteString("Exception ignored in: ", file) < 0) { 1292 return -1; 1293 } 1294 } 1295 1296 if (PyFile_WriteObject(obj, file, 0) < 0) { 1297 _PyErr_Clear(tstate); 1298 if (PyFile_WriteString("<object repr() failed>", file) < 0) { 1299 return -1; 1300 } 1301 } 1302 if (PyFile_WriteString("\n", file) < 0) { 1303 return -1; 1304 } 1305 } 1306 else if (err_msg != NULL && err_msg != Py_None) { 1307 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { 1308 return -1; 1309 } 1310 if (PyFile_WriteString(":\n", file) < 0) { 1311 return -1; 1312 } 1313 } 1314 1315 if (exc_tb != NULL && exc_tb != Py_None) { 1316 if (PyTraceBack_Print(exc_tb, file) < 0) { 1317 /* continue even if writing the traceback failed */ 1318 _PyErr_Clear(tstate); 1319 } 1320 } 1321 1322 if (exc_type == NULL || exc_type == Py_None) { 1323 return -1; 1324 } 1325 1326 assert(PyExceptionClass_Check(exc_type)); 1327 1328 PyObject *modulename = _PyObject_GetAttrId(exc_type, &PyId___module__); 1329 if (modulename == NULL || !PyUnicode_Check(modulename)) { 1330 Py_XDECREF(modulename); 1331 _PyErr_Clear(tstate); 1332 if (PyFile_WriteString("<unknown>", file) < 0) { 1333 return -1; 1334 } 1335 } 1336 else { 1337 if (!_PyUnicode_EqualToASCIIId(modulename, &PyId_builtins)) { 1338 if (PyFile_WriteObject(modulename, file, Py_PRINT_RAW) < 0) { 1339 Py_DECREF(modulename); 1340 return -1; 1341 } 1342 Py_DECREF(modulename); 1343 if (PyFile_WriteString(".", file) < 0) { 1344 return -1; 1345 } 1346 } 1347 else { 1348 Py_DECREF(modulename); 1349 } 1350 } 1351 1352 PyObject *qualname = _PyType_GetQualName((PyTypeObject *)exc_type); 1353 if (qualname == NULL || !PyUnicode_Check(qualname)) { 1354 Py_XDECREF(qualname); 1355 _PyErr_Clear(tstate); 1356 if (PyFile_WriteString("<unknown>", file) < 0) { 1357 return -1; 1358 } 1359 } 1360 else { 1361 if (PyFile_WriteObject(qualname, file, Py_PRINT_RAW) < 0) { 1362 Py_DECREF(qualname); 1363 return -1; 1364 } 1365 Py_DECREF(qualname); 1366 } 1367 1368 if (exc_value && exc_value != Py_None) { 1369 if (PyFile_WriteString(": ", file) < 0) { 1370 return -1; 1371 } 1372 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) { 1373 _PyErr_Clear(tstate); 1374 if (PyFile_WriteString("<exception str() failed>", file) < 0) { 1375 return -1; 1376 } 1377 } 1378 } 1379 1380 if (PyFile_WriteString("\n", file) < 0) { 1381 return -1; 1382 } 1383 1384 /* Explicitly call file.flush() */ 1385 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); 1386 if (!res) { 1387 return -1; 1388 } 1389 Py_DECREF(res); 1390 1391 return 0; 1392 } 1393 1394 1395 static int write_unraisable_exc(PyThreadState * tstate,PyObject * exc_type,PyObject * exc_value,PyObject * exc_tb,PyObject * err_msg,PyObject * obj)1396 write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type, 1397 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg, 1398 PyObject *obj) 1399 { 1400 PyObject *file = _PySys_GetObjectId(&PyId_stderr); 1401 if (file == NULL || file == Py_None) { 1402 return 0; 1403 } 1404 1405 /* Hold a strong reference to ensure that sys.stderr doesn't go away 1406 while we use it */ 1407 Py_INCREF(file); 1408 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb, 1409 err_msg, obj, file); 1410 Py_DECREF(file); 1411 1412 return res; 1413 } 1414 1415 1416 PyObject* _PyErr_WriteUnraisableDefaultHook(PyObject * args)1417 _PyErr_WriteUnraisableDefaultHook(PyObject *args) 1418 { 1419 PyThreadState *tstate = _PyThreadState_GET(); 1420 1421 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) { 1422 _PyErr_SetString(tstate, PyExc_TypeError, 1423 "sys.unraisablehook argument type " 1424 "must be UnraisableHookArgs"); 1425 return NULL; 1426 } 1427 1428 /* Borrowed references */ 1429 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0); 1430 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1); 1431 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); 1432 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3); 1433 PyObject *obj = PyStructSequence_GET_ITEM(args, 4); 1434 1435 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) { 1436 return NULL; 1437 } 1438 Py_RETURN_NONE; 1439 } 1440 1441 1442 /* Call sys.unraisablehook(). 1443 1444 This function can be used when an exception has occurred but there is no way 1445 for Python to handle it. For example, when a destructor raises an exception 1446 or during garbage collection (gc.collect()). 1447 1448 If err_msg_str is non-NULL, the error message is formatted as: 1449 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in" 1450 error message. 1451 1452 An exception must be set when calling this function. */ 1453 void _PyErr_WriteUnraisableMsg(const char * err_msg_str,PyObject * obj)1454 _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) 1455 { 1456 PyThreadState *tstate = _PyThreadState_GET(); 1457 _Py_EnsureTstateNotNULL(tstate); 1458 1459 PyObject *err_msg = NULL; 1460 PyObject *exc_type, *exc_value, *exc_tb; 1461 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); 1462 1463 assert(exc_type != NULL); 1464 1465 if (exc_type == NULL) { 1466 /* sys.unraisablehook requires that at least exc_type is set */ 1467 goto default_hook; 1468 } 1469 1470 if (exc_tb == NULL) { 1471 PyFrameObject *frame = tstate->frame; 1472 if (frame != NULL) { 1473 exc_tb = _PyTraceBack_FromFrame(NULL, frame); 1474 if (exc_tb == NULL) { 1475 _PyErr_Clear(tstate); 1476 } 1477 } 1478 } 1479 1480 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb); 1481 1482 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) { 1483 if (PyException_SetTraceback(exc_value, exc_tb) < 0) { 1484 _PyErr_Clear(tstate); 1485 } 1486 } 1487 1488 if (err_msg_str != NULL) { 1489 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str); 1490 if (err_msg == NULL) { 1491 PyErr_Clear(); 1492 } 1493 } 1494 1495 PyObject *hook_args = make_unraisable_hook_args( 1496 tstate, exc_type, exc_value, exc_tb, err_msg, obj); 1497 if (hook_args == NULL) { 1498 err_msg_str = ("Exception ignored on building " 1499 "sys.unraisablehook arguments"); 1500 goto error; 1501 } 1502 1503 _Py_IDENTIFIER(unraisablehook); 1504 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook); 1505 if (hook == NULL) { 1506 Py_DECREF(hook_args); 1507 goto default_hook; 1508 } 1509 1510 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) { 1511 Py_DECREF(hook_args); 1512 err_msg_str = "Exception ignored in audit hook"; 1513 obj = NULL; 1514 goto error; 1515 } 1516 1517 if (hook == Py_None) { 1518 Py_DECREF(hook_args); 1519 goto default_hook; 1520 } 1521 1522 PyObject *res = PyObject_CallOneArg(hook, hook_args); 1523 Py_DECREF(hook_args); 1524 if (res != NULL) { 1525 Py_DECREF(res); 1526 goto done; 1527 } 1528 1529 /* sys.unraisablehook failed: log its error using default hook */ 1530 obj = hook; 1531 err_msg_str = NULL; 1532 1533 error: 1534 /* err_msg_str and obj have been updated and we have a new exception */ 1535 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ? 1536 err_msg_str : "Exception ignored in sys.unraisablehook")); 1537 Py_XDECREF(exc_type); 1538 Py_XDECREF(exc_value); 1539 Py_XDECREF(exc_tb); 1540 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); 1541 1542 default_hook: 1543 /* Call the default unraisable hook (ignore failure) */ 1544 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, 1545 err_msg, obj); 1546 1547 done: 1548 Py_XDECREF(exc_type); 1549 Py_XDECREF(exc_value); 1550 Py_XDECREF(exc_tb); 1551 Py_XDECREF(err_msg); 1552 _PyErr_Clear(tstate); /* Just in case */ 1553 } 1554 1555 1556 void PyErr_WriteUnraisable(PyObject * obj)1557 PyErr_WriteUnraisable(PyObject *obj) 1558 { 1559 _PyErr_WriteUnraisableMsg(NULL, obj); 1560 } 1561 1562 1563 void PyErr_SyntaxLocation(const char * filename,int lineno)1564 PyErr_SyntaxLocation(const char *filename, int lineno) 1565 { 1566 PyErr_SyntaxLocationEx(filename, lineno, -1); 1567 } 1568 1569 1570 /* Set file and line information for the current exception. 1571 If the exception is not a SyntaxError, also sets additional attributes 1572 to make printing of exceptions believe it is a syntax error. */ 1573 1574 static void PyErr_SyntaxLocationObjectEx(PyObject * filename,int lineno,int col_offset,int end_lineno,int end_col_offset)1575 PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset, 1576 int end_lineno, int end_col_offset) 1577 { 1578 PyObject *exc, *v, *tb, *tmp; 1579 _Py_IDENTIFIER(filename); 1580 _Py_IDENTIFIER(lineno); 1581 _Py_IDENTIFIER(end_lineno); 1582 _Py_IDENTIFIER(msg); 1583 _Py_IDENTIFIER(offset); 1584 _Py_IDENTIFIER(end_offset); 1585 _Py_IDENTIFIER(print_file_and_line); 1586 _Py_IDENTIFIER(text); 1587 PyThreadState *tstate = _PyThreadState_GET(); 1588 1589 /* add attributes for the line number and filename for the error */ 1590 _PyErr_Fetch(tstate, &exc, &v, &tb); 1591 _PyErr_NormalizeException(tstate, &exc, &v, &tb); 1592 /* XXX check that it is, indeed, a syntax error. It might not 1593 * be, though. */ 1594 tmp = PyLong_FromLong(lineno); 1595 if (tmp == NULL) 1596 _PyErr_Clear(tstate); 1597 else { 1598 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) { 1599 _PyErr_Clear(tstate); 1600 } 1601 Py_DECREF(tmp); 1602 } 1603 tmp = NULL; 1604 if (col_offset >= 0) { 1605 tmp = PyLong_FromLong(col_offset); 1606 if (tmp == NULL) { 1607 _PyErr_Clear(tstate); 1608 } 1609 } 1610 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) { 1611 _PyErr_Clear(tstate); 1612 } 1613 Py_XDECREF(tmp); 1614 1615 tmp = NULL; 1616 if (end_lineno >= 0) { 1617 tmp = PyLong_FromLong(end_lineno); 1618 if (tmp == NULL) { 1619 _PyErr_Clear(tstate); 1620 } 1621 } 1622 if (_PyObject_SetAttrId(v, &PyId_end_lineno, tmp ? tmp : Py_None)) { 1623 _PyErr_Clear(tstate); 1624 } 1625 Py_XDECREF(tmp); 1626 1627 tmp = NULL; 1628 if (end_col_offset >= 0) { 1629 tmp = PyLong_FromLong(end_col_offset); 1630 if (tmp == NULL) { 1631 _PyErr_Clear(tstate); 1632 } 1633 } 1634 if (_PyObject_SetAttrId(v, &PyId_end_offset, tmp ? tmp : Py_None)) { 1635 _PyErr_Clear(tstate); 1636 } 1637 Py_XDECREF(tmp); 1638 1639 tmp = NULL; 1640 if (filename != NULL) { 1641 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) { 1642 _PyErr_Clear(tstate); 1643 } 1644 1645 tmp = PyErr_ProgramTextObject(filename, lineno); 1646 if (tmp) { 1647 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) { 1648 _PyErr_Clear(tstate); 1649 } 1650 Py_DECREF(tmp); 1651 } 1652 else { 1653 _PyErr_Clear(tstate); 1654 } 1655 } 1656 if (exc != PyExc_SyntaxError) { 1657 if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) { 1658 _PyErr_Clear(tstate); 1659 } 1660 else if (tmp) { 1661 Py_DECREF(tmp); 1662 } 1663 else { 1664 tmp = PyObject_Str(v); 1665 if (tmp) { 1666 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) { 1667 _PyErr_Clear(tstate); 1668 } 1669 Py_DECREF(tmp); 1670 } 1671 else { 1672 _PyErr_Clear(tstate); 1673 } 1674 } 1675 if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) { 1676 _PyErr_Clear(tstate); 1677 } 1678 else if (tmp) { 1679 Py_DECREF(tmp); 1680 } 1681 else { 1682 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line, 1683 Py_None)) { 1684 _PyErr_Clear(tstate); 1685 } 1686 } 1687 } 1688 _PyErr_Restore(tstate, exc, v, tb); 1689 } 1690 1691 void PyErr_SyntaxLocationObject(PyObject * filename,int lineno,int col_offset)1692 PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) { 1693 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, lineno, -1); 1694 } 1695 1696 void PyErr_RangedSyntaxLocationObject(PyObject * filename,int lineno,int col_offset,int end_lineno,int end_col_offset)1697 PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset, 1698 int end_lineno, int end_col_offset) { 1699 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, end_lineno, end_col_offset); 1700 } 1701 1702 void PyErr_SyntaxLocationEx(const char * filename,int lineno,int col_offset)1703 PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) 1704 { 1705 PyThreadState *tstate = _PyThreadState_GET(); 1706 PyObject *fileobj; 1707 if (filename != NULL) { 1708 fileobj = PyUnicode_DecodeFSDefault(filename); 1709 if (fileobj == NULL) { 1710 _PyErr_Clear(tstate); 1711 } 1712 } 1713 else { 1714 fileobj = NULL; 1715 } 1716 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset); 1717 Py_XDECREF(fileobj); 1718 } 1719 1720 /* Attempt to load the line of text that the exception refers to. If it 1721 fails, it will return NULL but will not set an exception. 1722 1723 XXX The functionality of this function is quite similar to the 1724 functionality in tb_displayline() in traceback.c. */ 1725 1726 static PyObject * err_programtext(PyThreadState * tstate,FILE * fp,int lineno,const char * encoding)1727 err_programtext(PyThreadState *tstate, FILE *fp, int lineno, const char* encoding) 1728 { 1729 int i; 1730 char linebuf[1000]; 1731 if (fp == NULL) { 1732 return NULL; 1733 } 1734 1735 for (i = 0; i < lineno; i++) { 1736 char *pLastChar = &linebuf[sizeof(linebuf) - 2]; 1737 do { 1738 *pLastChar = '\0'; 1739 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, 1740 fp, NULL) == NULL) { 1741 goto after_loop; 1742 } 1743 /* fgets read *something*; if it didn't get as 1744 far as pLastChar, it must have found a newline 1745 or hit the end of the file; if pLastChar is \n, 1746 it obviously found a newline; else we haven't 1747 yet seen a newline, so must continue */ 1748 } while (*pLastChar != '\0' && *pLastChar != '\n'); 1749 } 1750 1751 after_loop: 1752 fclose(fp); 1753 if (i == lineno) { 1754 PyObject *res; 1755 if (encoding != NULL) { 1756 res = PyUnicode_Decode(linebuf, strlen(linebuf), encoding, "replace"); 1757 } else { 1758 res = PyUnicode_FromString(linebuf); 1759 } 1760 if (res == NULL) 1761 _PyErr_Clear(tstate); 1762 return res; 1763 } 1764 return NULL; 1765 } 1766 1767 PyObject * PyErr_ProgramText(const char * filename,int lineno)1768 PyErr_ProgramText(const char *filename, int lineno) 1769 { 1770 if (filename == NULL) { 1771 return NULL; 1772 } 1773 1774 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); 1775 if (filename_obj == NULL) { 1776 PyErr_Clear(); 1777 return NULL; 1778 } 1779 PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno); 1780 Py_DECREF(filename_obj); 1781 return res; 1782 } 1783 1784 PyObject * _PyErr_ProgramDecodedTextObject(PyObject * filename,int lineno,const char * encoding)1785 _PyErr_ProgramDecodedTextObject(PyObject *filename, int lineno, const char* encoding) 1786 { 1787 if (filename == NULL || lineno <= 0) { 1788 return NULL; 1789 } 1790 1791 PyThreadState *tstate = _PyThreadState_GET(); 1792 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE); 1793 if (fp == NULL) { 1794 _PyErr_Clear(tstate); 1795 return NULL; 1796 } 1797 return err_programtext(tstate, fp, lineno, encoding); 1798 } 1799 1800 PyObject * PyErr_ProgramTextObject(PyObject * filename,int lineno)1801 PyErr_ProgramTextObject(PyObject *filename, int lineno) 1802 { 1803 return _PyErr_ProgramDecodedTextObject(filename, lineno, NULL); 1804 } 1805 1806 #ifdef __cplusplus 1807 } 1808 #endif 1809