From be322ecafbacc7d7cb7ae42932faf59f3790c36f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 2 Jun 2021 23:23:21 +0900 Subject: [PATCH] udev: refuse unsafe device symbolic link --- src/udev/udev-node.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index b3bbbaa4d81..033ecc91f22 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -239,17 +239,25 @@ toolong: } /* manage "stack of names" with possibly specified device priorities */ -static int link_update(sd_device *dev, const char *slink, bool add) { - _cleanup_free_ char *filename = NULL, *dirname = NULL; +static int link_update(sd_device *dev, const char *slink_in, bool add) { + _cleanup_free_ char *slink = NULL, *filename = NULL, *dirname = NULL; const char *slink_name, *id; char name_enc[NAME_MAX+1]; int i, r, retries; assert(dev); - assert(slink); + assert(slink_in); + + slink = strdup(slink_in); + if (!slink) + return log_oom_debug(); + + path_simplify(slink); slink_name = path_startswith(slink, "/dev"); - if (!slink_name) + if (!slink_name || + empty_or_root(slink_name) || + !path_is_normalized(slink_name)) return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EINVAL), "Invalid symbolic link of device node: %s", slink); -- 2.47.3