fix(agents): remap dot-prefixed context paths · openclaw/openclaw@af3d933
vincentkoc
·
2026-05-14
·
via Recent Commits to openclaw:main
File tree
src/agents/pi-embedded-runner/run
| Original file line number | Diff line number | Diff line change |
|---|
@@ -15,6 +15,7 @@ Docs: https://docs.openclaw.ai
|
15 | 15 | - iOS: restore first-use Contacts, Calendar, and Reminders permission prompts and add Privacy & Access status/actions in Settings. Thanks @BunsDev. |
16 | 16 | - Canvas: return not found for malformed percent-encoded Canvas/A2UI/document asset paths and keep decoded parent traversal blocked before path normalization. |
17 | 17 | - Telegram: allow trusted local Bot API media files whose filenames start with dots instead of falling back to remote download. |
| 18 | +- Agents: remap injected context files under dot-dot-prefixed workspace directories when a run switches to an effective sandbox workspace. |
18 | 19 | - Agents: allow dot-dot-prefixed filenames such as `..note.txt` through sandbox FS bridge, remote sandbox reads, and apply_patch summaries without mistaking the name for parent traversal. |
19 | 20 | - CLI/migrate: hide per-item source/plugin hints on non-conflicting Codex skill and plugin selection prompts, keeping the hint text reserved for rows that actually need attention. Thanks @sjf. |
20 | 21 | - Codex harness: treat high-confidence app-server OAuth refresh invalidation as a terminal auth-profile failure, stopping repeated raw token-refresh errors without turning entitlement or usage-limit payloads into re-auth prompts. |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -622,6 +622,10 @@ describe("remapInjectedContextFilesToWorkspace", () => {
|
622 | 622 | path: "/real/workspace/nested/TOOLS.md", |
623 | 623 | content: "tools", |
624 | 624 | }, |
| 625 | +{ |
| 626 | +path: "/real/workspace/..context/USER.md", |
| 627 | +content: "dot-prefixed context", |
| 628 | +}, |
625 | 629 | { |
626 | 630 | path: "/outside/README.md", |
627 | 631 | content: "outside", |
@@ -639,6 +643,10 @@ describe("remapInjectedContextFilesToWorkspace", () => {
|
639 | 643 | path: "/sandbox/workspace/nested/TOOLS.md", |
640 | 644 | content: "tools", |
641 | 645 | }, |
| 646 | +{ |
| 647 | +path: "/sandbox/workspace/..context/USER.md", |
| 648 | +content: "dot-prefixed context", |
| 649 | +}, |
642 | 650 | { |
643 | 651 | path: "/outside/README.md", |
644 | 652 | content: "outside", |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -537,6 +537,15 @@ export function isPrimaryBootstrapRun(sessionKey?: string): boolean {
|
537 | 537 | return !isSubagentSessionKey(sessionKey) && !isAcpSessionKey(sessionKey); |
538 | 538 | } |
539 | 539 | |
| 540 | +function isRelativePathInsideOrEqual(relativePath: string): boolean { |
| 541 | +return ( |
| 542 | +relativePath === "" || |
| 543 | +(relativePath !== ".." && |
| 544 | +!relativePath.startsWith(`..${path.sep}`) && |
| 545 | +!path.isAbsolute(relativePath)) |
| 546 | +); |
| 547 | +} |
| 548 | + |
540 | 549 | export function remapInjectedContextFilesToWorkspace(params: { |
541 | 550 | files: EmbeddedContextFile[]; |
542 | 551 | sourceWorkspaceDir: string; |
@@ -547,7 +556,7 @@ export function remapInjectedContextFilesToWorkspace(params: {
|
547 | 556 | } |
548 | 557 | return params.files.map((file) => { |
549 | 558 | const relative = path.relative(params.sourceWorkspaceDir, file.path); |
550 | | -const canRemap = relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative)); |
| 559 | +const canRemap = isRelativePathInsideOrEqual(relative); |
551 | 560 | return canRemap |
552 | 561 | ? { |
553 | 562 | ...file, |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。