fork bomb handling and gdb support
All checks were successful
Release / Build & publish (push) Successful in 7s

This commit is contained in:
2026-04-06 17:59:26 +03:00
parent c030d91911
commit 9b9a790618
4 changed files with 63 additions and 4 deletions

View File

@@ -2,8 +2,6 @@ name: judge
run-name: "Sum tests (${{ inputs.student_url || github.repository }})"
on:
push:
pull_request:
workflow_dispatch:
inputs:
student_url:
@@ -143,7 +141,7 @@ jobs:
# runner auto-detects .exe suffix on Windows
judge "$SUITE_FILE" . --json $WRAPPER_ARG > "$GITHUB_WORKSPACE/${REPORT_NAME}.json" || true
judge "$SUITE_FILE" . $WRAPPER_ARG || true
judge "$SUITE_FILE" . $WRAPPER_ARG
- name: Upload report
if: ${{ always() }}

18
runner/process_unix.go Normal file
View File

@@ -0,0 +1,18 @@
//go:build !windows
package runner
import (
"os/exec"
"syscall"
)
func setProcessGroup(cmd *exec.Cmd) {
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
}
func killProcessGroup(cmd *exec.Cmd) {
if cmd.Process != nil {
syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
}
}

20
runner/process_windows.go Normal file
View File

@@ -0,0 +1,20 @@
//go:build windows
package runner
import (
"os/exec"
"syscall"
)
func setProcessGroup(cmd *exec.Cmd) {
cmd.SysProcAttr = &syscall.SysProcAttr{
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
}
}
func killProcessGroup(cmd *exec.Cmd) {
if cmd.Process != nil {
cmd.Process.Kill()
}
}

View File

@@ -131,6 +131,7 @@ func (r *Runner) build() (string, error) {
cmd := shellCommand(ctx, buildCmd)
cmd.Dir = r.cfg.WorkDir
setProcessGroup(cmd)
cmd.Env = os.Environ()
var out bytes.Buffer
@@ -138,6 +139,7 @@ func (r *Runner) build() (string, error) {
cmd.Stderr = &out
if err := cmd.Run(); err != nil {
killProcessGroup(cmd)
return out.String(), fmt.Errorf("build failed: %w\n%s", err, out.String())
}
return out.String(), nil
@@ -249,8 +251,13 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult {
wrapper = t.Wrapper
}
cmd := buildExecCmd(ctx, wrapper, r.binary, t.Args)
args := t.Args
if wrapper != "" {
args = absoluteArgs(tmpDir, args)
}
cmd := buildExecCmd(ctx, wrapper, r.binary, args)
cmd.Dir = tmpDir
setProcessGroup(cmd)
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "LC_ALL=C", "LANG=C")
@@ -271,6 +278,10 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult {
runErr := cmd.Run()
tr.Elapsed = time.Since(start)
if ctx.Err() == context.DeadlineExceeded {
killProcessGroup(cmd)
}
tr.ActualStdout = normalizeOutput(stdout.String(), r.file)
tr.ActualStderr = normalizeOutput(stderr.String(), r.file)
@@ -327,6 +338,18 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult {
return tr
}
func absoluteArgs(dir string, args []string) []string {
out := make([]string, len(args))
for i, a := range args {
if !filepath.IsAbs(a) {
out[i] = filepath.Join(dir, a)
} else {
out[i] = a
}
}
return out
}
func buildExecCmd(ctx context.Context, wrapper, binary string, args []string) *exec.Cmd {
if wrapper == "" {
return exec.CommandContext(ctx, binary, args...)