diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | string.c | 10 | ||||
-rw-r--r-- | transcode.c | 1 |
4 files changed, 15 insertions, 1 deletions
@@ -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); @@ -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))) { |