Preserve permissions when checking lower

The code was wrongly assuming that only read access was
required from the lower overlay when checking for permissions.
This allowed non-writable files to be writable in the overlay.

Fixes #316

PiperOrigin-RevId: 255263686
This commit is contained in:
Fabricio Voznika
2019-06-26 14:24:44 -07:00
committed by gVisor bot
parent 857e5c47e9
commit 42e212f6b7
3 changed files with 14 additions and 7 deletions
-6
View File
@@ -537,12 +537,6 @@ func overlayCheck(ctx context.Context, o *overlayEntry, p PermMask) error {
if o.upper != nil {
err = o.upper.check(ctx, p)
} else {
if p.Write {
// Since writes will be redirected to the upper filesystem, the lower
// filesystem need not be writable, but must be readable for copy-up.
p.Write = false
p.Read = true
}
err = o.lower.check(ctx, p)
}
o.copyMu.RUnlock()
+13
View File
@@ -85,6 +85,19 @@ func addOverlay(ctx context.Context, conf *Config, lower *fs.Inode, name string,
if err != nil {
return nil, fmt.Errorf("creating tmpfs overlay: %v", err)
}
// Replicate permissions and owner from lower to upper mount point.
attr, err := lower.UnstableAttr(ctx)
if err != nil {
return nil, fmt.Errorf("reading attributes from lower mount point: %v", err)
}
if !upper.InodeOperations.SetPermissions(ctx, upper, attr.Perms) {
return nil, fmt.Errorf("error setting permission to upper mount point")
}
if err := upper.InodeOperations.SetOwner(ctx, upper, attr.Owner); err != nil {
return nil, fmt.Errorf("setting owner to upper mount point: %v", err)
}
return fs.NewOverlayRoot(ctx, upper, lower, upperFlags)
}
+1 -1
View File
@@ -240,7 +240,7 @@ syscall_test(
syscall_test(test = "//test/syscalls/linux:munmap_test")
syscall_test(
add_overlay = False, # TODO(gvisor.dev/issue/316): enable when fixed.
add_overlay = True,
test = "//test/syscalls/linux:open_create_test",
)