aboutsummaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorDamien Riegel <damien.riegel@savoirfairelinux.com>2018-06-22 14:43:02 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-06-27 13:54:18 +0100
commitbbd9524256461f1bcafd4103edd575e668de76f8 (patch)
treed24323133c6d9d765d42abc571c2cf185b3aa32c /meta
parent68e0080a924654245f04cf92c2579abd9e5bc658 (diff)
downloadopenembedded-core-contrib-bbd9524256461f1bcafd4103edd575e668de76f8.tar.gz
systemd: escape paths passed to shell
Systemd mount configuration file must have a name that match the mount point directory they control. So for instance, if a mount file contains [Mount] ... Where=/mnt/my-data The file must be named `mnt-my\x2ddata.mount`, or systemd will refuse to honour it. If this config file contains an [Install] section, it will silently fail because the unit file is not escaped properly when systemctl is called. To fix that, make sure paths are escaped through `shlex.quote`. Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/systemd.bbclass14
1 files changed, 9 insertions, 5 deletions
diff --git a/meta/classes/systemd.bbclass b/meta/classes/systemd.bbclass
index 1b134322fb..c7b784dea8 100644
--- a/meta/classes/systemd.bbclass
+++ b/meta/classes/systemd.bbclass
@@ -34,10 +34,10 @@ if type systemctl >/dev/null 2>/dev/null; then
systemctl daemon-reload
fi
- systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE}
+ systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE_ESCAPED}
if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
- systemctl --no-block restart ${SYSTEMD_SERVICE}
+ systemctl --no-block restart ${SYSTEMD_SERVICE_ESCAPED}
fi
fi
}
@@ -51,10 +51,10 @@ fi
if type systemctl >/dev/null 2>/dev/null; then
if [ -z "$D" ]; then
- systemctl stop ${SYSTEMD_SERVICE}
+ systemctl stop ${SYSTEMD_SERVICE_ESCAPED}
fi
- systemctl $OPTS disable ${SYSTEMD_SERVICE}
+ systemctl $OPTS disable ${SYSTEMD_SERVICE_ESCAPED}
fi
}
@@ -65,6 +65,7 @@ systemd_populate_packages[vardepsexclude] += "OVERRIDES"
python systemd_populate_packages() {
import re
+ import shlex
if not bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d):
return
@@ -85,6 +86,9 @@ python systemd_populate_packages() {
def systemd_generate_package_scripts(pkg):
bb.debug(1, 'adding systemd calls to postinst/postrm for %s' % pkg)
+ paths_escaped = ' '.join(shlex.quote(s) for s in d.getVar('SYSTEMD_SERVICE_' + pkg, True).split())
+ d.setVar('SYSTEMD_SERVICE_ESCAPED_' + pkg, paths_escaped)
+
# Add pkg to the overrides so that it finds the SYSTEMD_SERVICE_pkg
# variable.
localdata = d.createCopy()
@@ -130,7 +134,7 @@ python systemd_populate_packages() {
systemd_add_files_and_parse(pkg_systemd, path, service_base + '@.service', keys)
for key in keys.split():
# recurse all dependencies found in keys ('Also';'Conflicts';..) and add to files
- cmd = "grep %s %s | sed 's,%s=,,g' | tr ',' '\\n'" % (key, fullpath, key)
+ cmd = "grep %s %s | sed 's,%s=,,g' | tr ',' '\\n'" % (key, shlex.quote(fullpath), key)
pipe = os.popen(cmd, 'r')
line = pipe.readline()
while line: