mirror of
https://github.com/containers/podman.git
synced 2025-08-06 11:32:07 +08:00
libpod: bind ports before network setup
We bind ports to ensure there are no conflicts and we leak them into conmon to keep them open. However we bound the ports after the network was set up so it was possible for a second network setup to overwrite the firewall configs of a previous container as it failed only later when binding the port. As such we must ensure we bind before the network is set up. This is not so simple because we still have to take care of PostConfigureNetNS bool in which case the network set up happens after we launch conmon. Thus we end up with two different conditions. Also it is possible that we "leak" the ports that are set on the container until the garbage collector will close them. This is not perfect but the alternative is adding special error handling on each function exit after prepare until we start conmon which is a lot of work to do correctly. Fixes https://issues.redhat.com/browse/RHEL-50746 Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
@ -82,6 +82,11 @@ func (c *Container) prepare() error {
|
||||
// Set up network namespace if not already set up
|
||||
noNetNS := c.state.NetNS == ""
|
||||
if c.config.CreateNetNS && noNetNS && !c.config.PostConfigureNetNS {
|
||||
c.reservedPorts, createNetNSErr = c.bindPorts()
|
||||
if createNetNSErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
netNS, networkStatus, createNetNSErr = c.runtime.createNetNS(c)
|
||||
if createNetNSErr != nil {
|
||||
return
|
||||
@ -148,6 +153,11 @@ func (c *Container) prepare() error {
|
||||
}
|
||||
|
||||
if createErr != nil {
|
||||
for _, f := range c.reservedPorts {
|
||||
// make sure to close all ports again on errors
|
||||
f.Close()
|
||||
}
|
||||
c.reservedPorts = nil
|
||||
return createErr
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user