aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--internal.h1
-rw-r--r--string.c10
-rw-r--r--transcode.c1
4 files changed, 15 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 226e72e7ae..4632cf1bde 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,6 @@
-Thu Jul 11 20:18:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Jul 11 20:18:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (str_encode_associate): fill terminator after conversion.
* string.c (rb_enc_str_new, rb_str_set_len, rb_str_resize): fill
minimum length of the encoding as the terminator.
diff --git a/internal.h b/internal.h
index 22600da9e6..bac60fd767 100644
--- a/internal.h
+++ b/internal.h
@@ -441,6 +441,7 @@ VALUE rb_str_quote_unprintable(VALUE);
VALUE rb_id_quote_unprintable(ID);
#define QUOTE(str) rb_str_quote_unprintable(str)
#define QUOTE_ID(id) rb_id_quote_unprintable(id)
+void rb_str_fill_terminator(VALUE str);
/* struct.c */
VALUE rb_struct_init_copy(VALUE copy, VALUE s);
diff --git a/string.c b/string.c
index f452c9568e..786f491c3a 100644
--- a/string.c
+++ b/string.c
@@ -1539,6 +1539,16 @@ rb_string_value_cstr(volatile VALUE *ptr)
return s;
}
+void
+rb_str_fill_terminator(VALUE str)
+{
+ char *s = RSTRING_PTR(str);
+ long len = RSTRING_LEN(str);
+ rb_encoding *enc = rb_enc_get(str);
+ const int minlen = rb_enc_mbminlen(enc);
+ str_fill_term(str, s, len, minlen, enc);
+}
+
VALUE
rb_check_string_type(VALUE str)
{
diff --git a/transcode.c b/transcode.c
index 54fc316e41..88908c3cf2 100644
--- a/transcode.c
+++ b/transcode.c
@@ -2760,6 +2760,7 @@ str_encode_associate(VALUE str, int encidx)
int cr = 0;
rb_enc_associate_index(str, encidx);
+ rb_str_fill_terminator(str);
/* transcoded string never be broken. */
if (rb_enc_asciicompat(rb_enc_from_index(encidx))) {