Use env to set environ when starting dnsmasq

Explictly use env to setup needed environment variables for dnsmasq when
starting to avoid problems with subprocess mis-interpreting the first
command line argument as the executable name.

Also update DnsmasqFilter to accept any command that starts with env
followed by a set of args that include an equals sign, as long as the
next arg is the dnsmasq command.

fixes bug #1073253

Change-Id: I8ac08ba2d2309934a67ed2cb28049ed5d3277d63
This commit is contained in:
Andrew Laski
2012-10-30 16:54:41 -04:00
parent 10db27b9fd
commit fcf44d749f
2 changed files with 9 additions and 7 deletions

View File

@@ -73,19 +73,21 @@ class DnsmasqFilter(CommandFilter):
"""Specific filter for the dnsmasq call (which includes env)"""
def match(self, userargs):
if (userargs[0].startswith("FLAGFILE=") and
userargs[1].startswith("NETWORK_ID=") and
userargs[2] == "dnsmasq"):
if (userargs[0] == 'env' and
userargs[1].startswith('FLAGFILE=') and
userargs[2].startswith('NETWORK_ID=') and
userargs[3] == 'dnsmasq'):
return True
return False
def get_command(self, userargs):
return [self.exec_path] + userargs[3:]
dnsmasq_pos = userargs.index('dnsmasq')
return [self.exec_path] + userargs[dnsmasq_pos + 1:]
def get_environment(self, userargs):
env = os.environ.copy()
env['FLAGFILE'] = userargs[0].split('=')[-1]
env['NETWORK_ID'] = userargs[1].split('=')[-1]
env['FLAGFILE'] = userargs[1].split('=')[-1]
env['NETWORK_ID'] = userargs[2].split('=')[-1]
return env

View File

@@ -55,7 +55,7 @@ class RootwrapTestCase(test.TestCase):
self.assertTrue(filtermatch is None)
def test_DnsmasqFilter(self):
usercmd = ['FLAGFILE=A', 'NETWORK_ID=foobar', 'dnsmasq', 'foo']
usercmd = ['env', 'FLAGFILE=A', 'NETWORK_ID=foobar', 'dnsmasq', 'foo']
f = filters.DnsmasqFilter("/usr/bin/dnsmasq", "root")
self.assertTrue(f.match(usercmd))
self.assertEqual(f.get_command(usercmd), ['/usr/bin/dnsmasq', 'foo'])