summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-02 14:40:08 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-02 14:40:08 +0000
commit692ce765054531e65f99ec67f42144746ec8a6e9 (patch)
treedd0267b44193b6dac813c09a7bb539234a090584
parent82df70d08c56fcbdd6de7d270b868a5b25f2f0c7 (diff)
* marshal.c (w_object): add a check for modification of array during
its dump, backported r16761. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@19071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--marshal.c11
2 files changed, 11 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 147e2e20b5..00cf69025f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Sep 2 23:39:45 2008 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * marshal.c (w_object): add a check for modification of array during
+ its dump, backported r16761.
+
Tue Sep 2 14:48:55 2008 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/win32.c (gettimeofday): tv_usec is usec, not msec.
diff --git a/marshal.c b/marshal.c
index f643450abd..f8a799617e 100644
--- a/marshal.c
+++ b/marshal.c
@@ -609,13 +609,14 @@ w_object(obj, arg, limit)
w_uclass(obj, rb_cArray, arg);
w_byte(TYPE_ARRAY, arg);
{
- long len = RARRAY(obj)->len;
- VALUE *ptr = RARRAY(obj)->ptr;
+ long i, len = RARRAY_LEN(obj);
w_long(len, arg);
- while (len--) {
- w_object(*ptr, arg, limit);
- ptr++;
+ for (i=0; i<RARRAY_LEN(obj); i++) {
+ w_object(RARRAY_PTR(obj)[i], arg, limit);
+ if (len != RARRAY_LEN(obj)) {
+ rb_raise(rb_eRuntimeError, "array modified during dump");
+ }
}
}
break;