Skip to content

Commit 7d471f9

Browse files
committed
fix: skip MkdirAll for current directory in WASI environment
- Add check to skip os.MkdirAll when parent dir is '.' or '/' - Fixes 'mkdir .: errno 2' error in WASI sandbox - WASI doesn't allow creating the current directory that's already mapped - Applied to CopyFile, WriteFile, AppendToFile, ConcatenateFiles, and MovePath - All tests passing
1 parent 0331886 commit 7d471f9

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

tinygo/operations.go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ func CopyFile(src, dest string) error {
3030
return fmt.Errorf("security validation failed: %w", err)
3131
}
3232

33-
// Ensure destination directory exists
33+
// Ensure destination directory exists (skip if it's current dir)
3434
destDir := filepath.Dir(dest)
35-
if err := os.MkdirAll(destDir, 0755); err != nil {
36-
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
35+
if destDir != "." && destDir != "/" {
36+
if err := os.MkdirAll(destDir, 0755); err != nil {
37+
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
38+
}
3739
}
3840

3941
// Open source file
@@ -224,10 +226,12 @@ func WriteFile(path, content string) error {
224226
return fmt.Errorf("security validation failed: %w", err)
225227
}
226228

227-
// Ensure parent directory exists
229+
// Ensure parent directory exists (skip if it's current dir)
228230
dir := filepath.Dir(path)
229-
if err := os.MkdirAll(dir, 0755); err != nil {
230-
return fmt.Errorf("failed to create parent directory %s: %w", dir, err)
231+
if dir != "." && dir != "/" {
232+
if err := os.MkdirAll(dir, 0755); err != nil {
233+
return fmt.Errorf("failed to create parent directory %s: %w", dir, err)
234+
}
231235
}
232236

233237
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
@@ -245,10 +249,12 @@ func AppendToFile(path, content string) error {
245249
return fmt.Errorf("security validation failed: %w", err)
246250
}
247251

248-
// Ensure parent directory exists
252+
// Ensure parent directory exists (skip if it's current dir)
249253
dir := filepath.Dir(path)
250-
if err := os.MkdirAll(dir, 0755); err != nil {
251-
return fmt.Errorf("failed to create parent directory %s: %w", dir, err)
254+
if dir != "." && dir != "/" {
255+
if err := os.MkdirAll(dir, 0755); err != nil {
256+
return fmt.Errorf("failed to create parent directory %s: %w", dir, err)
257+
}
252258
}
253259

254260
// Open file in append mode (create if doesn't exist)
@@ -277,10 +283,12 @@ func ConcatenateFiles(sources []string, dest string) error {
277283
return fmt.Errorf("no source files provided for concatenation")
278284
}
279285

280-
// Ensure destination directory exists
286+
// Ensure destination directory exists (skip if it's current dir)
281287
destDir := filepath.Dir(dest)
282-
if err := os.MkdirAll(destDir, 0755); err != nil {
283-
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
288+
if destDir != "." && destDir != "/" {
289+
if err := os.MkdirAll(destDir, 0755); err != nil {
290+
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
291+
}
284292
}
285293

286294
// Create destination file
@@ -321,10 +329,12 @@ func MovePath(src, dest string) error {
321329
return fmt.Errorf("security validation failed for destination: %w", err)
322330
}
323331

324-
// Ensure destination parent directory exists
332+
// Ensure destination parent directory exists (skip if it's current dir)
325333
destDir := filepath.Dir(dest)
326-
if err := os.MkdirAll(destDir, 0755); err != nil {
327-
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
334+
if destDir != "." && destDir != "/" {
335+
if err := os.MkdirAll(destDir, 0755); err != nil {
336+
return fmt.Errorf("failed to create destination directory %s: %w", destDir, err)
337+
}
328338
}
329339

330340
// Attempt rename (works if on same filesystem)

0 commit comments

Comments
 (0)