From: Zbigniew Jędrzejewski-Szmek Date: Wed, 5 Jun 2019 12:46:04 +0000 (+0200) Subject: tmpfiles: also prefix C source paths with --root X-Git-Tag: v243-rc1~150^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=626f8d1672c57e0ebbe9331d98bd0cf841754bd6;p=thirdparty%2Fsystemd.git tmpfiles: also prefix C source paths with --root This makes the code match the docs for --root ("all paths will be prefixed"). I think this is reasonable, because --root also works for config paths, and any configuration inside --root must refer to paths under --root. If we allowed C to go "outside of root" in this way, the effect of calling systemd-tmpfiles --root=... and chrooting first and then calling systemd-tmpfiles second would be quite different. I think it's better to keep things simple and consistent. Fixes #12467. --- diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index eabc51101d9..36ffd072b44 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -2638,13 +2638,22 @@ static int parse_line(const char *fname, unsigned line, const char *buffer, bool case COPY_FILES: if (!i.argument) { - i.argument = strappend("/usr/share/factory/", i.path); + i.argument = path_join(arg_root, "/usr/share/factory/", i.path); if (!i.argument) return log_oom(); + } else if (!path_is_absolute(i.argument)) { *invalid_config = true; log_error("[%s:%u] Source path is not absolute.", fname, line); return -EBADMSG; + + } else if (arg_root) { + char *p; + + p = prefix_root(arg_root, i.argument); + if (!p) + return log_oom(); + free_and_replace(i.argument, p); } path_simplify(i.argument, false); @@ -2738,7 +2747,6 @@ static int parse_line(const char *fname, unsigned line, const char *buffer, bool p = prefix_root(arg_root, i.path); if (!p) return log_oom(); - free_and_replace(i.path, p); }