lsscsi: fix xchdir("..") from symlink in /sys/bus/scsi/devices
authorMarkus Gothe <nietzsche@lysator.liu.se>
Sat, 21 Oct 2017 19:34:22 +0000 (21:34 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 22 Oct 2017 08:43:43 +0000 (10:43 +0200)
Signed-off-by: Markus Gothe <nietzsche@lysator.liu.se>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/lsscsi.c

index d7cd510561a3a2f388ae64c23a5f74dd4baf286c..0aaa01ded5fd721df5c4fe4b7d9dc0541a274bb4 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "libbb.h"
 
+static const char scsi_dir[] ALIGN1 = "/sys/bus/scsi/devices";
+
 static char *get_line(const char *filename, char *buf, unsigned *bufsize_p)
 {
        unsigned bufsize = *bufsize_p;
@@ -53,7 +55,7 @@ int lsscsi_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
        struct dirent *de;
        DIR *dir;
 
-       xchdir("/sys/bus/scsi/devices");
+       xchdir(scsi_dir);
 
        dir = xopendir(".");
        while ((de = readdir(dir)) != NULL) {
@@ -112,7 +114,10 @@ int lsscsi_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                );
                /* TODO: also output device column, e.g. "/dev/sdX" */
 
-               xchdir("..");
+               /* chdir("..") may not work as expected,
+                * since we might have followed a symlink.
+                */
+               xchdir(scsi_dir);
        }
 
        if (ENABLE_FEATURE_CLEAN_UP)