From a351839e8fed92a303f1d5a35c6bfbb62b52ceb4 Mon Sep 17 00:00:00 2001 From: usa Date: Wed, 24 Sep 2008 14:01:41 +0000 Subject: * string.c (rb_str_rstrip_bang): raise exception when the encoding of the string is dummy. * string.c (rb_str_rstrip_bang): remove nul characters even if the encoding of the string is not single byte optimizable. fixed [ruby-core:18844], reported by Michael Selig. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@19529 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index a47485680..990694f24 100644 --- a/string.c +++ b/string.c @@ -5856,19 +5856,23 @@ rb_str_rstrip_bang(VALUE str) char *s, *t, *e; enc = STR_ENC_GET(str); + if (rb_enc_dummy_p(enc)) { + rb_raise(rb_eEncCompatError, "incompatible encoding with this operation: %s", rb_enc_name(enc)); + } s = RSTRING_PTR(str); if (!s || RSTRING_LEN(str) == 0) return Qnil; t = e = RSTRING_END(str); + /* remove trailing spaces or '\0's */ if (single_byte_optimizable(str)) { - /* remove trailing spaces or '\0's */ while (s < t && (*(t-1) == '\0' || rb_enc_isspace(*(t-1), enc))) t--; } else { char *tp; while ((tp = rb_enc_prev_char(s, t, e, enc)) != NULL) { - if (!rb_enc_isspace(rb_enc_codepoint(tp, e, enc), enc)) break; + unsigned int c = rb_enc_codepoint(tp, e, enc); + if (c && !rb_enc_isspace(c, enc)) break; t = tp; } } -- cgit