From 2088e000eb7976f767e032a72f4bc9a54af25c28 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Mon, 26 Jan 2026 14:14:27 -0800 Subject: [PATCH 1/3] libct/configs: Id -> ID Rename a function parameter (containerId -> containerID) to avoid a linter warning: > var-naming: method parameter containerId should be containerID (revive) In many other places, including config.json (.linux.uidMappings and .gidMappings) it is already called containerID, so let's rename. Signed-off-by: Kir Kolyshkin --- libcontainer/configs/config_linux.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libcontainer/configs/config_linux.go b/libcontainer/configs/config_linux.go index e401f5331..4c36af160 100644 --- a/libcontainer/configs/config_linux.go +++ b/libcontainer/configs/config_linux.go @@ -26,26 +26,26 @@ type LinuxPersonality struct { // HostUID gets the translated uid for the process on host which could be // different when user namespaces are enabled. -func (c Config) HostUID(containerId int) (int, error) { +func (c Config) HostUID(containerID int) (int, error) { if c.Namespaces.Contains(NEWUSER) { if len(c.UIDMappings) == 0 { return -1, errNoUIDMap } - id, found := c.hostIDFromMapping(int64(containerId), c.UIDMappings) + id, found := c.hostIDFromMapping(int64(containerID), c.UIDMappings) if !found { - return -1, fmt.Errorf("user namespaces enabled, but no mapping found for uid %d", containerId) + return -1, fmt.Errorf("user namespaces enabled, but no mapping found for uid %d", containerID) } // If we are a 32-bit binary running on a 64-bit system, it's possible // the mapped user is too large to store in an int, which means we // cannot do the mapping. We can't just return an int64, because // os.Setuid() takes an int. if id > math.MaxInt { - return -1, fmt.Errorf("mapping for uid %d (host id %d) is larger than native integer size (%d)", containerId, id, math.MaxInt) + return -1, fmt.Errorf("mapping for uid %d (host id %d) is larger than native integer size (%d)", containerID, id, math.MaxInt) } return int(id), nil } // Return unchanged id. - return containerId, nil + return containerID, nil } // HostRootUID gets the root uid for the process on host which could be non-zero @@ -56,26 +56,26 @@ func (c Config) HostRootUID() (int, error) { // HostGID gets the translated gid for the process on host which could be // different when user namespaces are enabled. -func (c Config) HostGID(containerId int) (int, error) { +func (c Config) HostGID(containerID int) (int, error) { if c.Namespaces.Contains(NEWUSER) { if len(c.GIDMappings) == 0 { return -1, errNoGIDMap } - id, found := c.hostIDFromMapping(int64(containerId), c.GIDMappings) + id, found := c.hostIDFromMapping(int64(containerID), c.GIDMappings) if !found { - return -1, fmt.Errorf("user namespaces enabled, but no mapping found for gid %d", containerId) + return -1, fmt.Errorf("user namespaces enabled, but no mapping found for gid %d", containerID) } // If we are a 32-bit binary running on a 64-bit system, it's possible // the mapped user is too large to store in an int, which means we // cannot do the mapping. We can't just return an int64, because // os.Setgid() takes an int. if id > math.MaxInt { - return -1, fmt.Errorf("mapping for gid %d (host id %d) is larger than native integer size (%d)", containerId, id, math.MaxInt) + return -1, fmt.Errorf("mapping for gid %d (host id %d) is larger than native integer size (%d)", containerID, id, math.MaxInt) } return int(id), nil } // Return unchanged id. - return containerId, nil + return containerID, nil } // HostRootGID gets the root gid for the process on host which could be non-zero From 6cd91f665e18c5062faa2c595056eef650c1208f Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Mon, 19 Jan 2026 16:21:58 -0800 Subject: [PATCH 2/3] libct/configs: use pointers for Config methods The Config type is quite big (currently 554 bytes on a 64 bit Linux) and using non-pointer receivers in its methods results in copying which is totally unnecessary. Change the methods to use pointer receivers. Signed-off-by: Kir Kolyshkin --- libcontainer/configs/config_linux.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libcontainer/configs/config_linux.go b/libcontainer/configs/config_linux.go index 4c36af160..0e58bdc15 100644 --- a/libcontainer/configs/config_linux.go +++ b/libcontainer/configs/config_linux.go @@ -26,7 +26,7 @@ type LinuxPersonality struct { // HostUID gets the translated uid for the process on host which could be // different when user namespaces are enabled. -func (c Config) HostUID(containerID int) (int, error) { +func (c *Config) HostUID(containerID int) (int, error) { if c.Namespaces.Contains(NEWUSER) { if len(c.UIDMappings) == 0 { return -1, errNoUIDMap @@ -50,13 +50,13 @@ func (c Config) HostUID(containerID int) (int, error) { // HostRootUID gets the root uid for the process on host which could be non-zero // when user namespaces are enabled. -func (c Config) HostRootUID() (int, error) { +func (c *Config) HostRootUID() (int, error) { return c.HostUID(0) } // HostGID gets the translated gid for the process on host which could be // different when user namespaces are enabled. -func (c Config) HostGID(containerID int) (int, error) { +func (c *Config) HostGID(containerID int) (int, error) { if c.Namespaces.Contains(NEWUSER) { if len(c.GIDMappings) == 0 { return -1, errNoGIDMap @@ -80,13 +80,13 @@ func (c Config) HostGID(containerID int) (int, error) { // HostRootGID gets the root gid for the process on host which could be non-zero // when user namespaces are enabled. -func (c Config) HostRootGID() (int, error) { +func (c *Config) HostRootGID() (int, error) { return c.HostGID(0) } // Utility function that gets a host ID for a container ID from user namespace map // if that ID is present in the map. -func (c Config) hostIDFromMapping(containerID int64, uMap []IDMap) (int64, bool) { +func (c *Config) hostIDFromMapping(containerID int64, uMap []IDMap) (int64, bool) { for _, m := range uMap { if (containerID >= m.ContainerID) && (containerID <= (m.ContainerID + m.Size - 1)) { hostID := m.HostID + (containerID - m.ContainerID) From 593ac3b7d90eae71b3ce399d3f168a03fed8dda2 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Mon, 19 Jan 2026 16:26:24 -0800 Subject: [PATCH 3/3] libct: use pointers for Process methods The Process type is quite big (currently 368 bytes on a 64 bit Linux) and using non-pointer receivers in its methods results in copying which is totally unnecessary. Change the methods to use pointer receivers. Signed-off-by: Kir Kolyshkin --- libcontainer/process.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libcontainer/process.go b/libcontainer/process.go index 7fca1febc..25cabbe13 100644 --- a/libcontainer/process.go +++ b/libcontainer/process.go @@ -127,7 +127,7 @@ type Process struct { // Wait waits for the process to exit. // Wait releases any resources associated with the Process -func (p Process) Wait() (*os.ProcessState, error) { +func (p *Process) Wait() (*os.ProcessState, error) { if p.ops == nil { return nil, errInvalidProcess } @@ -135,7 +135,7 @@ func (p Process) Wait() (*os.ProcessState, error) { } // Pid returns the process ID -func (p Process) Pid() (int, error) { +func (p *Process) Pid() (int, error) { // math.MinInt32 is returned here, because it's invalid value // for the kill() system call. if p.ops == nil { @@ -145,7 +145,7 @@ func (p Process) Pid() (int, error) { } // Signal sends a signal to the Process. -func (p Process) Signal(sig os.Signal) error { +func (p *Process) Signal(sig os.Signal) error { if p.ops == nil { return errInvalidProcess }