diff --git a/__tests__/audit/detectors.test.ts b/__tests__/audit/detectors.test.ts index 0df1aef5..600e5016 100644 --- a/__tests__/audit/detectors.test.ts +++ b/__tests__/audit/detectors.test.ts @@ -108,6 +108,9 @@ describe("sleep-polling-loop", () => { sleepPollingLoop.detect(bash("while true; do echo x; sleep 5; done"), {}), ).not.toBeNull(); }); + it("matches `sleep 30s`", () => { + expect(sleepPollingLoop.detect(bash("sleep 30s"), {})).not.toBeNull(); + }); it("does not match `sleep 1`", () => { expect(sleepPollingLoop.detect(bash("sleep 1"), {})).toBeNull(); }); diff --git a/src/audit/detectors/sleep-polling-loop.ts b/src/audit/detectors/sleep-polling-loop.ts index c701f0f8..248dadd2 100644 --- a/src/audit/detectors/sleep-polling-loop.ts +++ b/src/audit/detectors/sleep-polling-loop.ts @@ -20,7 +20,7 @@ export const sleepPollingLoop: Detector = { return { example: cmd.replace(/\s+/g, " ").trim().slice(0, 160) }; } // Standalone long sleep. parseFloat so `sleep 0.5m` (= 30s) isn't dropped. - const match = /\bsleep\s+(\d+(?:\.\d+)?)(m|h|d)?\b/.exec(cmd); + const match = /\bsleep\s+(\d+(?:\.\d+)?)(s|m|h|d)?\b/.exec(cmd); if (match) { const n = parseFloat(match[1]); const unit = match[2] ?? "s";