diff options
Diffstat (limited to 'e2fsprogs/lsattr.c')
-rw-r--r-- | e2fsprogs/lsattr.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/e2fsprogs/lsattr.c b/e2fsprogs/lsattr.c index b4ed12d50..545afa7f5 100644 --- a/e2fsprogs/lsattr.c +++ b/e2fsprogs/lsattr.c | |||
@@ -49,8 +49,13 @@ static void list_attributes(const char *name) | |||
49 | unsigned fsflags; | 49 | unsigned fsflags; |
50 | int fd, r; | 50 | int fd, r; |
51 | 51 | ||
52 | fd = open_or_warn(name, O_RDONLY | O_NONBLOCK); /* neither read nor write asked for */ | 52 | /* There is no way to run needed ioctls on a symlink. |
53 | if (fd < 0) /* for example, dangling links */ | 53 | * open(O_PATH | O_NOFOLLOW) _can_ be used to get a fd referring to the symlink, |
54 | * but ioctls fail on such a fd (tried on 4.12.0 kernel). | ||
55 | * e2fsprogs-1.46.2 uses open(O_NOFOLLOW), it fails on symlinks. | ||
56 | */ | ||
57 | fd = open_or_warn(name, O_RDONLY | O_NONBLOCK | O_NOCTTY | O_NOFOLLOW); | ||
58 | if (fd < 0) | ||
54 | return; | 59 | return; |
55 | 60 | ||
56 | if (option_mask32 & OPT_PROJID) { | 61 | if (option_mask32 & OPT_PROJID) { |
@@ -102,8 +107,12 @@ static int FAST_FUNC lsattr_dir_proc(const char *dir_name, | |||
102 | 107 | ||
103 | if (lstat(path, &st) != 0) | 108 | if (lstat(path, &st) != 0) |
104 | bb_perror_msg("can't stat '%s'", path); | 109 | bb_perror_msg("can't stat '%s'", path); |
110 | |||
105 | else if (de->d_name[0] != '.' || (option_mask32 & OPT_ALL)) { | 111 | else if (de->d_name[0] != '.' || (option_mask32 & OPT_ALL)) { |
106 | list_attributes(path); | 112 | /* Don't try to open device files, fifos etc */ |
113 | if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode) || S_ISDIR(st.st_mode)) | ||
114 | list_attributes(path); | ||
115 | |||
107 | if (S_ISDIR(st.st_mode) && (option_mask32 & OPT_RECUR) | 116 | if (S_ISDIR(st.st_mode) && (option_mask32 & OPT_RECUR) |
108 | && !DOT_OR_DOTDOT(de->d_name) | 117 | && !DOT_OR_DOTDOT(de->d_name) |
109 | ) { | 118 | ) { |