diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-12-27 23:17:02 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-12-27 23:17:02 +0900 |
| commit | c9cd16fd2a0a8bbc81f6664c627189daf8f78439 (patch) | |
| tree | 3a183f837ba3cf402c3ff967e4239b7d45926029 /cmd | |
| parent | e42ea32dbe9283d14a7c0e8746059bc5ef97f6cd (diff) | |
cmd/sharefs: prepare directory early
This change also checks against filesystem daemon running as root early.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/sharefs/fuse.go | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/cmd/sharefs/fuse.go b/cmd/sharefs/fuse.go index 9a0a0149..d35ff8b9 100644 --- a/cmd/sharefs/fuse.go +++ b/cmd/sharefs/fuse.go @@ -338,12 +338,31 @@ func _main(s ...string) (exitCode int) { if !parseOpts(&args, &setup, msg.GetLogger()) { return 1 } + asRoot := os.Geteuid() == 0 - if os.Geteuid() == 0 { + if asRoot { if setup.Setuid <= 0 || setup.Setgid <= 0 { log.Println("setuid and setgid must not be 0") return 1 } + + if setup.Fuse >= 3 { + log.Println("filesystem daemon must not run as root") + return 1 + } + + if setup.mkdir { + if err := os.MkdirAll(setup.Source.String(), 0700); err != nil { + if !errors.Is(err, os.ErrExist) { + log.Println(err) + return 1 + } + // skip setup for existing source directory + } else if err = os.Chown(setup.Source.String(), setup.Setuid, setup.Setgid); err != nil { + log.Println(err) + return 1 + } + } } else if setup.Fuse < 3 && (setup.Setuid > 0 || setup.Setgid > 0) { log.Println("setuid and setgid has no effect when not starting as root") return 1 @@ -393,25 +412,7 @@ func _main(s ...string) (exitCode int) { } }() - if os.Geteuid() == 0 { - if setup.Setuid <= 0 || setup.Setgid <= 0 { - log.Println("setuid and setgid must not be 0") - return 5 - } - - if setup.mkdir { - if err := os.MkdirAll(setup.Source.String(), 0700); err != nil { - if !errors.Is(err, os.ErrExist) { - log.Println(err) - return 5 - } - // skip setup for existing source directory - } else if err = os.Chown(setup.Source.String(), setup.Setuid, setup.Setgid); err != nil { - log.Println(err) - return 5 - } - } - + if asRoot { if err := syscall.Setresgid(setup.Setgid, setup.Setgid, setup.Setgid); err != nil { log.Printf("cannot set gid: %v", err) return 5 |
