• Jeff Mahoney's avatar
    Btrfs: Add workaround for AppArmor changing remove_suid() · 12fa8ec6
    Jeff Mahoney authored
    In openSUSE 10.3, AppArmor modifies remove_suid to take a struct path
    rather than just a dentry. This patch tests that the kernel is openSUSE
    10.3 or newer and adjusts the call accordingly.
    
    Debian/Ubuntu with AppArmor applied will also need a similar patch.
    Maintainers of btrfs under those distributions should build on this
    patch or, alternatively, alter their package descriptions to add
    -DREMOVE_SUID_PATH to the compiler command line.
    Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
    - --- /dev/null	1970-01-01 00:00:00.000000000 +0000
    +++ b/compat.h	2008-02-06 16:46:13.000000000 -0500
    @@ -0,0 +1,15 @@
    +#ifndef _COMPAT_H_
    +#define _COMPAT_H_
    +
    +
    +/*
    + * Even if AppArmor isn't enabled, it still has different prototypes.
    + * Add more distro/version pairs here to declare which has AppArmor applied.
    + */
    +#if defined(CONFIG_SUSE_KERNEL)
    +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
    +# define REMOVE_SUID_PATH 1
    +# endif
    +#endif
    +
    +#endif /* _COMPAT_H_ */
    - --- a/file.c	2008-02-06 11:37:39.000000000 -0500
    +++ b/file.c	2008-02-06 16:46:23.000000000 -0500
    @@ -37,6 +37,7 @@
     #include "ordered-data.h"
     #include "ioctl.h"
     #include "print-tree.h"
    +#include "compat.h"
    
     static int btrfs_copy_from_user(loff_t pos, int num_pages, int write_bytes,
    @@ -790,7 +791,11 @@ static ssize_t btrfs_file_write(struct f
     		goto out_nolock;
     	if (count == 0)
     		goto out_nolock;
    +#ifdef REMOVE_SUID_PATH
    +	err = remove_suid(&file->f_path);
    +#else
     	err = remove_suid(fdentry(file));
    +#endif
     	if (err)
     		goto out_nolock;
     	file_update_time(file);
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    12fa8ec6
file.c 27.9 KB