summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-27 14:35:49 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-27 14:35:49 +0000
commite0cb040a9b034cff481d7660dc59ce060777d6b1 (patch)
treef7a2f496b515c820d6ecd3d6c3212cc670a6fbb0 /ext
parent62a02670ecbad7e931c6c5b6d1bcec423ac7b81d (diff)
merge revision(s) 57280,57282: [Backport #13112]
console.c: OOB access * ext/io/console/console.c (console_set_winsize): fix out-of-bounds access. [ruby-core:79004] [Bug #13112] console.c: unpaired size * ext/io/console/console.c (console_set_winsize): reject unpaired pixel size. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@58151 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/io/console/console.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index fd3f03b6b4..a408fd0870 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -525,12 +525,18 @@ console_set_winsize(VALUE io, VALUE size)
VALUE row, col, xpixel, ypixel;
const VALUE *sz;
int fd;
+ long sizelen;
GetOpenFile(io, fptr);
size = rb_Array(size);
- rb_check_arity(RARRAY_LENINT(size), 2, 4);
+ if ((sizelen = RARRAY_LEN(size)) != 2 && sizelen != 4) {
+ rb_raise(rb_eArgError,
+ "wrong number of arguments (given %ld, expected 2 or 4)",
+ sizelen);
+ }
sz = RARRAY_CONST_PTR(size);
- row = sz[0], col = sz[1], xpixel = sz[2], ypixel = sz[3];
+ row = sz[0], col = sz[1], xpixel = ypixel = Qnil;
+ if (sizelen == 4) xpixel = sz[2], ypixel = sz[3];
fd = GetWriteFD(fptr);
#if defined TIOCSWINSZ
ws.ws_row = ws.ws_col = ws.ws_xpixel = ws.ws_ypixel = 0;