@@ -314,14 +314,12 @@ value_error_int(const char *mesg)
314
314
return -1 ;
315
315
}
316
316
317
- #ifdef CONFIG_32
318
317
static PyObject *
319
318
value_error_ptr (const char * mesg )
320
319
{
321
320
PyErr_SetString (PyExc_ValueError , mesg );
322
321
return NULL ;
323
322
}
324
- #endif
325
323
326
324
static int
327
325
type_error_int (const char * mesg )
@@ -608,6 +606,8 @@ getround(decimal_state *state, PyObject *v)
608
606
initialized to new SignalDicts. Once a SignalDict is tied to
609
607
a context, it cannot be deleted. */
610
608
609
+ static const char * INVALID_SIGNALDICT_ERROR_MSG = "invalid signal dict" ;
610
+
611
611
static int
612
612
signaldict_init (PyObject * self , PyObject * args UNUSED , PyObject * kwds UNUSED )
613
613
{
@@ -616,14 +616,20 @@ signaldict_init(PyObject *self, PyObject *args UNUSED, PyObject *kwds UNUSED)
616
616
}
617
617
618
618
static Py_ssize_t
619
- signaldict_len (PyObject * self UNUSED )
619
+ signaldict_len (PyObject * self )
620
620
{
621
+ if (SdFlagAddr (self ) == NULL ) {
622
+ return value_error_int (INVALID_SIGNALDICT_ERROR_MSG );
623
+ }
621
624
return SIGNAL_MAP_LEN ;
622
625
}
623
626
624
627
static PyObject *
625
628
signaldict_iter (PyObject * self )
626
629
{
630
+ if (SdFlagAddr (self ) == NULL ) {
631
+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
632
+ }
627
633
decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
628
634
return PyTuple_Type .tp_iter (state -> SignalTuple );
629
635
}
@@ -632,6 +638,9 @@ static PyObject *
632
638
signaldict_getitem (PyObject * self , PyObject * key )
633
639
{
634
640
uint32_t flag ;
641
+ if (SdFlagAddr (self ) == NULL ) {
642
+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
643
+ }
635
644
decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
636
645
637
646
flag = exception_as_flag (state , key );
@@ -648,11 +657,15 @@ signaldict_setitem(PyObject *self, PyObject *key, PyObject *value)
648
657
uint32_t flag ;
649
658
int x ;
650
659
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
+
652
664
if (value == NULL ) {
653
665
return value_error_int ("signal keys cannot be deleted" );
654
666
}
655
667
668
+ decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
656
669
flag = exception_as_flag (state , key );
657
670
if (flag & DEC_ERRORS ) {
658
671
return -1 ;
@@ -697,6 +710,10 @@ signaldict_repr(PyObject *self)
697
710
const char * b [SIGNAL_MAP_LEN ]; /* bool */
698
711
int i ;
699
712
713
+ if (SdFlagAddr (self ) == NULL ) {
714
+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
715
+ }
716
+
700
717
assert (SIGNAL_MAP_LEN == 9 );
701
718
702
719
decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
@@ -721,6 +738,10 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
721
738
decimal_state * state = find_state_left_or_right (v , w );
722
739
assert (PyDecSignalDict_Check (state , v ));
723
740
741
+ if ((SdFlagAddr (v ) == NULL ) || (SdFlagAddr (w ) == NULL )) {
742
+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
743
+ }
744
+
724
745
if (op == Py_EQ || op == Py_NE ) {
725
746
if (PyDecSignalDict_Check (state , w )) {
726
747
res = (SdFlags (v )== SdFlags (w )) ^ (op == Py_NE ) ? Py_True : Py_False ;
@@ -748,6 +769,9 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
748
769
static PyObject *
749
770
signaldict_copy (PyObject * self , PyObject * args UNUSED )
750
771
{
772
+ if (SdFlagAddr (self ) == NULL ) {
773
+ return value_error_ptr (INVALID_SIGNALDICT_ERROR_MSG );
774
+ }
751
775
decimal_state * state = get_module_state_by_def (Py_TYPE (self ));
752
776
return flags_as_dict (state , SdFlags (self ));
753
777
}
0 commit comments