]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysv-generator: escape names when translating from sysv name 412/head
authorFelipe Sateler <fsateler@debian.org>
Sun, 28 Jun 2015 00:00:32 +0000 (21:00 -0300)
committerFelipe Sateler <fsateler@debian.org>
Mon, 29 Jun 2015 19:07:49 +0000 (16:07 -0300)
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.

src/sysv-generator/sysv-generator.c
test/sysv-generator-test.py

index c9dd3b6302d91ebc11bdb13d6f74fcc7908e18a2..0d246b1835a0f4c23871240c424cb74eaeea99b8 100644 (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");
-        else
-                /* Normal init script name */
-                strcpy(stpcpy(r, name), ".service");
+        r = endswith(c, ".sh");
+        if (r) {
+            *r = '\0';
+        }
 
-        return r;
+        if (unit_name_mangle(c, UNIT_NAME_NOGLOB, &r) >= 0)
+            return r;
+        else
+            return NULL;
 }
 
 static int sysv_translate_facility(const char *name, const char *filename, char **_r) {
index af0493b9a883874672b329ec422bc1e5347c0c6b..23d6646bba083f3f59b948164922b67551ba2f20 100644 (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'''