Browse Source

Return NOTTY for all btrfs ioctl calls

mergerfs tries to pass through ioctl calls but due to the complexity
of btrfs calls their is risk of segfaults. In the future it may be
required to whitelist all supported ioctl calls.
pull/1137/head
Antonio SJ Musumeci 2 years ago
parent
commit
2d9c915641
  1. 12
      src/fuse_ioctl.cpp

12
src/fuse_ioctl.cpp

@ -44,6 +44,9 @@ typedef char IOCTL_BUF[4096];
#define IOCTL_APP_TYPE 0xDF #define IOCTL_APP_TYPE 0xDF
#define IOCTL_FILE_INFO _IOWR(IOCTL_APP_TYPE,0,IOCTL_BUF) #define IOCTL_FILE_INFO _IOWR(IOCTL_APP_TYPE,0,IOCTL_BUF)
// From linux/btrfs.h
#define BTRFS_IOCTL_MAGIC 0x94
#ifndef FS_IOC_GETFLAGS #ifndef FS_IOC_GETFLAGS
# define FS_IOC_GETFLAGS _IOR('f',1,long) # define FS_IOC_GETFLAGS _IOR('f',1,long)
#endif #endif
@ -314,6 +317,13 @@ namespace l
return (_IOC_TYPE(cmd_) == IOCTL_APP_TYPE); return (_IOC_TYPE(cmd_) == IOCTL_APP_TYPE);
} }
static
bool
is_btrfs_ioctl_cmd(const unsigned long cmd_)
{
return (_IOC_TYPE(cmd_) == BTRFS_IOCTL_MAGIC);
}
static static
int int
ioctl_custom(const fuse_file_info_t *ffi_, ioctl_custom(const fuse_file_info_t *ffi_,
@ -340,6 +350,8 @@ namespace FUSE
void *data_, void *data_,
uint32_t *out_bufsz_) uint32_t *out_bufsz_)
{ {
if(l::is_btrfs_ioctl_cmd(cmd_))
return -ENOTTY;
if(l::is_mergerfs_ioctl_cmd(cmd_)) if(l::is_mergerfs_ioctl_cmd(cmd_))
return l::ioctl_custom(ffi_,cmd_,data_); return l::ioctl_custom(ffi_,cmd_,data_);

Loading…
Cancel
Save