diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-07-18 07:02:35 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-07-18 07:02:35 +0000 |
commit | a15fda82670fe0e1741288b0bf75679a7e56fb4c (patch) | |
tree | b91052f172dce8b6d59bf82da17130c571d1baf8 | |
parent | 226bf50f8e8e806fd74f775f7d555a61ce153881 (diff) |
* pack.c (pack_unpack): propagate association array to copied
string. [ruby-core:08223]
* pack.c (pack_unpack): return referenced string itself if it has
same length as specified. a patch from <nobu at ruby-lang.org>
in [ruby-core:08225].
* pack.c (pack_pack): taint 'p' packed strings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10558 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | pack.c | 13 |
2 files changed, 19 insertions, 5 deletions
@@ -1,3 +1,14 @@ +Tue Jul 18 15:49:42 2006 Yukihiro Matsumoto <matz@ruby-lang.org> + + * pack.c (pack_unpack): propagate association array to copied + string. [ruby-core:08223] + + * pack.c (pack_unpack): return referenced string itself if it has + same length as specified. a patch from <nobu at ruby-lang.org> + in [ruby-core:08225]. + + * pack.c (pack_pack): taint 'p' packed strings. + Tue Jul 18 14:38:40 2006 Yukihiro Matsumoto <matz@ruby-lang.org> * process.c (rb_f_system): call rb_sys_fail(0) if rb_last_status @@ -938,6 +938,7 @@ pack_pack(ary, fmt) associates = rb_ary_new(); } rb_ary_push(associates, from); + rb_obj_taint(from); rb_str_buf_cat(res, (char*)&t, sizeof(char*)); } break; @@ -1890,8 +1891,12 @@ pack_unpack(str, fmt) pend = p + RARRAY(a)->len; while (p < pend) { if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) { - if (len > RSTRING(*p)->len) { - len = RSTRING(*p)->len; + if (len < RSTRING(*p)->len) { + tmp = rb_tainted_str_new(t, len); + rb_str_associate(tmp, a); + } + else { + tmp = *p; } break; } @@ -1900,7 +1905,6 @@ pack_unpack(str, fmt) if (p == pend) { rb_raise(rb_eArgError, "non associated pointer"); } - tmp = rb_tainted_str_new(t, len); } else { tmp = Qnil; @@ -1932,6 +1936,7 @@ pack_unpack(str, fmt) pend = p + RARRAY(a)->len; while (p < pend) { if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) { + tmp = *p; break; } p++; @@ -1939,8 +1944,6 @@ pack_unpack(str, fmt) if (p == pend) { rb_raise(rb_eArgError, "non associated pointer"); } - tmp = rb_str_new2(t); - OBJ_INFECT(tmp, str); } else { tmp = Qnil; |