@@ -484,7 +484,7 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
484
484
{
485
485
/* This version by Tim Peters */
486
486
PyLongObject * v ;
487
- unsigned long x , prev ;
487
+ unsigned long x ;
488
488
long res ;
489
489
Py_ssize_t i ;
490
490
int sign ;
@@ -527,12 +527,11 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
527
527
i = - (i );
528
528
}
529
529
while (-- i >= 0 ) {
530
- prev = x ;
531
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
532
- if ((x >> PyLong_SHIFT ) != prev ) {
530
+ if (x > (unsigned long )-1 >> PyLong_SHIFT ) {
533
531
* overflow = sign ;
534
532
goto exit ;
535
533
}
534
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
536
535
}
537
536
/* Haven't lost any bits, but casting to long requires extra
538
537
* care (see comment above).
@@ -596,7 +595,7 @@ _PyLong_AsInt(PyObject *obj)
596
595
Py_ssize_t
597
596
PyLong_AsSsize_t (PyObject * vv ) {
598
597
PyLongObject * v ;
599
- size_t x , prev ;
598
+ size_t x ;
600
599
Py_ssize_t i ;
601
600
int sign ;
602
601
@@ -623,10 +622,10 @@ PyLong_AsSsize_t(PyObject *vv) {
623
622
i = - (i );
624
623
}
625
624
while (-- i >= 0 ) {
626
- prev = x ;
627
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
628
- if ((x >> PyLong_SHIFT ) != prev )
625
+ if (x > (size_t )-1 >> PyLong_SHIFT ) {
629
626
goto overflow ;
627
+ }
628
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
630
629
}
631
630
/* Haven't lost any bits, but casting to a signed type requires
632
631
* extra care (see comment above).
@@ -652,7 +651,7 @@ unsigned long
652
651
PyLong_AsUnsignedLong (PyObject * vv )
653
652
{
654
653
PyLongObject * v ;
655
- unsigned long x , prev ;
654
+ unsigned long x ;
656
655
Py_ssize_t i ;
657
656
658
657
if (vv == NULL ) {
@@ -677,14 +676,13 @@ PyLong_AsUnsignedLong(PyObject *vv)
677
676
case 1 : return v -> ob_digit [0 ];
678
677
}
679
678
while (-- i >= 0 ) {
680
- prev = x ;
681
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
682
- if ((x >> PyLong_SHIFT ) != prev ) {
679
+ if (x > (unsigned long )-1 >> PyLong_SHIFT ) {
683
680
PyErr_SetString (PyExc_OverflowError ,
684
681
"Python int too large to convert "
685
682
"to C unsigned long" );
686
683
return (unsigned long ) -1 ;
687
684
}
685
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
688
686
}
689
687
return x ;
690
688
}
@@ -696,7 +694,7 @@ size_t
696
694
PyLong_AsSize_t (PyObject * vv )
697
695
{
698
696
PyLongObject * v ;
699
- size_t x , prev ;
697
+ size_t x ;
700
698
Py_ssize_t i ;
701
699
702
700
if (vv == NULL ) {
@@ -721,13 +719,12 @@ PyLong_AsSize_t(PyObject *vv)
721
719
case 1 : return v -> ob_digit [0 ];
722
720
}
723
721
while (-- i >= 0 ) {
724
- prev = x ;
725
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
726
- if ((x >> PyLong_SHIFT ) != prev ) {
722
+ if (x > (size_t )-1 >> PyLong_SHIFT ) {
727
723
PyErr_SetString (PyExc_OverflowError ,
728
724
"Python int too large to convert to C size_t" );
729
725
return (size_t ) -1 ;
730
726
}
727
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
731
728
}
732
729
return x ;
733
730
}
0 commit comments