From 7aa9c5e17c7249d14483a5bb697eeb10e45e0df6 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 24 Oct 2023 05:57:06 +0200 Subject: [PATCH] Fix possible OOM caused by huge repetitions of inserts (fixes #863) (#878) Introduce a max-repeat-count integer option --- reader/src/main/java/org/jline/reader/LineReader.java | 5 +++++ .../src/main/java/org/jline/reader/impl/LineReaderImpl.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/reader/src/main/java/org/jline/reader/LineReader.java b/reader/src/main/java/org/jline/reader/LineReader.java index e95c04bca..5eeb53d91 100644 --- a/reader/src/main/java/org/jline/reader/LineReader.java +++ b/reader/src/main/java/org/jline/reader/LineReader.java @@ -396,6 +396,11 @@ public interface LineReader { */ String SUGGESTIONS_MIN_BUFFER_SIZE = "suggestions-min-buffer-size"; + /** + * Max number of times a command can be repeated. + */ + String MAX_REPEAT_COUNT = "max-repeat-count"; + Map> defaultKeyMaps(); enum Option { diff --git a/reader/src/main/java/org/jline/reader/impl/LineReaderImpl.java b/reader/src/main/java/org/jline/reader/impl/LineReaderImpl.java index 6f1781ce0..5e0b6c206 100644 --- a/reader/src/main/java/org/jline/reader/impl/LineReaderImpl.java +++ b/reader/src/main/java/org/jline/reader/impl/LineReaderImpl.java @@ -108,6 +108,7 @@ public class LineReaderImpl implements LineReader, Flushable { public static final String FOCUS_IN_SEQ = "\033[I"; public static final String FOCUS_OUT_SEQ = "\033[O"; + public static final int DEFAULT_MAX_REPEAT_COUNT = 9999; /** * Possible states in which the current readline operation may be in. @@ -2392,6 +2393,10 @@ protected boolean negArgument() { protected boolean digitArgument() { String s = getLastBinding(); repeatCount = (repeatCount * 10) + s.charAt(s.length() - 1) - '0'; + int maxRepeatCount = getInt(MAX_REPEAT_COUNT, DEFAULT_MAX_REPEAT_COUNT); + if (repeatCount > maxRepeatCount) { + throw new IllegalArgumentException("digit argument should be less than " + maxRepeatCount); + } isArgDigit = true; return true; }