@@ -405,6 +405,11 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
405
405
{
406
406
long elements ;
407
407
408
+ if ( * p >= max - 2 ) {
409
+ zend_error (E_WARNING , "Bad unserialize data" );
410
+ return -1 ;
411
+ }
412
+
408
413
elements = parse_iv2 ((* p ) + 2 , p );
409
414
410
415
(* p ) += 2 ;
@@ -415,7 +420,7 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
415
420
/* If this class implements Serializable, it should not land here but in object_custom(). The passed string
416
421
obviously doesn't descend from the regular serializer. */
417
422
zend_error (E_WARNING , "Erroneous data format for unserializing '%s'" , ce -> name );
418
- return 0 ;
423
+ return -1 ;
419
424
}
420
425
421
426
return elements ;
@@ -492,7 +497,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
492
497
493
498
494
499
495
- #line 496 "ext/standard/var_unserializer.c"
500
+ #line 501 "ext/standard/var_unserializer.c"
496
501
{
497
502
YYCTYPE yych ;
498
503
static const unsigned char yybm [] = {
@@ -552,9 +557,9 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
552
557
yych = * (YYMARKER = ++ YYCURSOR );
553
558
if (yych == ':' ) goto yy95 ;
554
559
yy3 :
555
- #line 861 "ext/standard/var_unserializer.re"
560
+ #line 875 "ext/standard/var_unserializer.re"
556
561
{ return 0 ; }
557
- #line 558 "ext/standard/var_unserializer.c"
562
+ #line 563 "ext/standard/var_unserializer.c"
558
563
yy4 :
559
564
yych = * (YYMARKER = ++ YYCURSOR );
560
565
if (yych == ':' ) goto yy89 ;
@@ -597,13 +602,13 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
597
602
goto yy3 ;
598
603
yy14 :
599
604
++ YYCURSOR ;
600
- #line 855 "ext/standard/var_unserializer.re"
605
+ #line 869 "ext/standard/var_unserializer.re"
601
606
{
602
607
/* this is the case where we have less data than planned */
603
608
php_error_docref (NULL TSRMLS_CC , E_NOTICE , "Unexpected end of serialized data" );
604
609
return 0 ; /* not sure if it should be 0 or 1 here? */
605
610
}
606
- #line 607 "ext/standard/var_unserializer.c"
611
+ #line 612 "ext/standard/var_unserializer.c"
607
612
yy16 :
608
613
yych = * ++ YYCURSOR ;
609
614
goto yy3 ;
@@ -634,7 +639,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
634
639
yych = * ++ YYCURSOR ;
635
640
if (yych != '"' ) goto yy18 ;
636
641
++ YYCURSOR ;
637
- #line 708 "ext/standard/var_unserializer.re"
642
+ #line 717 "ext/standard/var_unserializer.re"
638
643
{
639
644
size_t len , len2 , len3 , maxlen ;
640
645
long elements ;
@@ -774,14 +779,19 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
774
779
775
780
elements = object_common1 (UNSERIALIZE_PASSTHRU , ce );
776
781
782
+ if (elements < 0 ) {
783
+ efree (class_name );
784
+ return 0 ;
785
+ }
786
+
777
787
if (incomplete_class ) {
778
788
php_store_class_name (* rval , class_name , len2 );
779
789
}
780
790
efree (class_name );
781
791
782
792
return object_common2 (UNSERIALIZE_PASSTHRU , elements );
783
793
}
784
- #line 785 "ext/standard/var_unserializer.c"
794
+ #line 795 "ext/standard/var_unserializer.c"
785
795
yy25 :
786
796
yych = * ++ YYCURSOR ;
787
797
if (yych <= ',' ) {
@@ -806,16 +816,20 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
806
816
yych = * ++ YYCURSOR ;
807
817
if (yych != '"' ) goto yy18 ;
808
818
++ YYCURSOR ;
809
- #line 699 "ext/standard/var_unserializer.re"
819
+ #line 704 "ext/standard/var_unserializer.re"
810
820
{
821
+ long elements ;
811
822
if (!var_hash ) return 0 ;
812
823
813
824
INIT_PZVAL (* rval );
814
825
815
- return object_common2 (UNSERIALIZE_PASSTHRU ,
816
- object_common1 (UNSERIALIZE_PASSTHRU , ZEND_STANDARD_CLASS_DEF_PTR ));
826
+ elements = object_common1 (UNSERIALIZE_PASSTHRU , ZEND_STANDARD_CLASS_DEF_PTR );
827
+ if (elements < 0 ) {
828
+ return 0 ;
829
+ }
830
+ return object_common2 (UNSERIALIZE_PASSTHRU , elements );
817
831
}
818
- #line 819 "ext/standard/var_unserializer.c"
832
+ #line 833 "ext/standard/var_unserializer.c"
819
833
yy32 :
820
834
yych = * ++ YYCURSOR ;
821
835
if (yych == '+' ) goto yy33 ;
@@ -836,7 +850,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
836
850
yych = * ++ YYCURSOR ;
837
851
if (yych != '{' ) goto yy18 ;
838
852
++ YYCURSOR ;
839
- #line 678 "ext/standard/var_unserializer.re"
853
+ #line 683 "ext/standard/var_unserializer.re"
840
854
{
841
855
long elements = parse_iv (start + 2 );
842
856
/* use iv() not uiv() in order to check data range */
@@ -857,7 +871,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
857
871
858
872
return finish_nested_data (UNSERIALIZE_PASSTHRU );
859
873
}
860
- #line 861 "ext/standard/var_unserializer.c"
874
+ #line 875 "ext/standard/var_unserializer.c"
861
875
yy39 :
862
876
yych = * ++ YYCURSOR ;
863
877
if (yych == '+' ) goto yy40 ;
@@ -878,7 +892,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
878
892
yych = * ++ YYCURSOR ;
879
893
if (yych != '"' ) goto yy18 ;
880
894
++ YYCURSOR ;
881
- #line 643 "ext/standard/var_unserializer.re"
895
+ #line 648 "ext/standard/var_unserializer.re"
882
896
{
883
897
size_t len , maxlen ;
884
898
char * str ;
@@ -913,7 +927,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
913
927
ZVAL_STRINGL (* rval , str , len , 0 );
914
928
return 1 ;
915
929
}
916
- #line 917 "ext/standard/var_unserializer.c"
930
+ #line 931 "ext/standard/var_unserializer.c"
917
931
yy46 :
918
932
yych = * ++ YYCURSOR ;
919
933
if (yych == '+' ) goto yy47 ;
@@ -934,7 +948,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
934
948
yych = * ++ YYCURSOR ;
935
949
if (yych != '"' ) goto yy18 ;
936
950
++ YYCURSOR ;
937
- #line 610 "ext/standard/var_unserializer.re"
951
+ #line 615 "ext/standard/var_unserializer.re"
938
952
{
939
953
size_t len , maxlen ;
940
954
char * str ;
@@ -967,7 +981,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
967
981
ZVAL_STRINGL (* rval , str , len , 1 );
968
982
return 1 ;
969
983
}
970
- #line 971 "ext/standard/var_unserializer.c"
984
+ #line 985 "ext/standard/var_unserializer.c"
971
985
yy53 :
972
986
yych = * ++ YYCURSOR ;
973
987
if (yych <= '/' ) {
@@ -1055,7 +1069,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1055
1069
}
1056
1070
yy63 :
1057
1071
++ YYCURSOR ;
1058
- #line 600 "ext/standard/var_unserializer.re"
1072
+ #line 605 "ext/standard/var_unserializer.re"
1059
1073
{
1060
1074
#if SIZEOF_LONG == 4
1061
1075
use_double :
@@ -1065,7 +1079,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1065
1079
ZVAL_DOUBLE (* rval , zend_strtod ((const char * )start + 2 , NULL ));
1066
1080
return 1 ;
1067
1081
}
1068
- #line 1069 "ext/standard/var_unserializer.c"
1082
+ #line 1083 "ext/standard/var_unserializer.c"
1069
1083
yy65 :
1070
1084
yych = * ++ YYCURSOR ;
1071
1085
if (yych <= ',' ) {
@@ -1124,7 +1138,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1124
1138
yych = * ++ YYCURSOR ;
1125
1139
if (yych != ';' ) goto yy18 ;
1126
1140
++ YYCURSOR ;
1127
- #line 585 "ext/standard/var_unserializer.re"
1141
+ #line 590 "ext/standard/var_unserializer.re"
1128
1142
{
1129
1143
* p = YYCURSOR ;
1130
1144
INIT_PZVAL (* rval );
@@ -1139,7 +1153,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1139
1153
1140
1154
return 1 ;
1141
1155
}
1142
- #line 1143 "ext/standard/var_unserializer.c"
1156
+ #line 1157 "ext/standard/var_unserializer.c"
1143
1157
yy76 :
1144
1158
yych = * ++ YYCURSOR ;
1145
1159
if (yych == 'N' ) goto yy73 ;
@@ -1166,7 +1180,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1166
1180
if (yych <= '9' ) goto yy79 ;
1167
1181
if (yych != ';' ) goto yy18 ;
1168
1182
++ YYCURSOR ;
1169
- #line 558 "ext/standard/var_unserializer.re"
1183
+ #line 563 "ext/standard/var_unserializer.re"
1170
1184
{
1171
1185
#if SIZEOF_LONG == 4
1172
1186
int digits = YYCURSOR - start - 3 ;
@@ -1193,32 +1207,32 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1193
1207
ZVAL_LONG (* rval , parse_iv (start + 2 ));
1194
1208
return 1 ;
1195
1209
}
1196
- #line 1197 "ext/standard/var_unserializer.c"
1210
+ #line 1211 "ext/standard/var_unserializer.c"
1197
1211
yy83 :
1198
1212
yych = * ++ YYCURSOR ;
1199
1213
if (yych <= '/' ) goto yy18 ;
1200
1214
if (yych >= '2' ) goto yy18 ;
1201
1215
yych = * ++ YYCURSOR ;
1202
1216
if (yych != ';' ) goto yy18 ;
1203
1217
++ YYCURSOR ;
1204
- #line 551 "ext/standard/var_unserializer.re"
1218
+ #line 556 "ext/standard/var_unserializer.re"
1205
1219
{
1206
1220
* p = YYCURSOR ;
1207
1221
INIT_PZVAL (* rval );
1208
1222
ZVAL_BOOL (* rval , parse_iv (start + 2 ));
1209
1223
return 1 ;
1210
1224
}
1211
- #line 1212 "ext/standard/var_unserializer.c"
1225
+ #line 1226 "ext/standard/var_unserializer.c"
1212
1226
yy87 :
1213
1227
++ YYCURSOR ;
1214
- #line 544 "ext/standard/var_unserializer.re"
1228
+ #line 549 "ext/standard/var_unserializer.re"
1215
1229
{
1216
1230
* p = YYCURSOR ;
1217
1231
INIT_PZVAL (* rval );
1218
1232
ZVAL_NULL (* rval );
1219
1233
return 1 ;
1220
1234
}
1221
- #line 1222 "ext/standard/var_unserializer.c"
1235
+ #line 1236 "ext/standard/var_unserializer.c"
1222
1236
yy89 :
1223
1237
yych = * ++ YYCURSOR ;
1224
1238
if (yych <= ',' ) {
@@ -1241,7 +1255,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1241
1255
if (yych <= '9' ) goto yy91 ;
1242
1256
if (yych != ';' ) goto yy18 ;
1243
1257
++ YYCURSOR ;
1244
- #line 521 "ext/standard/var_unserializer.re"
1258
+ #line 526 "ext/standard/var_unserializer.re"
1245
1259
{
1246
1260
long id ;
1247
1261
@@ -1264,7 +1278,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1264
1278
1265
1279
return 1 ;
1266
1280
}
1267
- #line 1268 "ext/standard/var_unserializer.c"
1281
+ #line 1282 "ext/standard/var_unserializer.c"
1268
1282
yy95 :
1269
1283
yych = * ++ YYCURSOR ;
1270
1284
if (yych <= ',' ) {
@@ -1287,7 +1301,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1287
1301
if (yych <= '9' ) goto yy97 ;
1288
1302
if (yych != ';' ) goto yy18 ;
1289
1303
++ YYCURSOR ;
1290
- #line 500 "ext/standard/var_unserializer.re"
1304
+ #line 505 "ext/standard/var_unserializer.re"
1291
1305
{
1292
1306
long id ;
1293
1307
@@ -1308,9 +1322,9 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
1308
1322
1309
1323
return 1 ;
1310
1324
}
1311
- #line 1312 "ext/standard/var_unserializer.c"
1325
+ #line 1326 "ext/standard/var_unserializer.c"
1312
1326
}
1313
- #line 863 "ext/standard/var_unserializer.re"
1327
+ #line 877 "ext/standard/var_unserializer.re"
1314
1328
1315
1329
1316
1330
return 0 ;
0 commit comments