@@ -750,23 +750,28 @@ r_string(Py_ssize_t n, RFILE *p)
750
750
static int
751
751
r_byte (RFILE * p )
752
752
{
753
- int c = EOF ;
754
-
755
753
if (p -> ptr != NULL ) {
756
- if (p -> ptr < p -> end )
757
- c = (unsigned char ) * p -> ptr ++ ;
758
- return c ;
754
+ if (p -> ptr < p -> end ) {
755
+ return (unsigned char ) * p -> ptr ++ ;
756
+ }
759
757
}
760
- if (!p -> readable ) {
758
+ else if (!p -> readable ) {
761
759
assert (p -> fp );
762
- c = getc (p -> fp );
760
+ int c = getc (p -> fp );
761
+ if (c != EOF ) {
762
+ return c ;
763
+ }
763
764
}
764
765
else {
765
766
const char * ptr = r_string (1 , p );
766
- if (ptr != NULL )
767
- c = * (const unsigned char * ) ptr ;
767
+ if (ptr != NULL ) {
768
+ return * (const unsigned char * ) ptr ;
769
+ }
770
+ return EOF ;
768
771
}
769
- return c ;
772
+ PyErr_SetString (PyExc_EOFError ,
773
+ "EOF read where not expected" );
774
+ return EOF ;
770
775
}
771
776
772
777
static int
@@ -827,10 +832,11 @@ r_PyLong(RFILE *p)
827
832
digit d ;
828
833
829
834
n = r_long (p );
830
- if (PyErr_Occurred ())
831
- return NULL ;
832
835
if (n == 0 )
833
836
return (PyObject * )_PyLong_New (0 );
837
+ if (n == -1 && PyErr_Occurred ()) {
838
+ return NULL ;
839
+ }
834
840
if (n < - SIZE32_MAX || n > SIZE32_MAX ) {
835
841
PyErr_SetString (PyExc_ValueError ,
836
842
"bad marshal data (long size out of range)" );
@@ -849,10 +855,6 @@ r_PyLong(RFILE *p)
849
855
d = 0 ;
850
856
for (j = 0 ; j < PyLong_MARSHAL_RATIO ; j ++ ) {
851
857
md = r_short (p );
852
- if (PyErr_Occurred ()) {
853
- Py_DECREF (ob );
854
- return NULL ;
855
- }
856
858
if (md < 0 || md > PyLong_MARSHAL_BASE )
857
859
goto bad_digit ;
858
860
d += (digit )md << j * PyLong_MARSHAL_SHIFT ;
@@ -863,10 +865,6 @@ r_PyLong(RFILE *p)
863
865
d = 0 ;
864
866
for (j = 0 ; j < shorts_in_top_digit ; j ++ ) {
865
867
md = r_short (p );
866
- if (PyErr_Occurred ()) {
867
- Py_DECREF (ob );
868
- return NULL ;
869
- }
870
868
if (md < 0 || md > PyLong_MARSHAL_BASE )
871
869
goto bad_digit ;
872
870
/* topmost marshal digit should be nonzero */
@@ -878,18 +876,17 @@ r_PyLong(RFILE *p)
878
876
}
879
877
d += (digit )md << j * PyLong_MARSHAL_SHIFT ;
880
878
}
881
- if (PyErr_Occurred ()) {
882
- Py_DECREF (ob );
883
- return NULL ;
884
- }
879
+ assert (!PyErr_Occurred ());
885
880
/* top digit should be nonzero, else the resulting PyLong won't be
886
881
normalized */
887
882
ob -> ob_digit [size - 1 ] = d ;
888
883
return (PyObject * )ob ;
889
884
bad_digit :
890
885
Py_DECREF (ob );
891
- PyErr_SetString (PyExc_ValueError ,
892
- "bad marshal data (digit out of range in long)" );
886
+ if (!PyErr_Occurred ()) {
887
+ PyErr_SetString (PyExc_ValueError ,
888
+ "bad marshal data (digit out of range in long)" );
889
+ }
893
890
return NULL ;
894
891
}
895
892
@@ -912,8 +909,6 @@ r_float_str(RFILE *p)
912
909
const char * ptr ;
913
910
n = r_byte (p );
914
911
if (n == EOF ) {
915
- PyErr_SetString (PyExc_EOFError ,
916
- "EOF read where object expected" );
917
912
return -1 ;
918
913
}
919
914
ptr = r_string (n , p );
@@ -992,8 +987,10 @@ r_object(RFILE *p)
992
987
PyObject * retval = NULL ;
993
988
994
989
if (code == EOF ) {
995
- PyErr_SetString (PyExc_EOFError ,
996
- "EOF read where object expected" );
990
+ if (PyErr_ExceptionMatches (PyExc_EOFError )) {
991
+ PyErr_SetString (PyExc_EOFError ,
992
+ "EOF read where object expected" );
993
+ }
997
994
return NULL ;
998
995
}
999
996
@@ -1045,7 +1042,10 @@ r_object(RFILE *p)
1045
1042
1046
1043
case TYPE_INT :
1047
1044
n = r_long (p );
1048
- retval = PyErr_Occurred () ? NULL : PyLong_FromLong (n );
1045
+ if (n == -1 && PyErr_Occurred ()) {
1046
+ break ;
1047
+ }
1048
+ retval = PyLong_FromLong (n );
1049
1049
R_REF (retval );
1050
1050
break ;
1051
1051
@@ -1111,10 +1111,11 @@ r_object(RFILE *p)
1111
1111
{
1112
1112
const char * ptr ;
1113
1113
n = r_long (p );
1114
- if (PyErr_Occurred ())
1115
- break ;
1116
1114
if (n < 0 || n > SIZE32_MAX ) {
1117
- PyErr_SetString (PyExc_ValueError , "bad marshal data (bytes object size out of range)" );
1115
+ if (!PyErr_Occurred ()) {
1116
+ PyErr_SetString (PyExc_ValueError ,
1117
+ "bad marshal data (bytes object size out of range)" );
1118
+ }
1118
1119
break ;
1119
1120
}
1120
1121
v = PyBytes_FromStringAndSize ((char * )NULL , n );
@@ -1136,10 +1137,11 @@ r_object(RFILE *p)
1136
1137
/* fall through */
1137
1138
case TYPE_ASCII :
1138
1139
n = r_long (p );
1139
- if (PyErr_Occurred ())
1140
- break ;
1141
1140
if (n < 0 || n > SIZE32_MAX ) {
1142
- PyErr_SetString (PyExc_ValueError , "bad marshal data (string size out of range)" );
1141
+ if (!PyErr_Occurred ()) {
1142
+ PyErr_SetString (PyExc_ValueError ,
1143
+ "bad marshal data (string size out of range)" );
1144
+ }
1143
1145
break ;
1144
1146
}
1145
1147
goto _read_ascii ;
@@ -1150,8 +1152,6 @@ r_object(RFILE *p)
1150
1152
case TYPE_SHORT_ASCII :
1151
1153
n = r_byte (p );
1152
1154
if (n == EOF ) {
1153
- PyErr_SetString (PyExc_EOFError ,
1154
- "EOF read where object expected" );
1155
1155
break ;
1156
1156
}
1157
1157
_read_ascii :
@@ -1178,10 +1178,11 @@ r_object(RFILE *p)
1178
1178
const char * buffer ;
1179
1179
1180
1180
n = r_long (p );
1181
- if (PyErr_Occurred ())
1182
- break ;
1183
1181
if (n < 0 || n > SIZE32_MAX ) {
1184
- PyErr_SetString (PyExc_ValueError , "bad marshal data (string size out of range)" );
1182
+ if (!PyErr_Occurred ()) {
1183
+ PyErr_SetString (PyExc_ValueError ,
1184
+ "bad marshal data (string size out of range)" );
1185
+ }
1185
1186
break ;
1186
1187
}
1187
1188
if (n != 0 ) {
@@ -1203,16 +1204,18 @@ r_object(RFILE *p)
1203
1204
}
1204
1205
1205
1206
case TYPE_SMALL_TUPLE :
1206
- n = ( unsigned char ) r_byte (p );
1207
- if (PyErr_Occurred ())
1207
+ n = r_byte (p );
1208
+ if (n == EOF ) {
1208
1209
break ;
1210
+ }
1209
1211
goto _read_tuple ;
1210
1212
case TYPE_TUPLE :
1211
1213
n = r_long (p );
1212
- if (PyErr_Occurred ())
1213
- break ;
1214
1214
if (n < 0 || n > SIZE32_MAX ) {
1215
- PyErr_SetString (PyExc_ValueError , "bad marshal data (tuple size out of range)" );
1215
+ if (!PyErr_Occurred ()) {
1216
+ PyErr_SetString (PyExc_ValueError ,
1217
+ "bad marshal data (tuple size out of range)" );
1218
+ }
1216
1219
break ;
1217
1220
}
1218
1221
_read_tuple :
@@ -1238,10 +1241,11 @@ r_object(RFILE *p)
1238
1241
1239
1242
case TYPE_LIST :
1240
1243
n = r_long (p );
1241
- if (PyErr_Occurred ())
1242
- break ;
1243
1244
if (n < 0 || n > SIZE32_MAX ) {
1244
- PyErr_SetString (PyExc_ValueError , "bad marshal data (list size out of range)" );
1245
+ if (!PyErr_Occurred ()) {
1246
+ PyErr_SetString (PyExc_ValueError ,
1247
+ "bad marshal data (list size out of range)" );
1248
+ }
1245
1249
break ;
1246
1250
}
1247
1251
v = PyList_New (n );
@@ -1296,10 +1300,11 @@ r_object(RFILE *p)
1296
1300
case TYPE_SET :
1297
1301
case TYPE_FROZENSET :
1298
1302
n = r_long (p );
1299
- if (PyErr_Occurred ())
1300
- break ;
1301
1303
if (n < 0 || n > SIZE32_MAX ) {
1302
- PyErr_SetString (PyExc_ValueError , "bad marshal data (set size out of range)" );
1304
+ if (!PyErr_Occurred ()) {
1305
+ PyErr_SetString (PyExc_ValueError ,
1306
+ "bad marshal data (set size out of range)" );
1307
+ }
1303
1308
break ;
1304
1309
}
1305
1310
@@ -1377,20 +1382,20 @@ r_object(RFILE *p)
1377
1382
1378
1383
/* XXX ignore long->int overflows for now */
1379
1384
argcount = (int )r_long (p );
1380
- if (PyErr_Occurred ())
1385
+ if (argcount == -1 && PyErr_Occurred ())
1381
1386
goto code_error ;
1382
1387
posonlyargcount = (int )r_long (p );
1383
- if (PyErr_Occurred ()) {
1388
+ if (posonlyargcount == -1 && PyErr_Occurred ()) {
1384
1389
goto code_error ;
1385
1390
}
1386
1391
kwonlyargcount = (int )r_long (p );
1387
- if (PyErr_Occurred ())
1392
+ if (kwonlyargcount == -1 && PyErr_Occurred ())
1388
1393
goto code_error ;
1389
1394
stacksize = (int )r_long (p );
1390
- if (PyErr_Occurred ())
1395
+ if (stacksize == -1 && PyErr_Occurred ())
1391
1396
goto code_error ;
1392
1397
flags = (int )r_long (p );
1393
- if (PyErr_Occurred ())
1398
+ if (flags == -1 && PyErr_Occurred ())
1394
1399
goto code_error ;
1395
1400
code = r_object (p );
1396
1401
if (code == NULL )
@@ -1463,6 +1468,10 @@ r_object(RFILE *p)
1463
1468
v = r_ref_insert (v , idx , flag , p );
1464
1469
1465
1470
code_error :
1471
+ if (v == NULL && !PyErr_Occurred ()) {
1472
+ PyErr_SetString (PyExc_TypeError ,
1473
+ "NULL object in marshal data for code object" );
1474
+ }
1466
1475
Py_XDECREF (code );
1467
1476
Py_XDECREF (consts );
1468
1477
Py_XDECREF (names );
@@ -1480,9 +1489,10 @@ r_object(RFILE *p)
1480
1489
case TYPE_REF :
1481
1490
n = r_long (p );
1482
1491
if (n < 0 || n >= PyList_GET_SIZE (p -> refs )) {
1483
- if (n == -1 && PyErr_Occurred ())
1484
- break ;
1485
- PyErr_SetString (PyExc_ValueError , "bad marshal data (invalid reference)" );
1492
+ if (!PyErr_Occurred ()) {
1493
+ PyErr_SetString (PyExc_ValueError ,
1494
+ "bad marshal data (invalid reference)" );
1495
+ }
1486
1496
break ;
1487
1497
}
1488
1498
v = PyList_GET_ITEM (p -> refs , n );
0 commit comments