On Wed, Jul 31, 2019 at 2:00 PM Zac Medico <zmed...@gentoo.org> wrote:
>
> On 7/31/19 9:06 AM, Mike Gilbert wrote:
> > This works around some strange behavior in glibc's getaddrinfo()
> > implementation when the AI_ADDRCONFIG flag is set.
> >
> > For example:
> >
> >   struct addrinfo *res, hints = { .ai_family = AF_INET, .ai_flags = 
> > AI_ADDRCONFIG };
> >   getaddrinfo("localhost", NULL, &hints, &res);
> >
> > This returns no results if there is no non-loopback interface configured 
> > with an
> > IPv4 address.
> >
> > Bug: https://bugs.gentoo.org/690758
> > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=12377#c13
> > Signed-off-by: Mike Gilbert <flop...@gentoo.org>
> > ---
> >  lib/portage/process.py | 24 ++++++++++++++++++++++++
> >  1 file changed, 24 insertions(+)
> >
> > diff --git a/lib/portage/process.py b/lib/portage/process.py
> > index dfbda75de..c284c04f3 100644
> > --- a/lib/portage/process.py
> > +++ b/lib/portage/process.py
> > @@ -446,6 +446,29 @@ def spawn(mycommand, env=None, opt_name=None, 
> > fd_pipes=None, returnpid=False,
> >       # Everything succeeded
> >       return 0
> >
> > +def _configure_dummy_interface():
> > +     """
> > +     Configure a dummy interface to work around odd behavior in glibc's
> > +     getaddrinfo() implementation when the AI_ADDRCONFIG flag is set.
> > +
> > +     For example:
> > +
> > +       struct addrinfo *res, hints = { .ai_family = AF_INET, .ai_flags = 
> > AI_ADDRCONFIG };
> > +       getaddrinfo("localhost", NULL, &hints, &res);
> > +
> > +     This returns no results if there is no non-loopback interface 
> > configured with an
> > +     IPv4 address.
> > +
> > +     Bug: https://bugs.gentoo.org/690758
> > +     Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=12377#c13
> > +     """
> > +     try:
> > +             
> > subprocess.check_call(['ip','link','add','dummy','type','dummy'])
> > +             subprocess.check_call(['ip','link','set','dummy','up'])
> > +             
> > subprocess.check_call(['ip','address','add','10.0.0.1/8','dev','dummy'])
> > +     except subprocess.CalledProcessError:
> > +             writemsg("Unable to configure dummy network interface\n")
> > +
> >  def _exec(binary, mycommand, opt_name, fd_pipes,
> >       env, gid, groups, uid, umask, cwd,
> >       pre_exec, close_fds, unshare_net, unshare_ipc, unshare_mount, 
> > unshare_pid,
> > @@ -637,6 +660,7 @@ def _exec(binary, mycommand, opt_name, fd_pipes,
> >                                                                       
> > errno.errorcode.get(e.errno, '?')),
> >                                                                       
> > noiselevel=-1)
> >                                                       sock.close()
> > +                                                     
> > _configure_dummy_interface()
> >                               except AttributeError:
> >                                       # unshare() not supported by libc
> >                                       pass
> >
>
> Maybe it will suffice to add the address to the loopback interface?

I wasn't expecting that to work, but it actually does! That makes this
a bit simpler indeed. I'll send a new patch in a bit.

Reply via email to