Releases: DMOJ/judge-server
DMOJ Judge v4.1.0
This minor release contains improvements to MLE reporting for a few runtimes, as well as a few bugfixes.
Runtimes
- Java
java.lang.OutOfMemoryError
as well as certain GC failures are now mapped toMLE
verdicts. - Guaranteed that Java, Python 2/3, PyPy 2/3, and C# submissions will report
MLE
rather thanRTE
orIR
when graded on problems with memory limits lower than baseline runtime overhead.
Bugfixes
- Fixed a bug where some problem directories specified with
problem_storage_globs
may not have been picked up. - Fixed the C++03 executor relying on the compiler's default standard (which is now C++17 for GCC).
Miscellaneous
dmoj-cli
now indents batched cases.
Full changelog
The full changelog is available here as well as below.
Changelog
- Fix bug where
get_supported_problems_and_mtimes
won't recursively scan by @kiritofeng in #1104 - Increase grace limits to allow important runtimes to be marked as MLE by @Xyene in #1097
- Declare types for
Result
andCheckerResult
by @kiritofeng in #1106 - Detect JVM initialization errors by @kiritofeng in #1107
- executors: add version checks to self-tests by @kiritofeng in #1109
- Indent batched cases when running tests by @kiritofeng in #1105
DMOJ Judge v4.0.1
This is a bugfix release, fixing the behavior of problem storage configured through the new problem_storage_globs
key.
Full changelog
The full changelog is available here as well as below.
Changelog
- Fix bug with globs by @kiritofeng in #1103
DMOJ Judge v4.0.0
This major release contains a number of features, sandboxing improvements, and support for the latest versions of many runtimes. Upgrading is strongly recommended.
Thanks to @Riolku, @kiritofeng, @int-y1 for contributing major changes in this release.
Breaking changes
- The minimum supported Linux kernel version is now 4.8. Pure
ptrace
-based sandboxing is no longer supported. - Support for running on Python 3.6 has been removed. Python 3.6 was EOL in December 2021.
- The
RUBY2
executor has been renamed toRUBY
. - All Java executors except for Java 8 have been merged into a single
JAVA
executor. - Support for CoffeeScript (
COFFEE
executor) has been removed. - Tests specified
pretest_test_cases
are now run unconditionally. See #1068 for more details. - The number of digits in submission output that interactors, etc. will be willing to handle has been dropped from 10000 to Python's new
sys.int_info.default_max_str_digits
limit. See python/cpython#95778 for more details. - The Rust edition has been upgraded from 2015 to 2021.
Deprecation notices
- Problem directories are now specified through a new
problem_storage_globs
key.problem_storage_root
is now deprecated, and will be removed in a future release. - This release adds support for batch dependencies, but their functionality will change substantially in a future release. See #1075 for more details.
Runtimes
- Added support for:
- Lean 4
- LLVM IR
- Java 17-19
- Go 1.16+
- Ruby 3
- OCaml 5.0
- @int-y1 has implemented an optimizing compiler for Brain**** using LLVM (#1091). This new compiler produces dramatically faster code than the previous implementation.
- Rust compilation has been greatly sped up by sharing build artifacts between compilations.
- Fixed Groovy compilation time being included as part of runtime.
- Tweaked sandbox to allow Go to make use of its transparent hugepage support.
- Carriage returns are now stripped for the text executor.
- The time limit for Kotlin compilation has been raised from 20 seconds to 30 seconds.
Sandbox
- Compilers are now sandboxed. Not sandboxed: renaming, various
f*
syscalls (e.g.fchmod
),exec
s. The current level of compiler sandboxing is intended to prevent e.g.#include
-ing arbitrary files that are readable by the judge user. - File access is now denied with
EACCES
rather thanEPERM
. - Java security policies are no longer used, as they were deprecated in Java 17.
- Fixed non-fatal signals occasionally being reported to the site (e.g., Haskell's ticker thread sending
SIGVTALRM
). - Added support for FreeBSD 13.
Miscellaneous
- The judge will now autodetect executors for given source files based on extension. This applies to
dmoj-cli submit
as well as generators, graders, etc. - Fixed judge handshake issues when ~9000 problems are reported at initialization.
- Fixed leaking cached executor compilation artifacts.
- Context switches (involuntary + voluntary) are now reported as part of testcase log output.
Full changelog
The full changelog is available here as well as below.
Changelog
- cptbox: remove ptrace-only tracing by @quantum5 in #900
- readme: document removal of pure ptrace sandbox by @quantum5 in #904
- cptbox: always set PR_SET_NO_NEW_PRIVS by @Xyene in #908
- cptbox: remove last vestiges of WSL 1 support by @Xyene in #907
- executors: disallow /dev/std{in,err,out} by @Xyene in #909
- Change EPERM into EACCES for file access by @Riolku in #911
- executors: add support for Java 17 by @Xyene in #914
- Drop security policies for JVM runtimes by @Xyene in #913
- cptbox: make on_return work with multiple threads by @quantum5 in #915
- executors: make go executor with with 1.16+ by @quantum5 in #916
- fix java executors VM config detection by @Riolku in #917
- testsuite: increase memory limit to avoid flaking on FreeBSD by @quantum5 in #922
- cptbox: make IsolateTracer._get*_pid work with multiprocess by @quantum5 in #924
- cptbox: remove #ifdef for PTRACE_O_EXITKILL by @quantum5 in #923
- cptbox: implement Debugger.readbytes by @quantum5 in #925
- Sandbox compilers by @Xyene in #906
- cptbox: implement proper sys_utimensat sandboxing by @quantum5 in #926
- Improve dmoj.utils.* by @quantum5 in #928
- executors: implement sys_fchmodat sandboxing for compilers by @quantum5 in #929
- ci: update upload-pypi workflow dependencies by @quantum5 in #921
- cptbox: make sys_utimensat emulation more accurate by @quantum5 in #927
- judge: fix str/bytes confusion in CompileError by @quantum5 in #930
- cptbox: ignore ESRCH from post_syscall handler by @quantum5 in #937
- cptbox: use ptrace(PT_IO) on FreeBSD by @quantum5 in #938
- cptbox: drop support for FreeBSD < 8 by @quantum5 in #935
- executors: remove FIXME about posix_fadvise and posix_fallocate by @quantum5 in #940
- commands: add mypy types by @quantum5 in #934
- cptbox: correctly handle sys_execve being allowed with seccomp by @quantum5 in #939
- utils: add types to parse_helper_file_error by @quantum5 in #932
- Implement fchmod, rename(at) sandboxing for compilers by @quantum5 in #933
- cptbox: use correct result registers for arm64 by @quantum5 in #943
- executors: improve /usr handling by @quantum5 in #944
- config: fix ConfigNode.get fallback logic by @quantum5 in #945
- ci: fix ARM64 docker test by @quantum5 in #946
- testsuite: reduce memory limit for C# MLE test by @quantum5 in #942
- executors: improve types by @quantum5 in #931
- ci: run tests on arm64 by @quantum5 in #948
- ci: allow less executors to fail by @quantum5 in #953
- executors: use shutil.which instead of deprecated distutils by @quantum5 in #949
- ci: remove useless functions from citest.py by @quantum5 in #950
- cptbox: clang-format by @quantum5 in #941
- ci: include _checker.c and setbufsize.c in clang-format by @quantum5 in #954
- ci: drop Travis by @Xyene in #955
- Add PR #941 to .git-blame-ignore-revs by @Xyene in #956
- cptbox: support
subprocess.STDOUT
by @Xyene in #961 - Update Linux syscall list by @dmoj-build in #963
- executors: fix returning
str
instead ofbytes
fromget_compile_output
by @Xyene in #960 - executors/PAS: drop -So argument by @Xyene in #959
- executors: add basic autodetection from filename by @Xyene in #968
- ci: use Python 3.10 when possible by @quantum5 in #970
- Use metaclass to auto-populate Executor.name by @quantum5 in #969
- cptbox: check faccessat2 instead of always denying by @quantum5 in #975
- cptbox: automatically generate FreeBSD syscalls by @quantum5 in #976
- Fix latest runtime failure with Racket by @quantum5 in #977
- cptbox: allow statx by default by @quantum5 in #978
- Work around pip bug by @int-y1 in #979
- Add executor for Lean 4 by @int-y1 in #982
- Update docker test by @int-y1 in #983
- cptbox: allow FreeBSD 13 syscalls by @quantum5 in #985
- ci: improve automatic syscall PR generation by @quantum5 in #987
- Use socket.sendall to send packets by @hieplpvip in #984
- Implement debug mode with debug logging level by @quantum5 in #989
- Remove Python 3.6 support by @quantum5 in https://github.com/DMOJ/j...
DMOJ Judge v3.0.2
This is a bugfix release, ahead of the DMOJ judge dropping support for Linux kernels older than 4.8. It is the last release to support ptrace-only sandboxing; future releases will require seccomp-enabled kernels.
The full changelog is available here.
Features
- Added a problem validation mode to
dmoj-cli
(#335) - Added a
linematches
checker for problems that reward points based on lines matched
Sandbox
- File accesses for existing files are now disallowed with
EPERM
rather thanENOENT
- File access policies made more strict, and are no longer regex-based (#873)
- Multi-process sandboxing now functional on WSL 2 systems
- Unconditional errno returns are now implemented in seccomp rather than ptrace
Runtimes
- Python: report only builtin exceptions in feedback field
- Rust: fix initialization error in cargo (1fb0750)
- Steel Bank Common Lisp: allow thread creation
- Zig: increase compile time limit
Miscellaneous
- Feedback for the
linecount
checker moved into extended feedback - Interactors are now unbuffered by default
- Miscellaneous other small tweaks and bugfixes
DMOJ Judge v3.0.1
This major release contains a number of features and stability improvements. Upgrading from 2.1.0 is strongly recommended, as the sandbox in 2.1.0 is ineffective for x86 processes running on x64 systems. (In practice, this means the NASM, GAS32, and Turing executors are unsafe.)
The full changelog is available here.
Note: release v3.0.0 was skipped due to a packaging error.
Features
- C++20 support
- Java 15 support
- Rewritten judge core: judge now spins off a temporary worker process per submission
- Fixes heap memory "leak" due to glibc arena fragmentation
- Bad custom checkers / interactors now timed out after 60 seconds
- Robust against worker failures
- Rewritten sandbox
- Much more robust ABI detection
- Numerous fixes in error paths
Sandbox
- Fix sandboxing issues with x86-on-x64 when running without seccomp
- Wrap JVM-based executors in cptbox, rather than relying only on security policies
- Patch
int(...)
to avoid DOS attacks in custom checkers - Allow all syscalls before first
execve
(fixes "failed to set up seccomp policy" errors when seccomp tries tomalloc
)
Runtimes
- Racket: allow
~/.local/share/racket
; #786 - Rust: allow
poll
; #785 - Rust: strip binaries to lower memory overhead
- Go: increase
data_grace
; #756 - Go: use subdirectory for cache; #770
- ASM: time out compilations
- Java: allow single-digit runtime version formatting
- Globally allow
clock_gettime64
- Globally allow
poll
; #785
Miscellaneous
- Numerous fixes and improvements to bridged checker and interactor support
- Set output length to 0 for siggraded problems
- Signature grade in submitted language, rather than always C++
- Disallow abort when nothing is running; #721
- Kill the judging submission on keyboard interrupt in CLI; #700
- Add persistent command history storage for CLI; #702
DMOJ Judge v2.1.0
This minor release contains a number of features and stability improvements. Upgrading from 2.0.0 is strongly recommended.
The full changelog is available here.
Features
- Full support for running the judge in Docker
- New
bridged
checker for interfacing with e.g.testlib
checkers - New
bridged
grader for interfacing with e.g.testlib
graders - Python:
SyntaxError
is now mapped to a compilation error, throughpy_compile
- New
--skip-self-test
flag to skip self-tests at startup - Support for the Zig programming language (0.6.0) has been added
- OCaml: compile with JSC Base/Core/Stdio and Zarith
- Chicken Scheme: add support for Chicken 5
Fixes
Sandbox
- Properly validate null file paths
- Reject open requests to overly long paths
- More robustly reject invalid Unicode with
ENOENT
and logging - Globally allow the
pread64
syscall - Globally allow
PR_SET_THP_DISABLE
prctl
- Wait for process to spawn before returning from
TracedPopen
constructor, fixing a possible race - Adjust OOM score for compilers to maximal badness; #599
- Adjust OOM score for submissions to maximal badness; #649
- Hold GIL when spawning submission process; #588
Runtimes
- ARM GAS: fix when running in ARM64 Docker
- Ruby 2: allow
eventfd2
syscall - Ruby 2: support autoconf for Ruby 2.8
- Java: don't display exception details
- V8 JavaScript: increase stack limit to 128mb
- Go: allow
package main
; #582 - Go: allow
mlock
syscall (needed as of go 1.14.1) - Mono: allow
clock_nanosleep
- Brain***: better bracket validation; #625
- COBOL: detect new capitalization formats for error/note/warning; #656
- Allow C11 to be signature graded
- Properly suffix extensions in CLI
Others
- Avoid slow filesystem scans on testcase location resolution (for network-mounted problem directories)
- Handle MLEs during linking more gracefully by notifying user
- Limit number of digits interactor accepts; #606
- Fix
TypeError
in site when judge sendsNone
case points; #659
Miscellaneous
- The
cptbox
sandbox is now built with-O3
and-march=native
- Syscall list has been updated for Linux 5.6
- Feedback is no longer processed on TLE/MLE/OLE
- Multi-judge support has been removed; #654
DMOJ Judge v2.0.0
This major release contains a number of stability improvements, and drops support for Windows and Python < 3.6. This release is meant to be used with the DMOJ Site v2.0.0 release.
The full changelog is available here.
Features
- Add batching of testcase updates, greatly reducing server load in some cases; #408
- Implement testcase format specifiers, removing the need to specify a
test_cases
block for problems using standard naming conventions; #262 - Enable colored compiler output in all languages that support it (not just GCC/Clang); #543
- Add support for Java 11; #526
- Inform Java users of missing
main(String[] args)
; #366 - Add autoconfig for Kotlin and Turing; #551, #559
- Add autoconfig support for Ruby 2.6
Fixes
- Exit JVM immediately upon denying a class load; fixes #455
- Fix SBCL on Debian 10; #552
- Use bootclasspath in Scala autoconfig; #550
- Switch to displaying
rustc
rather thancargo
version for Rust; fixes #534 - Fix compiler error limiting for Clang; fixes #487
- Fix interactors on binary streams; fixes #485
- Fix compiler TLE reporting broken in 069d183
Miscellaneous
- Give generators 30s to compile by default; #503
- Allow Rust submissions to be compiled in offline mode via a
DMOJ_CARGO_OFFLINE
environment variable; #561 - Disable optimization passes for Brainfuck programs, greatly increasing maximum instruction count before hitting a compiler timeout; #549
- Move ANSI to HTML conversion to site, preventing judges from executing HTML injection; #478
Under the hood
- mypy types have been added throughout the judge code
- Lots of code has been cleaned up as a result of removing Python 2 support
- All supported runtimes are now tested during CI, thanks to a new runtimes-docker Docker image
DMOJ Judge v1.3.0
This minor release includes a number of enhancements as well as some general bugfixes.
Features
- Add default location for reading judge configuration to
~/.dmojrc
, removing need to always pass-c
; #330 - Add protocol support for "Disconnect" and "Terminate" buttons in judge admin; DMOJ/online-judge#696
- Inform users of abnormal compiler terminations; #312
- Scale Brain**** cell count with memory limit; #338
- Add one-off CLI command support; #334
Fixes
- Java: correctly detect Unicode classnames
- Haskell: increase optimization
- Mono C#: prefer
mcs
overdmcs
during autoconfiguration; #333 - Allow
rstripped
checker'sfilter_new_line
parameter to be disabled; #343 - Fix Python 3 compatibility in CLI
- Add more helpful error message for invalid problem storage root
- Fix testsuite formatting on Python 3
- Fix CLI parameter splitting; #351
- Fix short-circuiting multiple batches; #341
- Fix cryptic crash when no
file
executable available; #309 - Add fallback for Android Python load average being unavailable
- Forward
LD_LIBRARY_PATH
if present (for Termux to function) - Fix compile output collecting for some languages; #326
DMOJ Judge v1.2.0
This minor release includes a number of enhancements as well as some general bugfixes.
Features
- Full arm32 and arm64 Linux support; #300
- Use
process_vm_readv
when possible - Improve Java autoconfig
- Support picking up new non-leaf directories when nesting problem directories
Fixes
- Fix startup warning typo
- Fix NaN handling in floating point checkers
- Fix *at system call handling
- Fix GCC/Clang -march flag handling; #303
- Fix line ending handling in checkers
- Fix interactive problem TLE getting full credit
- Disable Nim due to arbitrary code execution; #318
- Fix java_sandbox.jar not found
DMOJ Judge v1.1.0
This minor release includes a number of enhancements as well as some general bugfixes.
Features
- Allow
dmoj-autoconf
to be piped to a file without--silent
; #289 - Drop
pty
-based unbuffering in favour ofLD_PRELOAD
setvbuf
approach; #243 - Improve internal error message when
init.yml
is not found - Mark nonzero generator return code as internal error
- Implement generator sandboxing; #295
- Generators are sandboxed with 20s TL and 512mb ML by default; configurable
- Return
ENOENT
for all invalid file accesses instead of killing process, makes configuration of many runtimes easier; #293 - PHP and PHP7 executors have been merged into a single PHP executor; #117
- Implement
--verbose
flag fordmoj-autoconf
Fixes
- Fix
ptrace(2)
failure causing judge hang; #213 - Fix race in problem update manager; #283
- Fix
AttributeError
when exitingdmoj-cli
; #291 - Fix Unicode support for FreeBSD relative path handling
- Fix bug where generator was being run even if
out
parameter was specified - Fix
setup.py sdist
failure on Python 3