@@ -17,9 +17,13 @@ import (
1717)
1818
1919func NewNodeServer (n * SeaweedFsDriver ) * NodeServer {
20- if n .CacheDir != "" && n .CacheDir != os .TempDir () {
21- if err := removeDirContent (n .CacheDir ); err != nil {
22- glog .Warning ("error cleaning up cache dir" )
20+ if n .CacheDir != "" {
21+ cleanCacheDir := filepath .Clean (n .CacheDir )
22+ cleanTempDir := filepath .Clean (os .TempDir ())
23+ if cleanCacheDir != cleanTempDir {
24+ if err := removeDirContent (cleanCacheDir ); err != nil {
25+ glog .Warningf ("error cleaning up cache dir %s: %v" , cleanCacheDir , err )
26+ }
2327 }
2428 }
2529
@@ -42,8 +46,21 @@ func GetLocalSocket(volumeSocketDir, volumeID string) string {
4246
4347func CleanupVolumeResources (driver * SeaweedFsDriver , volumeID string ) {
4448 cacheDir := GetCacheDir (driver .CacheDir , volumeID )
45- if err := os .RemoveAll (cacheDir ); err != nil {
46- glog .Warningf ("failed to remove cache dir %s for volume %s: %v" , cacheDir , volumeID , err )
49+
50+ // Validate that cacheDir is within cacheBase to prevent path traversal
51+ cacheBase := driver .CacheDir
52+ if cacheBase == "" {
53+ cacheBase = os .TempDir ()
54+ }
55+ cleanCacheBase := filepath .Clean (cacheBase )
56+ cleanCacheDir := filepath .Clean (cacheDir )
57+ rel , err := filepath .Rel (cleanCacheBase , cleanCacheDir )
58+ if err == nil && rel != "." && ! strings .HasPrefix (rel , ".." ) {
59+ if err := os .RemoveAll (cleanCacheDir ); err != nil {
60+ glog .Warningf ("failed to remove cache dir %s for volume %s: %v" , cleanCacheDir , volumeID , err )
61+ }
62+ } else {
63+ glog .Warningf ("skipping cache dir removal for volume %s: invalid path %s (rel: %s, err: %v)" , volumeID , cleanCacheDir , rel , err )
4764 }
4865
4966 localSocket := GetLocalSocket (driver .volumeSocketDir , volumeID )
0 commit comments