Mercurial > 510Connectbot
changeset 250:2bf2724d8610
add range checking on get/set fields
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Mon, 14 Jul 2014 12:21:43 -0700 |
parents | dc6e53600ae2 |
children | 587570134645 |
files | src/com/five_ten_sg/connectbot/service/TerminalMonitor.java |
diffstat | 1 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/com/five_ten_sg/connectbot/service/TerminalMonitor.java Mon Jul 14 11:51:59 2014 -0700 +++ b/src/com/five_ten_sg/connectbot/service/TerminalMonitor.java Mon Jul 14 12:21:43 2014 -0700 @@ -417,10 +417,17 @@ public synchronized void setField(int l, int c, char[] data, int offset) { Log.i(TAG, "setField()"); - char[] da = new char[data.length - offset]; - System.arraycopy(data, offset, da, 0, data.length-offset); - if (l > 60000) l = -1; - if (c > 60000) c = -1; + int len = data.length - offset; + char[] da = new char[len]; + System.arraycopy(data, offset, da, 0, len); + if ((l > 60000) || (c > 60000)) { + l = -1; + c = -1; + } + else { + // ignore setfield outside screen boundaries + if ((l >= buffer.height) || (c+len >= buffer.width)) return; + } buffer.setField(l, c, da); } @@ -439,7 +446,12 @@ arg2[2] = (char)(l & 0x0000ffff); arg2[3] = (char)(c & 0x0000ffff); int base = 4; - System.arraycopy(buffer.charArray[buffer.screenBase + l], c, arg2, base, len); + if ((l >= buffer.height) || (c+len >= buffer.width)) { + Arrays.fill(arg2, base, len-1, ' '); + } + else { + System.arraycopy(buffer.charArray[buffer.screenBase + l], c, arg2, base, len); + } monitorWrite(MONITOR_CMD_FIELDVALUE, arg2); }