core: rework unit name validation and manipulation logic

A variety of changes:

- Make sure all our calls distuingish OOM from other errors if OOM is
  not the only error possible.

- Be much stricter when parsing escaped paths, do not accept trailing or
  leading escaped slashes.

- Change unit validation to take a bit mask for allowing plain names,
  instance names or template names or an combination thereof.

- Refuse manipulating invalid unit name
This commit is contained in:
Lennart Poettering
2015-05-05 15:06:42 -07:00
parent 6442185ab6
commit 7410616cd9
34 changed files with 1066 additions and 867 deletions
+9 -9
View File
@@ -37,6 +37,8 @@ int generator_write_fsck_deps(
const char *where,
const char *fstype) {
int r;
assert(f);
assert(dir);
assert(what);
@@ -48,7 +50,6 @@ int generator_write_fsck_deps(
}
if (!isempty(fstype) && !streq(fstype, "auto")) {
int r;
r = fsck_exists(fstype);
if (r == -ENOENT) {
/* treat missing check as essentially OK */
@@ -70,9 +71,9 @@ int generator_write_fsck_deps(
} else {
_cleanup_free_ char *fsck = NULL;
fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
if (!fsck)
return log_oom();
r = unit_name_from_path_instance("systemd-fsck", what, ".service", &fsck);
if (r < 0)
return log_error_errno(r, "Failed to create fsck service name: %m");
fprintf(f,
"RequiresOverridable=%1$s\n"
@@ -106,8 +107,7 @@ int generator_write_timeouts(
r = parse_sec(timeout, &u);
if (r < 0) {
log_warning("Failed to parse timeout for %s, ignoring: %s",
where, timeout);
log_warning("Failed to parse timeout for %s, ignoring: %s", where, timeout);
return 0;
}
@@ -115,9 +115,9 @@ int generator_write_timeouts(
if (!node)
return log_oom();
unit = unit_name_from_path(node, ".device");
if (!unit)
return log_oom();
r = unit_name_from_path(node, ".device", &unit);
if (r < 0)
return log_error_errno(r, "Failed to make unit name from path: %m");
return write_drop_in_format(dir, unit, 50, "device-timeout",
"# Automatically generated by %s\n\n"