From a320f811cfe126d978c9def412daf3c18108b5f3 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 4 Feb 2016 05:10:36 +0000 Subject: mask upper nibble * ext/cgi/escape/escape.c (optimized_escape): move c and use it instead of cstr[i]. mask upper nibble for the platforms where CHAR_BIT > 8. [Fix GH-1238] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53733 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/cgi/escape/escape.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'ext/cgi/escape') diff --git a/ext/cgi/escape/escape.c b/ext/cgi/escape/escape.c index 629418370e..cfa8026717 100644 --- a/ext/cgi/escape/escape.c +++ b/ext/cgi/escape/escape.c @@ -106,8 +106,9 @@ optimized_escape(VALUE str) len = RSTRING_LEN(str); cstr = RSTRING_PTR(str); - for (i = 0; i < len; i++) { - if (!url_unreserved_char(cstr[i])) { + for (i = 0; i < len; ++i) { + const unsigned char c = (unsigned char)cstr[i]; + if (!url_unreserved_char(c)) { if (!dest) { dest = rb_str_buf_new(len); } @@ -115,12 +116,11 @@ optimized_escape(VALUE str) rb_str_cat(dest, cstr + beg, i - beg); beg = i + 1; - if (cstr[i] == ' ') { + if (c == ' ') { rb_str_cat_cstr(dest, "+"); } else { - unsigned char c = (unsigned char)cstr[i]; - buf[1] = upper_hexdigits[c >> 4]; + buf[1] = upper_hexdigits[(c >> 4) & 0xf]; buf[2] = upper_hexdigits[c & 0xf]; rb_str_cat(dest, buf, 3); } -- cgit v1.2.3