Skip to content

Commit f6ab6d5

Browse files
committed
overlay: chown()ing the upper dir: ignore EINVAL on overflow IDs
When chown()ing the upper directory to match the lower directory, if the ownership of the lower directory is the overflow UID:GID, ignore EINVAL. Signed-off-by: Nalin Dahyabhai <[email protected]>
1 parent fd5ce16 commit f6ab6d5

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

pkg/overlay/overlay_linux.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package overlay
22

33
import (
4+
"errors"
45
"fmt"
56
"os"
67
"path/filepath"
8+
"strconv"
79
"strings"
810
"syscall"
911

@@ -61,7 +63,22 @@ func MountWithOptions(contentDir, source, dest string, opts *Options) (mount spe
6163
}
6264
if stat, ok := st.Sys().(*syscall.Stat_t); ok {
6365
if err := os.Chown(upperDir, int(stat.Uid), int(stat.Gid)); err != nil {
64-
return mount, err
66+
if !errors.Is(err, syscall.EINVAL) {
67+
return mount, err
68+
}
69+
overflowed := false
70+
overflowUIDText, uerr := os.ReadFile("/proc/sys/kernel/overflowuid")
71+
overflowGIDText, gerr := os.ReadFile("/proc/sys/kernel/overflowgid")
72+
if uerr == nil && gerr == nil {
73+
overflowUID, uerr := strconv.Atoi(strings.TrimSpace(string(overflowUIDText)))
74+
overflowGID, gerr := strconv.Atoi(strings.TrimSpace(string(overflowGIDText)))
75+
if uerr == nil && gerr == nil && int(stat.Uid) == overflowUID && int(stat.Gid) == overflowGID {
76+
overflowed = true
77+
}
78+
}
79+
if !overflowed {
80+
return mount, err
81+
}
6582
}
6683
times := []syscall.Timeval{
6784
syscall.NsecToTimeval(syscall.TimespecToNsec(stat.Atim)),

0 commit comments

Comments
 (0)