1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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/trunk@10558 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2006-07-18 07:02:35 +00:00
parent 9d6e1cdb73
commit df80a7b4bb
2 changed files with 19 additions and 5 deletions

View file

@ -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 15:19:07 2006 NAKAMURA Usaku <usa@ruby-lang.org>
* intern.h (st_foreach_safe): fix prototype.

13
pack.c
View file

@ -932,6 +932,7 @@ pack_pack(VALUE ary, VALUE fmt)
associates = rb_ary_new();
}
rb_ary_push(associates, from);
rb_obj_taint(from);
rb_str_buf_cat(res, (char*)&t, sizeof(char*));
}
break;
@ -1873,8 +1874,12 @@ pack_unpack(VALUE str, VALUE 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;
}
@ -1883,7 +1888,6 @@ pack_unpack(VALUE str, VALUE fmt)
if (p == pend) {
rb_raise(rb_eArgError, "non associated pointer");
}
tmp = rb_tainted_str_new(t, len);
}
else {
tmp = Qnil;
@ -1915,6 +1919,7 @@ pack_unpack(VALUE str, VALUE fmt)
pend = p + RARRAY(a)->len;
while (p < pend) {
if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) {
tmp = *p;
break;
}
p++;
@ -1922,8 +1927,6 @@ pack_unpack(VALUE str, VALUE fmt)
if (p == pend) {
rb_raise(rb_eArgError, "non associated pointer");
}
tmp = rb_str_new2(t);
OBJ_INFECT(tmp, str);
}
else {
tmp = Qnil;