commit:     28ce410d2aa2eb33d0e61fbf272e1929b734622d
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Mar 27 15:14:48 2020 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Mar 28 18:48:24 2020 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=28ce410d

process: Unshare UTS namespace, and set hostname to 'localhost'

Use UTS namespace to override hostname when network-sandbox is enabled.
Set it to 'localhost' as that has a better chance of being present
in /etc/hosts.  This fixes tests in some packages that try to connect
to localhost via hostname obtained using gethostname(), e.g. docker-py,
and suffer resolution problems due to the system hostname not being
defined in /etc/hosts.

Closes: https://github.com/gentoo/portage/pull/539
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 lib/portage/process.py | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lib/portage/process.py b/lib/portage/process.py
index c1fc4bcf6..590116890 100644
--- a/lib/portage/process.py
+++ b/lib/portage/process.py
@@ -348,12 +348,14 @@ def spawn(mycommand, env=None, opt_name=None, 
fd_pipes=None, returnpid=False,
        if unshare_net or unshare_ipc or unshare_mount or unshare_pid:
                # from /usr/include/bits/sched.h
                CLONE_NEWNS = 0x00020000
+               CLONE_NEWUTS = 0x04000000
                CLONE_NEWIPC = 0x08000000
                CLONE_NEWPID = 0x20000000
                CLONE_NEWNET = 0x40000000
 
                if unshare_net:
-                       unshare_flags |= CLONE_NEWNET
+                       # UTS namespace to override hostname
+                       unshare_flags |= CLONE_NEWNET | CLONE_NEWUTS
                if unshare_ipc:
                        unshare_flags |= CLONE_NEWIPC
                if unshare_mount:
@@ -704,6 +706,13 @@ def _exec(binary, mycommand, opt_name, fd_pipes,
                                                                        
noiselevel=-1)
                                                                os._exit(1)
                                                if unshare_net:
+                                                       # use 'localhost' to 
avoid hostname resolution problems
+                                                       try:
+                                                               
socket.sethostname('localhost')
+                                                       except Exception as e:
+                                                               
writemsg("Unable to set hostname: %s (for FEATURES=\"network-sandbox\")\n" % (
+                                                                       e,),
+                                                                       
noiselevel=-1)
                                                        
_configure_loopback_interface()
                                except AttributeError:
                                        # unshare() not supported by libc

Reply via email to