[#14696] Inconsistency in rescuability of "return" — Charles Oliver Nutter <charles.nutter@...>

Why can you not rescue return, break, etc when they are within

21 messages 2008/01/02
[#14699] Re: Inconsistency in rescuability of "return" — Gary Wright <gwtmp01@...> 2008/01/02

[#14738] Enumerable#zip Needs Love — James Gray <james@...>

The community has been building a Ruby 1.9 compatibility tip list on

15 messages 2008/01/03
[#14755] Re: Enumerable#zip Needs Love — Martin Duerst <duerst@...> 2008/01/04

Hello James,

[#14772] Manual Memory Management — Pramukta Kumar <prak@...>

I was thinking it would be nice to be able to free large objects at

36 messages 2008/01/04
[#14788] Re: Manual Memory Management — Marcin Raczkowski <mailing.mr@...> 2008/01/05

I would only like to add that RMgick for example provides free method to

[#14824] Re: Manual Memory Management — MenTaLguY <mental@...> 2008/01/07

On Sat, 5 Jan 2008 15:49:30 +0900, Marcin Raczkowski <mailing.mr@gmail.com> wrote:

[#14825] Re: Manual Memory Management — "Evan Weaver" <evan@...> 2008/01/07

Python supports 'del reference', which decrements the reference

[#14838] Re: Manual Memory Management — Marcin Raczkowski <mailing.mr@...> 2008/01/08

Evan Weaver wrote:

[#14911] Draft of some pages about encoding in Ruby 1.9 — Dave Thomas <dave@...>

Folks:

24 messages 2008/01/10

[#14976] nil encoding as synonym for binary encoding — David Flanagan <david@...>

The following just appeared in the ChangeLog

37 messages 2008/01/11
[#14977] Re: nil encoding as synonym for binary encoding — Yukihiro Matsumoto <matz@...> 2008/01/11

Hi,

[#14978] Re: nil encoding as synonym for binary encoding — Dave Thomas <dave@...> 2008/01/11

[#14979] Re: nil encoding as synonym for binary encoding — David Flanagan <david@...> 2008/01/11

Dave Thomas wrote:

[#14993] Re: nil encoding as synonym for binary encoding — Dave Thomas <dave@...> 2008/01/11

[#14980] Re: nil encoding as synonym for binary encoding — Gary Wright <gwtmp01@...> 2008/01/11

[#14981] Re: nil encoding as synonym for binary encoding — Yukihiro Matsumoto <matz@...> 2008/01/11

Hi,

[#14995] Re: nil encoding as synonym for binary encoding — David Flanagan <david@...> 2008/01/11

Yukihiro Matsumoto writes:

[#15050] how to "borrow" the RDoc::RubyParser and HTMLGenerator — Phlip <phlip2005@...>

Core Rubies:

17 messages 2008/01/13
[#15060] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Eric Hodel <drbrain@...7.net> 2008/01/14

On Jan 13, 2008, at 08:54 AM, Phlip wrote:

[#15062] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Phlip <phlip2005@...> 2008/01/14

Eric Hodel wrote:

[#15073] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Eric Hodel <drbrain@...7.net> 2008/01/14

On Jan 13, 2008, at 20:35 PM, Phlip wrote:

[#15185] Friendlier methods to compare two Time objects — "Jim Cropcho" <jim.cropcho@...>

Hello,

10 messages 2008/01/22

[#15194] Can large scale projects be successful implemented around a dynamic programming language? — Jordi <mumismo@...>

A good article I have found (may have been linked by slashdot, don't know)

8 messages 2008/01/24

[#15248] Symbol#empty? ? — "David A. Black" <dblack@...>

Hi --

24 messages 2008/01/28
[#15250] Re: Symbol#empty? ? — Yukihiro Matsumoto <matz@...> 2008/01/28

Hi,

String.clone may segfault since rev 14817

From: Sam Ruby <rubys@...>
Date: 2008-01-05 04:46:59 UTC
List: ruby-core #14785
Symptoms:

./home/rubys/ruby19/lib/ruby/1.9.0/rexml/text.rb:77:
[BUG] Segmentation fault
ruby 1.9.0 (2007-12-31 revision 0) [i686-linux]

-- control frame ----------
c:0035 p:---- s:0134 b:0134 l:000133 d:000133 CFUNC  :initialize_copy
c:0034 p:---- s:0132 b:0132 l:000131 d:000131 CFUNC  :clone

Steps to reproduce:

   svn checkout http://html5lib.googlecode.com/svn/trunk/ruby html5lib
   cd html5lib/
   ruby test/test_parser.rb

The relevant section of REXML code:

     def initialize(arg, ... )
       ...
       if arg.kind_of? String
         @string = arg.clone
       ...

Analysis:

Changing line 77 to "@string=arg[0..-1]" makes the segfault go away. 
Additionally, this test passed prior to the following checkin:

http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=14817&r2=14816&pathrev=14817

At the point of failure, the value of *ptr as set on line 949 is NULL. 
Apparently, under some rare set of circumstances, a request is made to 
resize a string which is neither embedded nor is yet to be allocated on 
the heap.  If I understood enough about what those circumstances might 
be, I could probably produce a smaller test case, but my initial 
attempts to model the failing code have failed to produce a segfault.

But I do note that ruby_xrealloc contains the following line:

   if (!ptr) return ruby_xmalloc(size);

This leads me to conclude that this scenario is actually intentional, 
leading me to the following possible fix, which I have verified resolves 
my problem.

Index: string.c
===================================================================
--- string.c    (revision 14817)
+++ string.c    (working copy)
@@ -945,18 +945,22 @@
             RSTRING(str)->as.heap.ptr = ptr;
             STR_SET_NOEMBED(str);
         }
-       else if (len <= RSTRING_EMBED_LEN_MAX) {
-           char *ptr = RSTRING(str)->as.heap.ptr;
-           STR_SET_EMBED(str);
-           MEMCPY(RSTRING(str)->as.ary, ptr, char, len);
-           RSTRING(str)->as.ary[len] = '\0';
-           STR_SET_EMBED_LEN(str, len);
-           xfree(ptr);
-           return str;
+       else {
+            if (len <= RSTRING_EMBED_LEN_MAX) {
+               char *ptr = RSTRING(str)->as.heap.ptr;
+                // if (ptr) {
+                   STR_SET_EMBED(str);
+                   MEMCPY(RSTRING(str)->as.ary, ptr, char, len);
+                   RSTRING(str)->as.ary[len] = '\0';
+                   STR_SET_EMBED_LEN(str, len);
+                   xfree(ptr);
+                   return str;
+                // }
+           }
+           if (slen < len || slen - len > 1024) {
+               REALLOC_N(RSTRING(str)->as.heap.ptr, char, len+1);
+           }
         }
-       else if (slen < len || slen - len > 1024) {
-           REALLOC_N(RSTRING(str)->as.heap.ptr, char, len+1);
-       }
         if (!STR_NOCAPA_P(str)) {
             RSTRING(str)->as.heap.aux.capa = len;
         }

In This Thread

Prev Next