summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-11 14:59:43 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-11 14:59:43 +0000
commit00d2e368313627b183902090849d870ec9c11ee4 (patch)
tree790ccf8c9a03b8c6540be62751ad428cf117f1e4 /ext
parentfd89be255f73f2cf3de35c3af4771d8ccb19ae0d (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_4@57849 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 dbbfbb7463..6f45537e27 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -535,12 +535,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;