Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions images/basic/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
FROM ubuntu:24.04

ARG DOCKER_VERSION="5:28.5.2-1~ubuntu.24.04~noble"
FROM ubuntu:latest

ENV DEBIAN_FRONTEND="noninteractive"
RUN apt-get update && apt-get -y install ca-certificates curl
Expand All @@ -11,8 +9,8 @@ RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list && \
apt-get update && \
apt-get install -qqy \
docker-ce=${DOCKER_VERSION} \
docker-ce-cli=${DOCKER_VERSION} \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin \
Expand Down
1 change: 1 addition & 0 deletions pkg/sentry/fsimpl/tmpfs/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ go_test(
"//pkg/context",
"//pkg/errors/linuxerr",
"//pkg/fspath",
"//pkg/hostarch",
"//pkg/sentry/contexttest",
"//pkg/sentry/fsimpl/lock",
"//pkg/sentry/kernel/auth",
Expand Down
201 changes: 110 additions & 91 deletions pkg/sentry/fsimpl/tmpfs/tmpfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,109 +256,128 @@ func (fstype FilesystemType) GetFilesystem(ctx context.Context, vfsObj *vfs.Virt
rootMode = 01777
}

mopts := vfs.GenericParseMountOptions(opts.Data)
var printedOpts []string

maxSizeInPages := getDefaultSizeLimit(disableDefaultSizeLimit) / hostarch.PageSize
maxSizeStr, ok := mopts["size"]
if ok {
delete(mopts, "size")
maxSizeInBytes, _, err := parseSize(maxSizeStr)
if err != nil {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: parseSize() failed: %v", err)
return nil, nil, linuxerr.EINVAL
}
maxInodes := getDefaultInodeLimit(disableDefaultSizeLimit)
rootKUID := creds.EffectiveKUID
rootKGID := creds.EffectiveKGID

var printedSize uint64
if maxSizeInBytes > 0 {
// If size > 0, convert size in bytes to nearest Page Size
// bytes as Linux allocates memory in terms of Page size.
maxSizeInPages, ok = hostarch.ToPagesRoundUp(maxSizeInBytes)
if !ok {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: Pages RoundUp Overflow error: %v", ok)
printedOptsMap := make(map[string]string)

for _, opt := range vfs.GenericParseMountOptionsOrdered(opts.Data) {
key := opt.Key
value := opt.Value

switch key {
case "size":
maxSizeInBytes, _, err := parseSize(value)
if err != nil {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: parseSize() failed for size: %v", err)
return nil, nil, linuxerr.EINVAL
}
printedSize = (maxSizeInPages*hostarch.PageSize + 1023) / 1024
} else {
// size = 0 is a special case: no size limit
maxSizeInPages = math.MaxInt64
printedSize = 0
}
var printedSize uint64
if maxSizeInBytes > 0 {
var ok bool
maxSizeInPages, ok = hostarch.ToPagesRoundUp(maxSizeInBytes)
if !ok {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: Pages RoundUp Overflow error")
return nil, nil, linuxerr.EINVAL
}
printedSize = (maxSizeInPages*hostarch.PageSize + 1023) / 1024
} else {
maxSizeInPages = math.MaxInt64
printedSize = 0
}
printedOptsMap["size"] = fmt.Sprintf("size=%vk", printedSize)

printedOpts = append(printedOpts, fmt.Sprintf("size=%vk", printedSize))
}
maxInodes := getDefaultInodeLimit(disableDefaultSizeLimit)
maxInodesStr, ok := mopts["nr_inodes"]
if ok {
delete(mopts, "nr_inodes")
var err error
var percentageSpecified bool
maxInodes, percentageSpecified, err = parseSize(maxInodesStr)
if percentageSpecified {
// Percentage not allowed for specifying inode limit
return nil, nil, linuxerr.EINVAL
}
if err != nil {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: parseSize() failed: %v", err)
return nil, nil, linuxerr.EINVAL
}
case "nr_blocks":
maxBlocks, percentageSpecified, err := parseSize(value)
if percentageSpecified {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: percentage not allowed for nr_blocks")
return nil, nil, linuxerr.EINVAL
}
if err != nil {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: parseSize() failed for nr_blocks: %v", err)
return nil, nil, linuxerr.EINVAL
}
maxSizeInPages = maxBlocks
printedSize := (maxSizeInPages*hostarch.PageSize + 1023) / 1024
printedOptsMap["size"] = fmt.Sprintf("size=%vk", printedSize)

case "nr_inodes":
var err error
var percentageSpecified bool
maxInodes, percentageSpecified, err = parseSize(value)
if percentageSpecified {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: percentage not allowed for nr_inodes")
return nil, nil, linuxerr.EINVAL
}
if err != nil {
ctx.Debugf("tmpfs.FilesystemType.GetFilesystem: parseSize() failed for nr_inodes: %v", err)
return nil, nil, linuxerr.EINVAL
}
printedOptsMap["nr_inodes"] = fmt.Sprintf("nr_inodes=%v", maxInodes)

printedOpts = append(printedOpts, fmt.Sprintf("nr_inodes=%v", maxInodes))
}
modeStr, ok := mopts["mode"]
if ok {
delete(mopts, "mode")
mode, err := strconv.ParseUint(modeStr, 8, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid mode: %q", modeStr)
return nil, nil, linuxerr.EINVAL
}
rootMode = linux.FileMode(mode & 07777)
case "mode":
mode, err := strconv.ParseUint(value, 8, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid mode: %q", value)
return nil, nil, linuxerr.EINVAL
}
rootMode = linux.FileMode(mode & 07777)
printedOptsMap["mode"] = fmt.Sprintf("mode=%s", value)

printedOpts = append(printedOpts, fmt.Sprintf("mode=%s", modeStr))
}
rootKUID := creds.EffectiveKUID
uidStr, ok := mopts["uid"]
if ok {
delete(mopts, "uid")
uid, err := strconv.ParseUint(uidStr, 10, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid uid: %q", uidStr)
return nil, nil, linuxerr.EINVAL
}
kuid := creds.UserNamespace.MapToKUID(auth.UID(uid))
if !kuid.Ok() {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unmapped uid: %d", uid)
return nil, nil, linuxerr.EINVAL
}
rootKUID = kuid
case "uid":
uid, err := strconv.ParseUint(value, 10, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid uid: %q", value)
return nil, nil, linuxerr.EINVAL
}
kuid := creds.UserNamespace.MapToKUID(auth.UID(uid))
if !kuid.Ok() {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unmapped uid: %d", uid)
return nil, nil, linuxerr.EINVAL
}
rootKUID = kuid
printedOptsMap["uid"] = fmt.Sprintf("uid=%s", value)

printedOpts = append(printedOpts, fmt.Sprintf("uid=%s", uidStr))
}
rootKGID := creds.EffectiveKGID
gidStr, ok := mopts["gid"]
if ok {
delete(mopts, "gid")
gid, err := strconv.ParseUint(gidStr, 10, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid gid: %q", gidStr)
return nil, nil, linuxerr.EINVAL
}
kgid := creds.UserNamespace.MapToKGID(auth.GID(gid))
if !kgid.Ok() {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unmapped gid: %d", gid)
case "gid":
gid, err := strconv.ParseUint(value, 10, 32)
if err != nil {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: invalid gid: %q", value)
return nil, nil, linuxerr.EINVAL
}
kgid := creds.UserNamespace.MapToKGID(auth.GID(gid))
if !kgid.Ok() {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unmapped gid: %d", gid)
return nil, nil, linuxerr.EINVAL
}
rootKGID = kgid
printedOptsMap["gid"] = fmt.Sprintf("gid=%s", value)

case "noswap":
// Accept, but ignore, noswap.

default:
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unknown option: %s", key)
return nil, nil, linuxerr.EINVAL
}
rootKGID = kgid

printedOpts = append(printedOpts, fmt.Sprintf("gid=%s", gidStr))
}
// Accept, but ignore, noswap
delete(mopts, "noswap")

if len(mopts) != 0 {
ctx.Warningf("tmpfs.FilesystemType.GetFilesystem: unknown options: %v", mopts)
return nil, nil, linuxerr.EINVAL
var printedOpts []string
if val, ok := printedOptsMap["size"]; ok {
printedOpts = append(printedOpts, val)
}
if val, ok := printedOptsMap["nr_inodes"]; ok {
printedOpts = append(printedOpts, val)
}
if val, ok := printedOptsMap["mode"]; ok {
printedOpts = append(printedOpts, val)
}
if val, ok := printedOptsMap["uid"]; ok {
printedOpts = append(printedOpts, val)
}
if val, ok := printedOptsMap["gid"]; ok {
printedOpts = append(printedOpts, val)
}

devMinor, err := vfsObj.GetAnonBlockDevMinor()
Expand Down
Loading
Loading