File tree Expand file tree Collapse file tree 3 files changed +17
-9
lines changed Expand file tree Collapse file tree 3 files changed +17
-9
lines changed Original file line number Diff line number Diff line change @@ -11,4 +11,4 @@ $data = unserialize($str);
11
11
var_dump ($ data );
12
12
13
13
--EXPECT --
14
- string ( 100 ) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
14
+ bool ( false )
Original file line number Diff line number Diff line change @@ -140,18 +140,22 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
140
140
141
141
/* }}} */
142
142
143
- static char * unserialize_str (const unsigned char * * p , size_t * len )
143
+ static char * unserialize_str (const unsigned char * * p , size_t * len , size_t maxlen )
144
144
{
145
145
size_t i , j ;
146
146
char * str = safe_emalloc (* len , 1 , 1 );
147
- unsigned char * end = * (unsigned char * * )p + * len ;
147
+ unsigned char * end = * (unsigned char * * )p + maxlen ;
148
148
149
149
if (end < * p ) {
150
150
efree (str );
151
151
return NULL ;
152
152
}
153
153
154
- for (i = 0 ; i < * len && * p < end ; i ++ ) {
154
+ for (i = 0 ; i < * len ; i ++ ) {
155
+ if (* p >= end ) {
156
+ efree (str );
157
+ return NULL ;
158
+ }
155
159
if (* * p != '\\' ) {
156
160
str [i ] = (char )* * p ;
157
161
} else {
@@ -757,7 +761,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
757
761
return 0 ;
758
762
}
759
763
760
- if ((str = unserialize_str (& YYCURSOR , & len )) == NULL ) {
764
+ if ((str = unserialize_str (& YYCURSOR , & len , maxlen )) == NULL ) {
761
765
return 0 ;
762
766
}
763
767
Original file line number Diff line number Diff line change @@ -138,18 +138,22 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
138
138
139
139
/* }}} */
140
140
141
- static char *unserialize_str (const unsigned char **p, size_t *len)
141
+ static char *unserialize_str (const unsigned char **p, size_t *len, size_t maxlen )
142
142
{
143
143
size_t i, j;
144
144
char *str = safe_emalloc (*len, 1 , 1 );
145
- unsigned char *end = *(unsigned char **)p+*len ;
145
+ unsigned char *end = *(unsigned char **)p+maxlen ;
146
146
147
147
if (end < *p) {
148
148
efree (str);
149
149
return NULL ;
150
150
}
151
151
152
- for (i = 0 ; i < *len && *p < end; i++) {
152
+ for (i = 0 ; i < *len; i++) {
153
+ if (*p >= end) {
154
+ efree (str);
155
+ return NULL ;
156
+ }
153
157
if (**p != ' \\ ' ) {
154
158
str[i] = (char )**p;
155
159
} else {
@@ -525,7 +529,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
525
529
return 0;
526
530
}
527
531
528
- if ((str = unserialize_str(&YYCURSOR, &len)) == NULL) {
532
+ if ((str = unserialize_str(&YYCURSOR, &len, maxlen )) == NULL) {
529
533
return 0;
530
534
}
531
535
You can’t perform that action at this time.
0 commit comments