@@ -141,9 +141,7 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
141141 m .registerWithParent (item )
142142 m .mu .Unlock ()
143143
144- m .Chmod (name , perm | os .ModeDir )
145-
146- return nil
144+ return m .setFileMode (name , perm | os .ModeDir )
147145}
148146
149147func (m * MemMapFs ) MkdirAll (path string , perm os.FileMode ) error {
@@ -240,7 +238,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro
240238 }
241239 }
242240 if chmod {
243- m . Chmod (name , perm )
241+ return file , m . setFileMode (name , perm )
244242 }
245243 return file , nil
246244}
@@ -321,6 +319,22 @@ func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
321319}
322320
323321func (m * MemMapFs ) Chmod (name string , mode os.FileMode ) error {
322+ const chmodBits = os .ModePerm | os .ModeSetuid | os .ModeSetgid | os .ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod()
323+ mode &= chmodBits
324+
325+ m .mu .RLock ()
326+ f , ok := m .getData ()[name ]
327+ m .mu .RUnlock ()
328+ if ! ok {
329+ return & os.PathError {Op : "chmod" , Path : name , Err : ErrFileNotFound }
330+ }
331+ prevOtherBits := mem .GetFileInfo (f ).Mode () & ^ chmodBits
332+
333+ mode = prevOtherBits | mode
334+ return m .setFileMode (name , mode )
335+ }
336+
337+ func (m * MemMapFs ) setFileMode (name string , mode os.FileMode ) error {
324338 name = normalizePath (name )
325339
326340 m .mu .RLock ()
0 commit comments