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 +Thu Jul 11 20:18:08 2013 Nobuyoshi Nakada + + * 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))) {