@@ -314,14 +314,12 @@ value_error_int(const char *mesg)
314314 return -1 ;
315315}
316316
317- #ifdef CONFIG_32
318317static PyObject *
319318value_error_ptr (const char * mesg )
320319{
321320 PyErr_SetString (PyExc_ValueError , mesg );
322321 return NULL ;
323322}
324- #endif
325323
326324static int
327325type_error_int (const char * mesg )
@@ -608,6 +606,8 @@ getround(decimal_state *state, PyObject *v)
608606 initialized to new SignalDicts. Once a SignalDict is tied to
609607 a context, it cannot be deleted. */
610608
609+ static const char * INVALID_SIGNALDICT_ERROR_MSG = "invalid signal dict" ;
610+
611611static int
612612signaldict_init (PyObject * self , PyObject * args UNUSED , PyObject * kwds UNUSED )
613613{
@@ -616,14 +616,20 @@ signaldict_init(PyObject *self, PyObject *args UNUSED, PyObject *kwds UNUSED)
616616}
617617
618618static Py_ssize_t
619- signaldict_len (PyObject * self UNUSED )
619+ signaldict_len (PyObject * self )
620620{
621+ if (SdFlagAddr (self ) == NULL ) {
622+ return value_error_int (INVALID_SIGNALDICT_ERROR_MSG );
623+ }
621624 return SIGNAL_MAP_LEN ;
622625}
623626
624627static PyObject *
625628signaldict_iter (PyObject * self )
626629{
630+ if (SdFlagAddr (self ) == NULL ) {
631+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
632+ }
627633 decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
628634 return PyTuple_Type .tp_iter (state -> SignalTuple );
629635}
@@ -632,6 +638,9 @@ static PyObject *
632638signaldict_getitem (PyObject * self , PyObject * key )
633639{
634640 uint32_t flag ;
641+ if (SdFlagAddr (self ) == NULL ) {
642+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
643+ }
635644 decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
636645
637646 flag = exception_as_flag (state , key );
@@ -648,11 +657,15 @@ signaldict_setitem(PyObject *self, PyObject *key, PyObject *value)
648657 uint32_t flag ;
649658 int x ;
650659
651- decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
660+ if (SdFlagAddr (self ) == NULL ) {
661+ return value_error_int (INVALID_SIGNALDICT_ERROR_MSG );
662+ }
663+
652664 if (value == NULL ) {
653665 return value_error_int ("signal keys cannot be deleted" );
654666 }
655667
668+ decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
656669 flag = exception_as_flag (state , key );
657670 if (flag & DEC_ERRORS ) {
658671 return -1 ;
@@ -697,6 +710,10 @@ signaldict_repr(PyObject *self)
697710 const char * b [SIGNAL_MAP_LEN ]; /* bool */
698711 int i ;
699712
713+ if (SdFlagAddr (self ) == NULL ) {
714+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
715+ }
716+
700717 assert (SIGNAL_MAP_LEN == 9 );
701718
702719 decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
@@ -721,6 +738,10 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
721738 decimal_state * state = find_state_left_or_right (v , w );
722739 assert (PyDecSignalDict_Check (state , v ));
723740
741+ if ((SdFlagAddr (v ) == NULL ) || (SdFlagAddr (w ) == NULL )) {
742+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
743+ }
744+
724745 if (op == Py_EQ || op == Py_NE ) {
725746 if (PyDecSignalDict_Check (state , w )) {
726747 res = (SdFlags (v )== SdFlags (w )) ^ (op == Py_NE ) ? Py_True : Py_False ;
@@ -748,6 +769,9 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
748769static PyObject *
749770signaldict_copy (PyObject * self , PyObject * args UNUSED )
750771{
772+ if (SdFlagAddr (self ) == NULL ) {
773+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
774+ }
751775 decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
752776 return flags_as_dict (state , SdFlags (self ));
753777}
0 commit comments