aboutsummaryrefslogtreecommitdiff
path: root/modules/core/module-fs.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-10-23 18:25:52 +0200
committerAgando <roduccomm@gmail.com>2026-10-23 18:25:52 +0200
commit7a40846766f3e4dad7c7f72f285e43e06010b218 (patch)
treee3b9c78adee9846e32b1d7866848c774c3ad7c69 /modules/core/module-fs.js
parent5d9fb104317f800dff9f01920c3a34fdd4fd9911 (diff)
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: <pattern> (<engine message>)" 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.
Diffstat (limited to 'modules/core/module-fs.js')
-rw-r--r--modules/core/module-fs.js11
1 files changed, 10 insertions, 1 deletions
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] <pattern> [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);