Skip to content

Commit

Permalink
basic: Make sure we're extra paranoid in chattr_full
Browse files Browse the repository at this point in the history
On btrfs, trying to disable FS_NOCOW_FL on a file that has data
already written will fail silently without reporting an error. To
catch such cases, let's query the flags again if the IOC_SETFLAGS
ioctl() succeeds to make sure the flags we tried to configure we're
actually accepted by the kernel.
  • Loading branch information
DaanDeMeyer committed Dec 6, 2021
1 parent 461955e commit 5a98019
Showing 1 changed file with 19 additions and 5 deletions.
24 changes: 19 additions & 5 deletions src/basic/chattr-util.c
Expand Up @@ -59,11 +59,25 @@ int chattr_full(const char *path,
}

if (ioctl(fd, FS_IOC_SETFLAGS, &new_attr) >= 0) {
if (ret_previous)
*ret_previous = old_attr;
if (ret_final)
*ret_final = new_attr;
return 1;
unsigned attr;

/* Some filesystems (BTRFS) silently fail when a flag cannot be set. Let's make sure our
* changes actually went through by querying the flags again and verifying they're equal to
* the flags we tried to configure. */

if (ioctl(fd, FS_IOC_GETFLAGS, &attr) < 0)
return -errno;

if (new_attr == attr) {
if (ret_previous)
*ret_previous = old_attr;
if (ret_final)
*ret_final = new_attr;
return 1;
}

/* Trigger the fallback logic. */
errno = EINVAL;
}

if ((errno != EINVAL && !ERRNO_IS_NOT_SUPPORTED(errno)) ||
Expand Down

0 comments on commit 5a98019

Please sign in to comment.