sysv-generator: escape names when translating from sysv name

While the LSB suggests only [A-Za-z0-9], that doesn't prevent admins
from doing the wrong thing. Lets not generate invalid names in
that case.
This commit is contained in:
Felipe Sateler 2015-06-27 21:00:32 -03:00
parent 2c09a745eb
commit 264581a2f1
2 changed files with 31 additions and 10 deletions

View File

@ -241,19 +241,21 @@ static bool usage_contains_reload(const char *line) {
static char *sysv_translate_name(const char *name) {
char *r;
_cleanup_free_ char *c;
r = new(char, strlen(name) + strlen(".service") + 1);
if (!r)
return NULL;
c = strdup(name);
if (!c)
return NULL;
if (endswith(name, ".sh"))
/* Drop .sh suffix */
strcpy(stpcpy(r, name) - 3, ".service");
r = endswith(c, ".sh");
if (r) {
*r = '\0';
}
if (unit_name_mangle(c, UNIT_NAME_NOGLOB, &r) >= 0)
return r;
else
/* Normal init script name */
strcpy(stpcpy(r, name), ".service");
return r;
return NULL;
}
static int sysv_translate_facility(const char *name, const char *filename, char **_r) {

View File

@ -190,6 +190,15 @@ class SysvGeneratorTest(unittest.TestCase):
self.assert_enabled('foo.service', ['multi-user', 'graphical'])
self.assertNotIn('Overwriting', err)
def test_simple_escaped(self):
'''simple service without dependencies, that requires escaping the name'''
self.add_sysv('foo+', {})
self.add_sysv('foo-admin', {})
err, results = self.run_generator()
self.assertEqual(list(results), ['foo-admin.service', 'foo\\x2b.service'])
self.assertNotIn('Overwriting', err)
def test_simple_enabled_some(self):
'''simple service without dependencies, enabled in some runlevels'''
@ -276,6 +285,16 @@ class SysvGeneratorTest(unittest.TestCase):
'foo.service')
self.assertNotIn('Overwriting', err)
def test_provides_escaped(self):
'''a script that Provides: a name that requires escaping'''
self.add_sysv('foo', {'Provides': 'foo foo+'})
err, results = self.run_generator()
self.assertEqual(list(results), ['foo.service'])
self.assertEqual(os.readlink(os.path.join(self.out_dir, 'foo\\x2b.service')),
'foo.service')
self.assertNotIn('Overwriting', err)
def test_same_provides_in_multiple_scripts(self):
'''multiple init.d scripts provide the same name'''