From c41dc085d0fdb7cce8c6eb10c40fe9c8c68c8aa1 Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 30 Apr 2010 03:06:43 +0000 Subject: [PATCH] * file.c (file_expand_path): call rb_str_set_len before BUFCHECK to prevent rb_str_resize in BUFCHECK discard the content. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27560 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ file.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/ChangeLog b/ChangeLog index 57b6512b1a..d9a1fd8f11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Apr 30 12:05:20 2010 Tanaka Akira + + * file.c (file_expand_path): call rb_str_set_len before BUFCHECK to + prevent rb_str_resize in BUFCHECK discard the content. + Fri Apr 30 11:48:31 2010 Marc-Andre Lafortune * string.c (rb_str_sub_bang): String#sub! now raises an error when diff --git a/file.c b/file.c index 23fd05c892..9b6c56f0cf 100644 --- a/file.c +++ b/file.c @@ -2858,10 +2858,12 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result) if (p > buf && p[-1] == '/') --p; else { + rb_str_set_len(result, p-buf); BUFCHECK(bdiff + 1 >= buflen); *p = '/'; } + rb_str_set_len(result, p-buf+1); BUFCHECK(bdiff + 1 >= buflen); p[1] = 0; root = skipprefix(buf); @@ -2925,6 +2927,7 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result) #endif if (s > b) { long rootdiff = root - buf; + rb_str_set_len(result, p-buf+1); BUFCHECK(bdiff + (s-b+1) >= buflen); root = buf + rootdiff; memcpy(++p, b, s-b); @@ -2955,6 +2958,7 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result) } } #endif + rb_str_set_len(result, p-buf+1); BUFCHECK(bdiff + (s-b) >= buflen); memcpy(++p, b, s-b); p += s-b;