Skip to content

os.File.Chmod fails with "No such file or directory" #34

@btwiuse

Description

@btwiuse

(*os.File).Chmod fails on the js/wasm target with "No such file or directory" even though the file was just created by os.CreateTemp and the handle is still open. The path-based os.Chmod counterpart fails identically.

Reproduction:

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    f, err := os.CreateTemp("", "chmod-demo-*")
    if err != nil {
        log.Fatal(err)
    }
    tmpName := f.Name()
    defer os.Remove(tmpName)
    defer f.Close()

    fmt.Println("=== os.File.Chmod (changes via open *os.File) ===")

    before, _ := f.Stat()
    fmt.Printf("before: %#o\n", before.Mode().Perm())

    if err := f.Chmod(os.ModePerm); err != nil {
        log.Fatal(err)
    }

    after, _ := f.Stat()
    fmt.Printf("after (0777): %#o\n", after.Mode().Perm())

    fmt.Println("\n=== os.Chmod (changes via path) ===")

    before2, _ := os.Stat(tmpName)
    fmt.Printf("before: %#o\n", before2.Mode().Perm())

    if err := os.Chmod(tmpName, 0644); err != nil {
        log.Fatal(err)
    }

    after2, _ := os.Stat(tmpName)
    fmt.Printf("after (0644): %#o\n", after2.Mode().Perm())
}

Actual output (go1.20.3 js/wasm, Hackpad playground):

$ ./playground
2026/05/22 21:58:41 chmod /tmp/chmod-demo-1043981024: No such file or directory
=== os.File.Chmod (changes via open *os.File) ===
before: 0600
exit status 1

Expected output (any non-wasm target):

$ ./playground
=== os.File.Chmod (changes via open *os.File) ===
before: 0600
after (0777): 0777

=== os.Chmod (changes via path) ===
before: 0777
after (0644): 0644

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions