dmitry Mon Jul 9 14:33:37 2007 UTC
Modified files:
/php-src/ext/standard var_unserializer.c var_unserializer.re
/php-src/ext/standard/tests/serialize unserializeS.phpt
Log:
Proper fix for MOPB-29
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.c?r1=1.87&r2=1.88&diff_format=u
Index: php-src/ext/standard/var_unserializer.c
diff -u php-src/ext/standard/var_unserializer.c:1.87
php-src/ext/standard/var_unserializer.c:1.88
--- php-src/ext/standard/var_unserializer.c:1.87 Mon Jul 9 13:43:50 2007
+++ php-src/ext/standard/var_unserializer.c Mon Jul 9 14:33:37 2007
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var_unserializer.c,v 1.87 2007/07/09 13:43:50 dmitry Exp $ */
+/* $Id: var_unserializer.c,v 1.88 2007/07/09 14:33:37 dmitry Exp $ */
#include "php.h"
#include "ext/standard/php_var.h"
@@ -112,18 +112,22 @@
return ustr;
}
-static char *unserialize_str(const unsigned char **p, int *len)
+static char *unserialize_str(const unsigned char **p, size_t *len, size_t
maxlen)
{
size_t i, j;
char *str = safe_emalloc(*len, 1, 1);
- unsigned char *end = *(unsigned char **)p+*len;
+ unsigned char *end = *(unsigned char **)p+maxlen;
if(end < *p) {
efree(str);
return NULL;
}
- for (i = 0; i < *len && *p < end; i++) {
+ for (i = 0; i < *len; i++) {
+ if (*p >= end) {
+ efree(str);
+ return NULL;
+ }
if (**p != '\\') {
str[i] = (char)**p;
} else {
@@ -142,7 +146,6 @@
return NULL;
}
}
- end += 2;
str[i] = (char)ch;
}
(*p)++;
@@ -866,7 +869,7 @@
return 0;
}
- if ((str = unserialize_str(&YYCURSOR, &len)) == NULL) {
+ if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) {
return 0;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.re?r1=1.65&r2=1.66&diff_format=u
Index: php-src/ext/standard/var_unserializer.re
diff -u php-src/ext/standard/var_unserializer.re:1.65
php-src/ext/standard/var_unserializer.re:1.66
--- php-src/ext/standard/var_unserializer.re:1.65 Mon Jul 9 13:43:50 2007
+++ php-src/ext/standard/var_unserializer.re Mon Jul 9 14:33:37 2007
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var_unserializer.re,v 1.65 2007/07/09 13:43:50 dmitry Exp $ */
+/* $Id: var_unserializer.re,v 1.66 2007/07/09 14:33:37 dmitry Exp $ */
#include "php.h"
#include "ext/standard/php_var.h"
@@ -110,18 +110,22 @@
return ustr;
}
-static char *unserialize_str(const unsigned char **p, int *len)
+static char *unserialize_str(const unsigned char **p, size_t *len, size_t
maxlen)
{
size_t i, j;
char *str = safe_emalloc(*len, 1, 1);
- unsigned char *end = *(unsigned char **)p+*len;
+ unsigned char *end = *(unsigned char **)p+maxlen;
if(end < *p) {
efree(str);
return NULL;
}
- for (i = 0; i < *len && *p < end; i++) {
+ for (i = 0; i < *len; i++) {
+ if (*p >= end) {
+ efree(str);
+ return NULL;
+ }
if (**p != '\\') {
str[i] = (char)**p;
} else {
@@ -140,7 +144,6 @@
return NULL;
}
}
- end += 2;
str[i] = (char)ch;
}
(*p)++;
@@ -578,7 +581,7 @@
return 0;
}
- if ((str = unserialize_str(&YYCURSOR, &len)) == NULL) {
+ if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) {
return 0;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/serialize/unserializeS.phpt?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/standard/tests/serialize/unserializeS.phpt
diff -u php-src/ext/standard/tests/serialize/unserializeS.phpt:1.2
php-src/ext/standard/tests/serialize/unserializeS.phpt:1.3
--- php-src/ext/standard/tests/serialize/unserializeS.phpt:1.2 Fri Mar 23
20:34:11 2007
+++ php-src/ext/standard/tests/serialize/unserializeS.phpt Mon Jul 9
14:33:37 2007
@@ -11,4 +11,4 @@
var_dump($data);
--EXPECT--
-string(100)
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+bool(false)
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php