Whamcloud - gitweb
libe2p: use stat to prevent calling EXT2_IOC_[GS]ETFLAGS on devices
authorTheodore Ts'o <tytso@mit.edu>
Sat, 17 Jul 2021 02:31:26 +0000 (22:31 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 17 Jul 2021 02:31:26 +0000 (22:31 -0400)
Some devices can react badly to the EXT2_IOC_[GS]ETFLAGS ioctls, since
ioctl codes are not guaranteed to be unique across different device
drivers and file systems.

Addresses-Debian-Bug: #986332
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/e2p/fgetflags.c
lib/e2p/fsetflags.c

index 93e130c..24a7166 100644 (file)
@@ -79,14 +79,26 @@ int fgetflags (const char * name, unsigned long * flags)
        *flags = f;
        return (save_errno);
 #elif HAVE_EXT2_IOCTLS
+       struct stat buf;
        int fd, r, f, save_errno = 0;
 
+       if (!stat(name, &buf) &&
+           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+               errno = EOPNOTSUPP;
+               return -1;
+       }
        fd = open(name, OPEN_FLAGS);
        if (fd == -1) {
                if (errno == ELOOP || errno == ENXIO)
                        errno = EOPNOTSUPP;
                return -1;
        }
+       if (!fstat(fd, &buf) &&
+           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+               close(fd);
+               errno = EOPNOTSUPP;
+               return -1;
+       }
        r = ioctl(fd, EXT2_IOC_GETFLAGS, &f);
        if (r == -1) {
                if (errno == ENOTTY)
index 6455e38..d865d24 100644 (file)
@@ -80,14 +80,26 @@ int fsetflags (const char * name, unsigned long flags)
        int f = (int) flags;
        return syscall(SYS_fsctl, name, EXT2_IOC_SETFLAGS, &f, 0);
 #elif HAVE_EXT2_IOCTLS
+       struct stat buf;
        int fd, r, f, save_errno = 0;
 
+       if (!stat(name, &buf) &&
+           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+               errno = EOPNOTSUPP;
+               return -1;
+       }
        fd = open(name, OPEN_FLAGS);
        if (fd == -1) {
                if (errno == ELOOP || errno == ENXIO)
                        errno = EOPNOTSUPP;
                return -1;
        }
+       if (!fstat(fd, &buf) &&
+           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+               close(fd);
+               errno = EOPNOTSUPP;
+               return -1;
+       }
        f = (int) flags;
        r = ioctl(fd, EXT2_IOC_SETFLAGS, &f);
        if (r == -1) {