summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-01 11:24:11 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-01 11:24:11 +0000
commita92a537bf4ada05a763ad3e43c9ebef0038643d8 (patch)
tree1da42069ea8d52a878d45f7207700c93ee7e4fea /string.c
parent053c1e08e3cf3986d194ea809947f7916877f494 (diff)
* 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
Diffstat (limited to 'string.c')
-rw-r--r--string.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/string.c b/string.c
index 81f71afb4d..55d87bb9a9 100644
--- a/string.c
+++ b/string.c
@@ -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);
}