* string.c: Specify termlen as far as possible.

Additional fix for [Bug #12536] [ruby-dev:49699].

* string.c (rb_usascii_str_new, rb_utf8_str_new): Specify termlen
  which is apparently 1 for the encodings.

* string.c (str_new0_cstr): New static function to create a String
  object from a C string with specifying termlen.

* string.c (rb_usascii_str_new_cstr, rb_utf8_str_new_cstr): Specify
  termlen by using new str_new0_cstr().

* string.c (str_new_static): Specify termlen from the given encoding
  when creating a new String object is needed.

* string.c (rb_tainted_str_new_with_enc): New function to create a
  tainted String object with the given encoding. This means that
  the termlen is correctly specified. Curretly static function.
  The function name might be renamed to rb_tainted_enc_str_new
  or rb_enc_tainted_str_new.

* string.c (rb_external_str_new_with_enc): Use encoding by using the
  above rb_tainted_str_new_with_enc().


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ngoto 2016-07-01 11:24:11 +00:00
parent 053c1e08e3
commit a92a537bf4
2 changed files with 49 additions and 6 deletions

View File

@ -1,3 +1,29 @@
Fri Jul 1 20:20:20 2016 Naohisa Goto <ngotogenome@gmail.com>
* string.c: Specify termlen as far as possible.
Additional fix for [Bug #12536] [ruby-dev:49699].
* string.c (rb_usascii_str_new, rb_utf8_str_new): Specify termlen
which is apparently 1 for the encodings.
* string.c (str_new0_cstr): New static function to create a String
object from a C string with specifying termlen.
* string.c (rb_usascii_str_new_cstr, rb_utf8_str_new_cstr): Specify
termlen by using new str_new0_cstr().
* string.c (str_new_static): Specify termlen from the given encoding
when creating a new String object is needed.
* string.c (rb_tainted_str_new_with_enc): New function to create a
tainted String object with the given encoding. This means that
the termlen is correctly specified. Curretly static function.
The function name might be renamed to rb_tainted_enc_str_new
or rb_enc_tainted_str_new.
* string.c (rb_external_str_new_with_enc): Use encoding by using the
above rb_tainted_str_new_with_enc().
Fri Jul 1 19:38:57 2016 Naohisa Goto <ngotogenome@gmail.com>
* test/fiddle/test_pointer.rb (test_to_str, test_to_s, test_aref_aset):

View File

@ -726,7 +726,7 @@ rb_str_new(const char *ptr, long len)
VALUE
rb_usascii_str_new(const char *ptr, long len)
{
VALUE str = rb_str_new(ptr, len);
VALUE str = str_new0(rb_cString, ptr, len, 1); /* termlen == 1 */
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
return str;
}
@ -734,7 +734,7 @@ rb_usascii_str_new(const char *ptr, long len)
VALUE
rb_utf8_str_new(const char *ptr, long len)
{
VALUE str = str_new(rb_cString, ptr, len);
VALUE str = str_new0(rb_cString, ptr, len, 1); /* termlen == 1 */
rb_enc_associate_index(str, rb_utf8_encindex());
return str;
}
@ -758,10 +758,17 @@ rb_str_new_cstr(const char *ptr)
return rb_str_new(ptr, strlen(ptr));
}
static VALUE
str_new0_cstr(const char *ptr, int termlen)
{
must_not_null(ptr);
return str_new0(rb_cString, ptr, strlen(ptr), termlen);
}
VALUE
rb_usascii_str_new_cstr(const char *ptr)
{
VALUE str = rb_str_new_cstr(ptr);
VALUE str = str_new0_cstr(ptr, 1); /* termlen == 1 */
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
return str;
}
@ -769,7 +776,7 @@ rb_usascii_str_new_cstr(const char *ptr)
VALUE
rb_utf8_str_new_cstr(const char *ptr)
{
VALUE str = rb_str_new_cstr(ptr);
VALUE str = str_new0_cstr(ptr, 1); /* termlen == 1 */
rb_enc_associate_index(str, rb_utf8_encindex());
return str;
}
@ -794,7 +801,8 @@ str_new_static(VALUE klass, const char *ptr, long len, int encindex)
}
if (!ptr) {
str = str_new(klass, ptr, len);
rb_encoding *enc = rb_enc_get_from_index(encindex);
str = str_new0(klass, ptr, len, rb_enc_mbminlen(enc));
}
else {
RUBY_DTRACE_CREATE_HOOK(STRING, len);
@ -842,6 +850,15 @@ rb_tainted_str_new(const char *ptr, long len)
return str;
}
static VALUE
rb_tainted_str_new_with_enc(const char *ptr, long len, rb_encoding *enc)
{
VALUE str = rb_enc_str_new(ptr, len, enc);
OBJ_TAINT(str);
return str;
}
VALUE
rb_tainted_str_new_cstr(const char *ptr)
{
@ -974,7 +991,7 @@ rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *eenc)
{
VALUE str;
str = rb_tainted_str_new(ptr, len);
str = rb_tainted_str_new_with_enc(ptr, len, eenc);
return rb_external_str_with_enc(str, eenc);
}