From 7a40846766f3e4dad7c7f72f285e43e06010b218 Mon Sep 17 00:00:00 2001 From: Agando Date: Fri, 23 Oct 2026 18:25:52 +0200 Subject: fix(newos4): an invalid grep pattern returns a message, not an exception (v4.6.64) Packet 8. `new RegExp(pattern)` sat unguarded in the terminal grep handler and in VFS find()/grep(), so a bad pattern threw out of the command handler into the error ledger -- the same ledger packet 2 had to stop trusting. - module-fs.js grep: compile in try/catch, print "grep: invalid pattern: ()" as a warning and return - virtual-fs.js find()/grep(): same guard, return [] and stash the message on _lastPatternError instead of throwing into the module error wrapper Verified live on v4.6.64 with the packet's own repro: `grep "/\bug_id\" file` prints the message, the error counter stays 0 (was: one ledger entry per call), a valid pattern still matches, and fs.grep('[') returns [] instead of throwing. --- modules/core/module-fs.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'modules/core/module-fs.js') diff --git a/modules/core/module-fs.js b/modules/core/module-fs.js index fd1dfc1..415bd92 100644 --- a/modules/core/module-fs.js +++ b/modules/core/module-fs.js @@ -238,7 +238,16 @@ class FileSystemModule { } const pattern = args[ai]; const target = args[ai + 1]; if (!pattern) return this.terminal.print('Usage: grep [-n] [-i] [-c] [-l] [filename]', 'warning'); - const re = new RegExp(pattern, opt.ignoreCase ? 'i' : ''); + // v4.6.64: an invalid pattern is user input, not a system fault. It used to throw + // out of the command handler into the error ledger, polluting the counter that + // packet §2 says nobody can trust (packet §8). + let re; + try { + re = new RegExp(pattern, opt.ignoreCase ? 'i' : ''); + } catch (e) { + this.terminal.print('grep: invalid pattern: ' + pattern + ' (' + e.message + ')', 'warning'); + return; + } const hits = (line) => (opt.invert ? !re.test(line) : re.test(line)); if (target) { const c = this.terminal.fs.readFile(target); -- cgit v1.2.3