From: nobu@... Date: 2014-05-28T02:27:22+00:00 Subject: [ruby-dev:48255] [ruby-trunk - Bug #9868] bigdecimal#VpAlloc causes out-of-bounds read Issue #9868 has been updated by Nobuyoshi Nakada. Description updated `i--`ですかね。 その次の`ISSPACE()`までループの条件に入れてしまったほうがいい気がしますが。 ---------------------------------------- Bug #9868: bigdecimal#VpAlloc causes out-of-bounds read https://bugs.ruby-lang.org/issues/9868#change-46931 * Author: Yusuke Endoh * Status: Open * Priority: Normal * Assignee: Kenta Murata * Category: ext * Target version: current: 2.2.0 * ruby -v: ruby 2.2.0dev (2014-05-25 trunk 46107) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- 以下のようなパッチを当てて ~~~diff diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 44e13a4..400dda0 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -3911,6 +3911,7 @@ VpAlloc(size_t mx, const char *szVal) } /* Skip trailing spaces */ while (--i > 0) { + printf("dereference psz[%lu]\n", i); if (ISSPACE(psz[i])) psz[i] = 0; else break; } ~~~ 以下のようなコードを実行すると、 ~~~ $ ./ruby -I .ext/x86_64-linux/ -I . -I lib -r bigdecimal -e 'p BigDecimal.new("#")' dereference psz[1] dereference psz[8] dereference psz[2] dereference psz[18446744073709551615] # ~~~ 見るからにまずそうなデリファレンスが行われていることが観察されます。 Coverity Scan が見つけてくれました。 -- Yusuke Endoh -- https://bugs.ruby-lang.org/