diff --git a/packages/hydrojudge/src/judge/default.ts b/packages/hydrojudge/src/judge/default.ts index 59a521587..bc1ab5565 100644 --- a/packages/hydrojudge/src/judge/default.ts +++ b/packages/hydrojudge/src/judge/default.ts @@ -26,7 +26,7 @@ function judgeCase(c: NormalizedCase) { }, ); const { - code, time, memory, fileIds, + code, signalled, time, memory, fileIds, } = res; let { status } = res; let message: any = ''; @@ -50,7 +50,7 @@ function judgeCase(c: NormalizedCase) { })); } } else if (status === STATUS.STATUS_RUNTIME_ERROR && code) { - if (code < 32) message = signals[code]; + if (code < 32 && signalled) message = signals[code]; else message = { message: 'Your program returned {0}.', params: [code] }; } await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id))); diff --git a/packages/hydrojudge/src/judge/hack.ts b/packages/hydrojudge/src/judge/hack.ts index 614e37fd3..d01417647 100644 --- a/packages/hydrojudge/src/judge/hack.ts +++ b/packages/hydrojudge/src/judge/hack.ts @@ -51,7 +51,9 @@ export async function judge(ctx: Context) { cacheStdoutAndStderr: true, }, ); - const { code, time, memory } = res; + const { + code, signalled, time, memory, + } = res; let { status } = res; let message: any = ''; if (status === STATUS.STATUS_ACCEPTED) { @@ -73,7 +75,7 @@ export async function judge(ctx: Context) { })); } } else if (status === STATUS.STATUS_RUNTIME_ERROR && code) { - if (code < 32) message = signals[code]; + if (code < 32 && signalled) message = signals[code]; else message = { message: 'Your program returned {0}.', params: [code] }; } await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id))); diff --git a/packages/hydrojudge/src/judge/interactive.ts b/packages/hydrojudge/src/judge/interactive.ts index 9a15751ef..bd9962c7c 100644 --- a/packages/hydrojudge/src/judge/interactive.ts +++ b/packages/hydrojudge/src/judge/interactive.ts @@ -13,7 +13,9 @@ function judgeCase(c: NormalizedCase) { return async (ctx: Context, ctxSubtask: ContextSubTask) => { ctx.executeInteractor.copyIn.in = c.input ? { src: c.input } : { content: '' }; ctx.executeInteractor.copyIn.out = c.output ? { src: c.output } : { content: '' }; - const [{ code, time, memory }, resInteractor] = await runPiped( + const [{ + code, signalled, time, memory, + }, resInteractor] = await runPiped( { execute: ctx.executeUser.execute, copyIn: ctx.executeUser.copyIn, @@ -39,7 +41,7 @@ function judgeCase(c: NormalizedCase) { status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED; } else if ((code && code !== 13/* Broken Pipe */) || (code === 13 && !resInteractor.code)) { status = STATUS.STATUS_RUNTIME_ERROR; - if (code < 32) message = signals[code]; + if (code < 32 && signalled) message = signals[code]; else message = { message: 'Your program returned {0}.', params: [code] }; } else { const result = parse(resInteractor.stderr, c.score); diff --git a/packages/hydrojudge/src/judge/run.ts b/packages/hydrojudge/src/judge/run.ts index 0ca2277b0..52c893159 100644 --- a/packages/hydrojudge/src/judge/run.ts +++ b/packages/hydrojudge/src/judge/run.ts @@ -57,7 +57,9 @@ export const judge = async (ctx: Context) => { }, 1, ); - const { code, time, memory } = res; + const { + code, signalled, time, memory, + } = res; let { status } = res; const message: string[] = []; if (time > parseTimeMS(ctx.config.time || '1s')) { @@ -66,7 +68,7 @@ export const judge = async (ctx: Context) => { status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED; } else if (code) { status = STATUS.STATUS_RUNTIME_ERROR; - if (code < 32) message.push(`ExitCode: ${code} (${signals[code]})`); + if (code < 32 && signalled) message.push(`ExitCode: ${code} (${signals[code]})`); else message.push(`ExitCode: ${code}`); } message.push(res.stdout, res.stderr); diff --git a/packages/hydrojudge/src/sandbox.ts b/packages/hydrojudge/src/sandbox.ts index 5b22d7a6c..57b9ab6ce 100644 --- a/packages/hydrojudge/src/sandbox.ts +++ b/packages/hydrojudge/src/sandbox.ts @@ -45,6 +45,7 @@ interface Parameter { interface SandboxAdaptedResult { status: number; code: number; + signalled: boolean; /** in miliseconds */ time: number; /** in kilobytes */ @@ -114,6 +115,7 @@ async function adaptResult(result: SandboxResult, params: Parameter): Promise