Ensure weed fuse master process exits after mounted (#6809)

* Ensure fuse master process wait for mounted

* Validate parent PID input in fuse command
This commit is contained in:
Weihao Jiang
2025-05-23 00:50:07 +08:00
committed by GitHub
parent 165af32d6b
commit 874b4a5535
3 changed files with 33 additions and 2 deletions

View File

@@ -2,9 +2,12 @@ package command
import (
"fmt"
"math"
"os"
"os/signal"
"strconv"
"strings"
"syscall"
"time"
)
@@ -105,6 +108,14 @@ func runFuse(cmd *Command, args []string) bool {
switch parameter.name {
case "child":
masterProcess = false
if parsed, err := strconv.ParseInt(parameter.value, 10, 64); err == nil {
if parsed > math.MaxInt || parsed <= 0 {
panic(fmt.Errorf("parent PID %s is invalid", err))
}
mountOptions.fuseCommandPid = int(parsed)
} else {
panic(fmt.Errorf("parent PID %s is invalid", err))
}
case "arg0":
mountOptions.dir = &parameter.value
case "filer":
@@ -211,7 +222,12 @@ func runFuse(cmd *Command, args []string) bool {
panic(err)
}
argv := append(os.Args, "-o", "child")
// pass our PID to the child process
pid := os.Getpid()
argv := append(os.Args, "-o", "child="+strconv.Itoa(pid))
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGUSR1)
attr := os.ProcAttr{}
attr.Env = os.Environ()
@@ -228,7 +244,10 @@ func runFuse(cmd *Command, args []string) bool {
panic(fmt.Errorf("master process can not release child process: %s", err))
}
return true
select {
case <-c:
return true
}
}
if fusermountPath != "" {