ruby-changes:36946
From: nobu <ko1@a...>
Date: Fri, 26 Dec 2014 15:13:20 +0900 (JST)
Subject: [ruby-changes:36946] nobu:r49027 (trunk): parser.rl: check before use
nobu 2014-12-26 15:13:15 +0900 (Fri, 26 Dec 2014) New Revision: 49027 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49027 Log: parser.rl: check before use * ext/json/parser/parser.rl (unescape_unicode): check if valid before bit-or assignments. reported by Denis Denisov <denji0k AT gmail.com>. Modified files: trunk/ChangeLog trunk/ext/json/parser/parser.c trunk/ext/json/parser/parser.rl Index: ChangeLog =================================================================== --- ChangeLog (revision 49026) +++ ChangeLog (revision 49027) @@ -1,4 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 -Fri Dec 26 15:09:27 2014 Nobuyoshi Nakada <nobu@r...> +Fri Dec 26 15:13:13 2014 Nobuyoshi Nakada <nobu@r...> + + * ext/json/parser/parser.rl (unescape_unicode): check if valid + before bit-or assignments. + reported by Denis Denisov <denji0k AT gmail.com>. * ext/nkf/nkf-utf8/nkf.c (nkf_iconv_t): fix a missing semicolon. reported by Denis Denisov <denji0k AT gmail.com>. Index: ext/json/parser/parser.rl =================================================================== --- ext/json/parser/parser.rl (revision 49026) +++ ext/json/parser/parser.rl (revision 49027) @@ -26,16 +26,16 @@ static UTF32 unescape_unicode(const unsi https://github.com/ruby/ruby/blob/trunk/ext/json/parser/parser.rl#L26 UTF32 result = 0; b = digit_values[p[0]]; if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | b; + result = (result << 4) | (unsigned char)b; b = digit_values[p[1]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; b = digit_values[p[2]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; b = digit_values[p[3]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; return result; } @@ -883,7 +883,7 @@ static VALUE cParser_quirks_mode_p(VALUE https://github.com/ruby/ruby/blob/trunk/ext/json/parser/parser.rl#L883 } -void Init_parser() +void Init_parser(void) { rb_require("json/common"); mJSON = rb_define_module("JSON"); Index: ext/json/parser/parser.c =================================================================== --- ext/json/parser/parser.c (revision 49026) +++ ext/json/parser/parser.c (revision 49027) @@ -28,16 +28,16 @@ static UTF32 unescape_unicode(const unsi https://github.com/ruby/ruby/blob/trunk/ext/json/parser/parser.c#L28 UTF32 result = 0; b = digit_values[p[0]]; if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | b; + result = (result << 4) | (unsigned char)b; b = digit_values[p[1]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; b = digit_values[p[2]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; b = digit_values[p[3]]; - result = (result << 4) | b; if (b < 0) return UNI_REPLACEMENT_CHAR; + result = (result << 4) | (unsigned char)b; return result; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/