@@ -471,7 +471,7 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
471
471
{
472
472
/* This version by Tim Peters */
473
473
PyLongObject * v ;
474
- unsigned long x , prev ;
474
+ unsigned long x ;
475
475
long res ;
476
476
Py_ssize_t i ;
477
477
int sign ;
@@ -514,12 +514,11 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
514
514
i = - (i );
515
515
}
516
516
while (-- i >= 0 ) {
517
- prev = x ;
518
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
519
- if ((x >> PyLong_SHIFT ) != prev ) {
517
+ if (x > (unsigned long )-1 >> PyLong_SHIFT ) {
520
518
* overflow = sign ;
521
519
goto exit ;
522
520
}
521
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
523
522
}
524
523
/* Haven't lost any bits, but casting to long requires extra
525
524
* care (see comment above).
@@ -583,7 +582,7 @@ _PyLong_AsInt(PyObject *obj)
583
582
Py_ssize_t
584
583
PyLong_AsSsize_t (PyObject * vv ) {
585
584
PyLongObject * v ;
586
- size_t x , prev ;
585
+ size_t x ;
587
586
Py_ssize_t i ;
588
587
int sign ;
589
588
@@ -610,10 +609,10 @@ PyLong_AsSsize_t(PyObject *vv) {
610
609
i = - (i );
611
610
}
612
611
while (-- i >= 0 ) {
613
- prev = x ;
614
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
615
- if ((x >> PyLong_SHIFT ) != prev )
612
+ if (x > (size_t )-1 >> PyLong_SHIFT ) {
616
613
goto overflow ;
614
+ }
615
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
617
616
}
618
617
/* Haven't lost any bits, but casting to a signed type requires
619
618
* extra care (see comment above).
@@ -639,7 +638,7 @@ unsigned long
639
638
PyLong_AsUnsignedLong (PyObject * vv )
640
639
{
641
640
PyLongObject * v ;
642
- unsigned long x , prev ;
641
+ unsigned long x ;
643
642
Py_ssize_t i ;
644
643
645
644
if (vv == NULL ) {
@@ -664,14 +663,13 @@ PyLong_AsUnsignedLong(PyObject *vv)
664
663
case 1 : return v -> ob_digit [0 ];
665
664
}
666
665
while (-- i >= 0 ) {
667
- prev = x ;
668
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
669
- if ((x >> PyLong_SHIFT ) != prev ) {
666
+ if (x > (unsigned long )-1 >> PyLong_SHIFT ) {
670
667
PyErr_SetString (PyExc_OverflowError ,
671
668
"Python int too large to convert "
672
669
"to C unsigned long" );
673
670
return (unsigned long ) -1 ;
674
671
}
672
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
675
673
}
676
674
return x ;
677
675
}
@@ -683,7 +681,7 @@ size_t
683
681
PyLong_AsSize_t (PyObject * vv )
684
682
{
685
683
PyLongObject * v ;
686
- size_t x , prev ;
684
+ size_t x ;
687
685
Py_ssize_t i ;
688
686
689
687
if (vv == NULL ) {
@@ -708,13 +706,12 @@ PyLong_AsSize_t(PyObject *vv)
708
706
case 1 : return v -> ob_digit [0 ];
709
707
}
710
708
while (-- i >= 0 ) {
711
- prev = x ;
712
- x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
713
- if ((x >> PyLong_SHIFT ) != prev ) {
709
+ if (x > (size_t )-1 >> PyLong_SHIFT ) {
714
710
PyErr_SetString (PyExc_OverflowError ,
715
711
"Python int too large to convert to C size_t" );
716
712
return (size_t ) -1 ;
717
713
}
714
+ x = (x << PyLong_SHIFT ) | v -> ob_digit [i ];
718
715
}
719
716
return x ;
720
717
}
0 commit comments