fix(command): preserve fuse option after writers (#9972)

* fix(command): preserve fuse option after writers

Problem: FUSE mount option parsing skipped the option immediately following concurrentWriters, so values such as concurrentReaders could be silently ignored.

Root cause: runFuse incremented the options loop index inside the concurrentWriters case in addition to the loop increment.
Co-authored-by: Codex <noreply@openai.com>

* test: save and restore mountOptions pointers, not their values

The fields are reassigned to fresh heap variables during runFuse, so
dereferencing to back up/restore mutated throwaways instead of the
flag-bound originals and could nil-panic on unset fields.

---------

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
7y-9
2026-06-15 13:11:35 -07:00
committed by GitHub
co-authored by Codex Chris Lu
parent 3f7105df52
commit 3bf3d29058
2 changed files with 38 additions and 1 deletions
-1
View File
@@ -165,7 +165,6 @@ func runFuse(cmd *Command, args []string) bool {
panic(fmt.Errorf("dirIdleEvictSec: %s", err))
}
case "concurrentWriters":
i++
if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err == nil {
intValue := int(parsed)
mountOptions.concurrentWriters = &intValue
+38
View File
@@ -0,0 +1,38 @@
//go:build darwin || freebsd || linux
package command
import (
"fmt"
"strings"
"testing"
)
func TestRunFuseDoesNotSkipOptionAfterConcurrentWriters(t *testing.T) {
oldUmask := mountOptions.umaskString
oldWriters := mountOptions.concurrentWriters
oldReaders := mountOptions.concurrentReaders
oldFuseCommandPid := mountOptions.fuseCommandPid
oldDir := mountOptions.dir
defer func() {
mountOptions.umaskString = oldUmask
mountOptions.concurrentWriters = oldWriters
mountOptions.concurrentReaders = oldReaders
mountOptions.fuseCommandPid = oldFuseCommandPid
mountOptions.dir = oldDir
recovered := recover()
if recovered == nil {
t.Fatal("expected invalid concurrentReaders option to be parsed")
}
if !strings.Contains(fmt.Sprint(recovered), "concurrentReaders") {
t.Fatalf("expected concurrentReaders parse error, got %v", recovered)
}
}()
runFuse(cmdMount, []string{
"/mnt",
"-o",
"child=1,concurrentWriters=2,concurrentReaders=bad,umask=bad",
})
}