diff --git a/testlib.h b/testlib.h index 349b839f..76badaa2 100644 --- a/testlib.h +++ b/testlib.h @@ -25,7 +25,7 @@ * Copyright (c) 2005-2025 */ -#define VERSION "0.9.45" +#define VERSION "0.9.45-SNAPSHOT" /* * Mike Mirzayanov @@ -63,6 +63,7 @@ */ const char *latestFeatures[] = { + "Added maxBlankCount to InStream to avoid infinite loops in skipBlanks()", "Remove incorrect const attributes", "Added ConstantBoundsLog, VariablesLog to validator testOverviewLogFile", "Use setAppesModeEncoding to change xml encoding from windows-1251 to other", @@ -2026,6 +2027,7 @@ struct InStream { int readManyIteration; size_t maxFileSize; size_t maxTokenLength; + size_t maxBlankCount; size_t maxMessageLength; void init(std::string fileName, TMode mode); @@ -2844,6 +2846,7 @@ InStream::InStream() { readManyIteration = NO_INDEX; maxFileSize = 128 * 1024 * 1024; // 128MB. maxTokenLength = 32 * 1024 * 1024; // 32MB. + maxBlankCount = 32 * 1024 * 1024; // 32MB. maxMessageLength = 32000; } @@ -2858,6 +2861,7 @@ InStream::InStream(const InStream &baseStream, std::string content) { readManyIteration = NO_INDEX; maxFileSize = 128 * 1024 * 1024; // 128MB. maxTokenLength = 32 * 1024 * 1024; // 32MB. + maxBlankCount = 32 * 1024 * 1024; // 32MB. maxMessageLength = 32000; } @@ -3374,8 +3378,16 @@ void InStream::skipChar() { } void InStream::skipBlanks() { + size_t blankCount = 0; while (isBlanks(reader->curChar())) + { + blankCount++; + // You can change maxBlankCount. + // Example: 'inf.maxBlankCount = 32 * 1024 * 1024;'. + if (blankCount > maxBlankCount) + quitf(_pe, "Number of redundant consecutive white-space characters exceeds the limit (%d)", int(maxBlankCount)); reader->skipChar(); + } } std::string InStream::readWord() { diff --git a/tests/test-006_interactors/files/unix/input.maxBlankCount b/tests/test-006_interactors/files/unix/input.maxBlankCount new file mode 100644 index 00000000..3f01f12d --- /dev/null +++ b/tests/test-006_interactors/files/unix/input.maxBlankCount @@ -0,0 +1,4 @@ +3 +10 +20 +30 diff --git a/tests/test-006_interactors/files/unix/participant.maxBlankCount.fail b/tests/test-006_interactors/files/unix/participant.maxBlankCount.fail new file mode 100644 index 00000000..2a9be514 --- /dev/null +++ b/tests/test-006_interactors/files/unix/participant.maxBlankCount.fail @@ -0,0 +1,3 @@ + 20 + 40 + 60 diff --git a/tests/test-006_interactors/files/unix/participant.maxBlankCount.normal b/tests/test-006_interactors/files/unix/participant.maxBlankCount.normal new file mode 100644 index 00000000..8b3995aa --- /dev/null +++ b/tests/test-006_interactors/files/unix/participant.maxBlankCount.normal @@ -0,0 +1,3 @@ +20 +40 +60 diff --git a/tests/test-006_interactors/files/win/input.maxBlankCount b/tests/test-006_interactors/files/win/input.maxBlankCount new file mode 100644 index 00000000..3f01f12d --- /dev/null +++ b/tests/test-006_interactors/files/win/input.maxBlankCount @@ -0,0 +1,4 @@ +3 +10 +20 +30 diff --git a/tests/test-006_interactors/files/win/participant.maxBlankCount.fail b/tests/test-006_interactors/files/win/participant.maxBlankCount.fail new file mode 100644 index 00000000..b836a6df --- /dev/null +++ b/tests/test-006_interactors/files/win/participant.maxBlankCount.fail @@ -0,0 +1,3 @@ + 20 + 40 + 60 diff --git a/tests/test-006_interactors/files/win/participant.maxBlankCount.normal b/tests/test-006_interactors/files/win/participant.maxBlankCount.normal new file mode 100644 index 00000000..8b3995aa --- /dev/null +++ b/tests/test-006_interactors/files/win/participant.maxBlankCount.normal @@ -0,0 +1,3 @@ +20 +40 +60 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/exit_code b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/exit_code new file mode 100644 index 00000000..78c6baef --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/exit_code @@ -0,0 +1 @@ +2 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stderr b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stderr new file mode 100644 index 00000000..50b0223e --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stderr @@ -0,0 +1 @@ +wrong output format Number of redundant consecutive white-space characters exceeds the limit (1000) diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stdout b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stdout new file mode 100644 index 00000000..f599e28b --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-fail/stdout @@ -0,0 +1 @@ +10 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/exit_code b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/exit_code new file mode 100644 index 00000000..18748286 --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/exit_code @@ -0,0 +1 @@ +0 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/stderr b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/stdout b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/stdout new file mode 100644 index 00000000..8b3995aa --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal-output/stdout @@ -0,0 +1,3 @@ +20 +40 +60 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/exit_code b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/exit_code new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/exit_code @@ -0,0 +1 @@ +0 diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stderr b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stderr new file mode 100644 index 00000000..527a4422 --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stderr @@ -0,0 +1 @@ +ok 3 queries processed diff --git a/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stdout b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stdout new file mode 100644 index 00000000..300ed6fc --- /dev/null +++ b/tests/test-006_interactors/refs/r-interactor-maxBlankCount-normal/stdout @@ -0,0 +1,3 @@ +10 +20 +30 diff --git a/tests/test-006_interactors/run.sh b/tests/test-006_interactors/run.sh index 7d18216d..303b9144 100644 --- a/tests/test-006_interactors/run.sh +++ b/tests/test-006_interactors/run.sh @@ -18,3 +18,17 @@ java -jar files/crossrun/CrossRun.jar ./interactor-a-plus-b files/"$os"/input.01 tr -d '\r' < output.02 > output.02.nix bash ../scripts/test-ref r-interactor-a-plus-b-2-1 cat output.02.nix rm -f output.02 output.02.nix interactive-a-plus-b interactive-a-plus-b.exe interactor-a-plus-b interactor-a-plus-b.exe interactive_runner.out interactive_runner.err + +# Test maxBlankCount: interactor with normal participant (should pass) +bash ../scripts/compile src/interactor-maxBlankCount.cpp +bash ../scripts/test-ref r-interactor-maxBlankCount-normal "$VALGRIND" ./interactor-maxBlankCount files/"$os"/input.maxBlankCount output.maxBlankCount.normal < files/"$os"/participant.maxBlankCount.normal +tr -d '\r' < output.maxBlankCount.normal > output.maxBlankCount.normal.nix +bash ../scripts/test-ref r-interactor-maxBlankCount-normal-output cat output.maxBlankCount.normal.nix +rm -f output.maxBlankCount.normal output.maxBlankCount.normal.nix + +# Test maxBlankCount: interactor with bad participant (should fail) +bash ../scripts/test-ref r-interactor-maxBlankCount-fail "$VALGRIND" ./interactor-maxBlankCount files/"$os"/input.maxBlankCount output.maxBlankCount.fail < files/"$os"/participant.maxBlankCount.fail +rm -f output.maxBlankCount.fail + +# Cleanup maxBlankCount test files +rm -f interactor-maxBlankCount interactor-maxBlankCount.exe diff --git a/tests/test-006_interactors/src/interactor-maxBlankCount.cpp b/tests/test-006_interactors/src/interactor-maxBlankCount.cpp new file mode 100644 index 00000000..2a435645 --- /dev/null +++ b/tests/test-006_interactors/src/interactor-maxBlankCount.cpp @@ -0,0 +1,30 @@ +#include "testlib.h" +#include + +using namespace std; + +int main(int argc, char *argv[]) { + setName("Interactor maxBlankCount test"); + registerInteraction(argc, argv); + + // Set a low limit for testing (to verify it triggers) + ouf.maxBlankCount = 1000; // ouf is the stream from participant + + // Read the number of queries from input file + int n = inf.readInt(); + + for (int i = 0; i < n; i++) { + // Send query to participant + int query = inf.readInt(); + cout << query << endl; + + // Try to read response from participant + // If participant sent > 1000 spaces, this will cause _pe + int response = ouf.readInt(); + + // Write result + tout << response << endl; + } + + quitf(_ok, "%d queries processed", n); +}