Skip to content

Commit f222315

Browse files
Fixed: Fix ArrayIndexOutOfBoundsException when setting zero width terminal character
java.lang.ArrayIndexOutOfBoundsException: length=64; index=-1 at com.termux.terminal.TerminalRow.setChar(TerminalRow.java:127) at com.termux.terminal.TerminalBuffer.setChar(TerminalBuffer.java:413) at com.termux.terminal.TerminalEmulator.emitCodePoint(TerminalEmulator.java:2329) at com.termux.terminal.TerminalEmulator.processCodePoint(TerminalEmulator.java:617) at com.termux.terminal.TerminalEmulator.processByte(TerminalEmulator.java:513) at com.termux.terminal.TerminalEmulator.append(TerminalEmulator.java:480) at com.termux.terminal.TerminalSession$MainThreadHandler.handleMessage(TerminalSession.java:339) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8349) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
1 parent e11bcfc commit f222315

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,8 +449,8 @@ public TerminalRow allocateFullLineIfNecessary(int row) {
449449
}
450450

451451
public void setChar(int column, int row, int codePoint, long style) {
452-
if (row >= mScreenRows || column >= mColumns)
453-
throw new IllegalArgumentException("row=" + row + ", column=" + column + ", mScreenRows=" + mScreenRows + ", mColumns=" + mColumns);
452+
if (row < 0 || row >= mScreenRows || column < 0 || column >= mColumns)
453+
throw new IllegalArgumentException("TerminalBuffer.setChar(): row=" + row + ", column=" + column + ", mScreenRows=" + mScreenRows + ", mColumns=" + mColumns);
454454
row = externalToInternalRow(row);
455455
allocateFullLineIfNecessary(row).setChar(column, codePoint, style);
456456
}

terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,14 @@ private void emitCodePoint(int codePoint) {
23322332
}
23332333

23342334
int offsetDueToCombiningChar = ((displayWidth <= 0 && mCursorCol > 0 && !mAboutToAutoWrap) ? 1 : 0);
2335-
mScreen.setChar(mCursorCol - offsetDueToCombiningChar, mCursorRow, codePoint, getStyle());
2335+
int column = mCursorCol - offsetDueToCombiningChar;
2336+
2337+
// Fix TerminalRow.setChar() ArrayIndexOutOfBoundsException index=-1 exception reported
2338+
// The offsetDueToCombiningChar would never be 1 if mCursorCol was 0 to get column/index=-1,
2339+
// so was mCursorCol changed after the offsetDueToCombiningChar conditional by another thread?
2340+
// TODO: Check if there are thread synchronization issues with mCursorCol and mCursorRow, possibly causing others bugs too.
2341+
if (column < 0) column = 0;
2342+
mScreen.setChar(column, mCursorRow, codePoint, getStyle());
23362343

23372344
if (autoWrap && displayWidth > 0)
23382345
mAboutToAutoWrap = (mCursorCol == mRightMargin - displayWidth);

terminal-emulator/src/main/java/com/termux/terminal/TerminalRow.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ public void clear(long style) {
124124

125125
// https://github.com/steven676/Android-Terminal-Emulator/commit/9a47042620bec87617f0b4f5d50568535668fe26
126126
public void setChar(int columnToSet, int codePoint, long style) {
127+
if (columnToSet < 0 || columnToSet >= mStyle.length)
128+
throw new IllegalArgumentException("TerminalRow.setChar(): columnToSet=" + columnToSet + ", codePoint=" + codePoint + ", style=" + style);
129+
127130
mStyle[columnToSet] = style;
128131

129132
final int newCodePointDisplayWidth = WcWidth.width(codePoint);

0 commit comments

Comments
 (0)