[#8815] Segfault in libc strlen, via rb_str_new2 — "Sean E. Russell" <ser@...>

Howdy,

12 messages 2006/09/09
[#8817] Re: Segfault in libc strlen, via rb_str_new2 — Eric Hodel <drbrain@...7.net> 2006/09/09

On Sep 8, 2006, at 10:10 PM, Sean E. Russell wrote:

Problem with latest array.c changes

From: "Kent Sibilev" <ksruby@...>
Date: 2006-09-25 15:24:36 UTC
List: ruby-core #8922
This change

Mon Sep 25 21:24:54 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

    * array.c (rb_ary_shift): should clear shifting top element.
      [ruby-talk:216055]

    * array.c (rb_ary_shift): avoid creating shared object if array
      size is small.

leads to

irb(main):027:0> a = [:a] * 3
=> [:a, :a, :a]
irb(main):028:0> a
=> [:a, :a, :a]
irb(main):029:0> a.dup.shift
=> :a
irb(main):030:0> a
=> [:a, :a, true]


This patch seems to fix it

Index: array.c
===================================================================
RCS file: /src/ruby/array.c,v
retrieving revision 1.137.2.34
diff -u -r1.137.2.34 array.c
--- array.c    24 Sep 2006 23:16:53 -0000    1.137.2.34
+++ array.c    25 Sep 2006 15:23:20 -0000
@@ -501,7 +501,7 @@
     rb_ary_modify_check(ary);
     if (RARRAY(ary)->len == 0) return Qnil;
     top = RARRAY(ary)->ptr[0];
-    if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
+    if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE && !FL_TEST(ary, ELTS_SHARED)) {
     MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary));
     }
     else {


-- 
Kent
---
http://www.datanoise.com

In This Thread

Prev Next