Bug #9868

bigdecimal#VpAlloc causes out-of-bounds read

Added by Yusuke Endoh 11 months ago. Updated 11 months ago.

[ruby-dev:48253]
Status:Open
Priority:Normal
Assignee:Kenta Murata
ruby -v:ruby 2.2.0dev (2014-05-25 trunk 46107) [x86_64-linux] Backport:2.0.0: UNKNOWN, 2.1: UNKNOWN

Description

以下のようなパッチを当てて

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]
#<BigDecimal:7f06266cb820,'0.0',9(9)>

見るからにまずそうなデリファレンスが行われていることが観察されます。
Coverity Scan が見つけてくれました。

Yusuke Endoh mame@ruby-lang.org

History

#1 Updated by Nobuyoshi Nakada 11 months ago

  • Description updated (diff)

i--ですかね。
その次のISSPACE()までループの条件に入れてしまったほうがいい気がしますが。

Also available in: Atom PDF