chiark / gitweb /
service: don't hit an assert if information in LSB headers is incorrectly formatted
authorLennart Poettering <lennart@poettering.net>
Thu, 6 Jan 2011 22:52:58 +0000 (23:52 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 6 Jan 2011 23:49:35 +0000 (00:49 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=667665

src/service.c

index 9f2ee4192fff506d099539a8b450ca4e1fa9351d..a28eb8a6b91156e2501c6674aeb544eaf2ed671f 100644 (file)
@@ -328,10 +328,13 @@ static int sysv_translate_facility(const char *name, const char *filename, char
         /* If we don't know this name, fallback heuristics to figure
          * out whether something is a target or a service alias. */
 
-        if (*name == '$')
+        if (*name == '$') {
+                if (!unit_prefix_is_valid(n))
+                        return -EINVAL;
+
                 /* Facilities starting with $ are most likely targets */
                 r = unit_name_build(n, NULL, ".target");
-        else if (filename && streq(name, filename))
+        else if (filename && streq(name, filename))
                 /* Names equalling the file name of the services are redundant */
                 return 0;
         else
@@ -684,10 +687,14 @@ static int service_load_sysv_path(Service *s, const char *path) {
                                         }
 
                                         r = sysv_translate_facility(n, file_name_from_path(path), &m);
-                                        free(n);
 
-                                        if (r < 0)
-                                                goto finish;
+                                        if (r < 0) {
+                                                log_error("[%s:%u] Failed to translate LSB dependency %s, ignoring: %s", path, line, n, strerror(-r));
+                                                free(n);
+                                                continue;
+                                        }
+
+                                        free(n);
 
                                         if (r == 0)
                                                 continue;