]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: use readlink_malloc() or its friend
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 13 Oct 2018 14:28:02 +0000 (23:28 +0900)
committerLennart Poettering <lennart@poettering.net>
Sun, 14 Oct 2018 17:59:49 +0000 (19:59 +0200)
Follow-up for a2554acec652fc65c8ed0c6c1fede9ba8c3693b1 and
70068602713e8f441c5ddc2618f007f24488e422.

src/udev/udev-node.c
src/udev/udev-watch.c

index 7a883564b18b6632cede6bbfa98ec4b300a88ed4..6b0659159d280b682d7612bf1f21973d5fbf276a 100644 (file)
@@ -49,18 +49,14 @@ static int node_symlink(sd_device *dev, const char *node, const char *slink) {
                         log_error("Conflicting device node '%s' found, link to '%s' will not be created.", slink, node);
                         return -EOPNOTSUPP;
                 } else if (S_ISLNK(stats.st_mode)) {
-                        char buf[PATH_MAX];
-                        ssize_t len;
-
-                        len = readlink(slink, buf, sizeof(buf));
-                        if (len > 0 && len < (ssize_t) sizeof(buf)) {
-                                buf[len] = '\0';
-                                if (streq(target, buf)) {
-                                        log_debug("Preserve already existing symlink '%s' to '%s'", slink, target);
-                                        (void) label_fix(slink, LABEL_IGNORE_ENOENT);
-                                        (void) utimensat(AT_FDCWD, slink, NULL, AT_SYMLINK_NOFOLLOW);
-                                        return 0;
-                                }
+                        _cleanup_free_ char *buf = NULL;
+
+                        if (readlink_malloc(slink, &buf) >= 0 &&
+                            streq(target, buf)) {
+                                log_debug("Preserve already existing symlink '%s' to '%s'", slink, target);
+                                (void) label_fix(slink, LABEL_IGNORE_ENOENT);
+                                (void) utimensat(AT_FDCWD, slink, NULL, AT_SYMLINK_NOFOLLOW);
+                                return 0;
                         }
                 }
         } else {
index d3e4391ee9acdd778dde5d422542d05b3cb814e7..cfcb310d231cec957d301679fe12945cee58ce2d 100644 (file)
@@ -7,8 +7,10 @@
 #include <sys/inotify.h>
 #include <unistd.h>
 
+#include "alloc-util.h"
 #include "device-private.h"
 #include "dirent-util.h"
+#include "fs-util.h"
 #include "mkdir.h"
 #include "stdio-util.h"
 #include "udev-watch.h"
@@ -48,21 +50,16 @@ int udev_watch_restore(void) {
 
         FOREACH_DIRENT_ALL(ent, dir, break) {
                 _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
-                char device[PATH_MAX];
-                ssize_t len;
+                _cleanup_free_ char *device = NULL;
 
                 if (ent->d_name[0] == '.')
                         continue;
 
-                len = readlinkat(dirfd(dir), ent->d_name, device, sizeof(device));
-                if (len <= 0) {
-                        log_error_errno(errno, "Failed to read link '/run/udev/watch.old/%s', ignoring: %m", ent->d_name);
-                        goto unlink;
-                } else if (len >= (ssize_t) sizeof(device)) {
-                        log_error("Path specified by link '/run/udev/watch.old/%s' is truncated, ignoring.", ent->d_name);
+                r = readlinkat_malloc(dirfd(dir), ent->d_name, &device);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to read link '/run/udev/watch.old/%s', ignoring: %m", ent->d_name);
                         goto unlink;
                 }
-                device[len] = '\0';
 
                 r = sd_device_new_from_device_id(&dev, device);
                 if (r < 0) {
@@ -152,8 +149,8 @@ int udev_watch_end(sd_device *dev) {
 }
 
 int udev_watch_lookup(int wd, sd_device **ret) {
-        char filename[STRLEN("/run/udev/watch/") + DECIMAL_STR_MAX(int)], device[PATH_MAX];
-        ssize_t len;
+        char filename[STRLEN("/run/udev/watch/") + DECIMAL_STR_MAX(int)];
+        _cleanup_free_ char *device = NULL;
         int r;
 
         assert(ret);
@@ -165,14 +162,12 @@ int udev_watch_lookup(int wd, sd_device **ret) {
                 return log_error_errno(EINVAL, "Invalid watch handle.");
 
         xsprintf(filename, "/run/udev/watch/%d", wd);
-        len = readlink(filename, device, sizeof(device));
-        if (len <= 0) {
-                if (errno != ENOENT)
+        r = readlink_malloc(filename, &device);
+        if (r < 0) {
+                if (r != -ENOENT)
                         return log_error_errno(errno, "Failed to read link '%s': %m", filename);
                 return 0;
-        } else if (len >= (ssize_t) sizeof(device))
-                return log_error_errno(ENAMETOOLONG, "Path specified by link '%s' is truncated.", filename);
-        device[len] = '\0';
+        }
 
         r = sd_device_new_from_device_id(ret, device);
         if (r < 0)