@@ -778,14 +778,19 @@ get(Picklerobject *self, PyObject *id)
778
778
s [1 ] = (int )(c_value & 0xff );
779
779
len = 2 ;
780
780
}
781
- else {
781
+ else if ( c_value < 0x7fffffffL ) {
782
782
s [0 ] = LONG_BINGET ;
783
783
s [1 ] = (int )(c_value & 0xff );
784
784
s [2 ] = (int )((c_value >> 8 ) & 0xff );
785
785
s [3 ] = (int )((c_value >> 16 ) & 0xff );
786
786
s [4 ] = (int )((c_value >> 24 ) & 0xff );
787
787
len = 5 ;
788
788
}
789
+ else { /* unlikely */
790
+ PyErr_SetString (PicklingError ,
791
+ "memo id too large for LONG_BINGET" );
792
+ return -1 ;
793
+ }
789
794
}
790
795
791
796
if (self -> write_func (self , s , len ) < 0 )
@@ -857,18 +862,23 @@ put2(Picklerobject *self, PyObject *ob)
857
862
goto finally ;
858
863
}
859
864
else {
860
- if (p >= 256 ) {
865
+ if (p < 256 ) {
866
+ c_str [0 ] = BINPUT ;
867
+ c_str [1 ] = p ;
868
+ len = 2 ;
869
+ }
870
+ else if (p < 0x7fffffffL ) {
861
871
c_str [0 ] = LONG_BINPUT ;
862
872
c_str [1 ] = (int )(p & 0xff );
863
873
c_str [2 ] = (int )((p >> 8 ) & 0xff );
864
874
c_str [3 ] = (int )((p >> 16 ) & 0xff );
865
875
c_str [4 ] = (int )((p >> 24 ) & 0xff );
866
876
len = 5 ;
867
877
}
868
- else {
869
- c_str [ 0 ] = BINPUT ;
870
- c_str [ 1 ] = p ;
871
- len = 2 ;
878
+ else { /* unlikely */
879
+ PyErr_SetString ( PicklingError ,
880
+ "memo id too large for LONG_BINPUT" ) ;
881
+ goto finally ;
872
882
}
873
883
}
874
884
@@ -1268,14 +1278,17 @@ save_string(Picklerobject *self, PyObject *args, int doput)
1268
1278
c_str [1 ] = size ;
1269
1279
len = 2 ;
1270
1280
}
1271
- else if (size <= INT_MAX ) {
1281
+ else if (size <= 0x7fffffffL ) {
1272
1282
c_str [0 ] = BINSTRING ;
1273
1283
for (i = 1 ; i < 5 ; i ++ )
1274
1284
c_str [i ] = (int )(size >> ((i - 1 ) * 8 ));
1275
1285
len = 5 ;
1276
1286
}
1277
- else
1287
+ else {
1288
+ PyErr_SetString (PyExc_OverflowError ,
1289
+ "cannot serialize a string larger than 2 GiB" );
1278
1290
return -1 ; /* string too large */
1291
+ }
1279
1292
1280
1293
if (self -> write_func (self , c_str , len ) < 0 )
1281
1294
return -1 ;
@@ -1436,8 +1449,11 @@ save_unicode(Picklerobject *self, PyObject *args, int doput)
1436
1449
1437
1450
if ((size = PyString_Size (repr )) < 0 )
1438
1451
goto err ;
1439
- if (size > INT_MAX )
1440
- return -1 ; /* string too large */
1452
+ if (size > 0x7fffffffL ) {
1453
+ PyErr_SetString (PyExc_OverflowError ,
1454
+ "cannot serialize a Unicode string larger than 2 GiB" );
1455
+ goto err ; /* string too large */
1456
+ }
1441
1457
1442
1458
c_str [0 ] = BINUNICODE ;
1443
1459
for (i = 1 ; i < 5 ; i ++ )
0 commit comments