[01/29] xattr: make the xattr array itself const

Message ID 20230930050033.41174-2-wedsonaf@gmail.com
State New
Headers
Series const xattr tables |

Commit Message

Wedson Almeida Filho Sept. 30, 2023, 5 a.m. UTC
  From: Wedson Almeida Filho <walmeida@microsoft.com>

As it is currently declared, the xattr_handler structs are const but the
array containing their pointers is not. This patch makes it so that fs
modules can place them in .rodata, which makes it harder for
accidental/malicious modifications at runtime.

Signed-off-by: Wedson Almeida Filho <walmeida@microsoft.com>
---
 fs/xattr.c         | 6 +++---
 include/linux/fs.h | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)
  

Comments

Thomas Weißschuh Oct. 2, 2023, 9:58 a.m. UTC | #1
On 2023-09-30 02:00:05-0300, Wedson Almeida Filho wrote:
> From: Wedson Almeida Filho <walmeida@microsoft.com>
> 
> As it is currently declared, the xattr_handler structs are const but the
> array containing their pointers is not. This patch makes it so that fs
> modules can place them in .rodata, which makes it harder for
> accidental/malicious modifications at runtime.

You could also add an entry to scripts/const_structs.checkpatch to make
sure newly introduced usages of the struct are const.

Could be a single dedicated patch after this patch has been applied.

> Signed-off-by: Wedson Almeida Filho <walmeida@microsoft.com>
> ---
>  fs/xattr.c         | 6 +++---
>  include/linux/fs.h | 2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/xattr.c b/fs/xattr.c
> index e7bbb7f57557..1905f8ede13d 100644
> --- a/fs/xattr.c
> +++ b/fs/xattr.c
> @@ -56,7 +56,7 @@ strcmp_prefix(const char *a, const char *a_prefix)
>  static const struct xattr_handler *
>  xattr_resolve_name(struct inode *inode, const char **name)
>  {
> -	const struct xattr_handler **handlers = inode->i_sb->s_xattr;
> +	const struct xattr_handler * const *handlers = inode->i_sb->s_xattr;
>  	const struct xattr_handler *handler;
>  
>  	if (!(inode->i_opflags & IOP_XATTR)) {
> @@ -162,7 +162,7 @@ xattr_permission(struct mnt_idmap *idmap, struct inode *inode,
>  int
>  xattr_supports_user_prefix(struct inode *inode)
>  {
> -	const struct xattr_handler **handlers = inode->i_sb->s_xattr;
> +	const struct xattr_handler * const *handlers = inode->i_sb->s_xattr;
>  	const struct xattr_handler *handler;
>  
>  	if (!(inode->i_opflags & IOP_XATTR)) {
> @@ -999,7 +999,7 @@ int xattr_list_one(char **buffer, ssize_t *remaining_size, const char *name)
>  ssize_t
>  generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
>  {
> -	const struct xattr_handler *handler, **handlers = dentry->d_sb->s_xattr;
> +	const struct xattr_handler *handler, * const *handlers = dentry->d_sb->s_xattr;
>  	ssize_t remaining_size = buffer_size;
>  	int err = 0;
>  
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 562f2623c9c9..4d8003f48216 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1172,7 +1172,7 @@ struct super_block {
>  #ifdef CONFIG_SECURITY
>  	void                    *s_security;
>  #endif
> -	const struct xattr_handler **s_xattr;
> +	const struct xattr_handler * const *s_xattr;
>  #ifdef CONFIG_FS_ENCRYPTION
>  	const struct fscrypt_operations	*s_cop;
>  	struct fscrypt_keyring	*s_master_keys; /* master crypto keys in use */
> -- 
> 2.34.1
>
  

Patch

diff --git a/fs/xattr.c b/fs/xattr.c
index e7bbb7f57557..1905f8ede13d 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -56,7 +56,7 @@  strcmp_prefix(const char *a, const char *a_prefix)
 static const struct xattr_handler *
 xattr_resolve_name(struct inode *inode, const char **name)
 {
-	const struct xattr_handler **handlers = inode->i_sb->s_xattr;
+	const struct xattr_handler * const *handlers = inode->i_sb->s_xattr;
 	const struct xattr_handler *handler;
 
 	if (!(inode->i_opflags & IOP_XATTR)) {
@@ -162,7 +162,7 @@  xattr_permission(struct mnt_idmap *idmap, struct inode *inode,
 int
 xattr_supports_user_prefix(struct inode *inode)
 {
-	const struct xattr_handler **handlers = inode->i_sb->s_xattr;
+	const struct xattr_handler * const *handlers = inode->i_sb->s_xattr;
 	const struct xattr_handler *handler;
 
 	if (!(inode->i_opflags & IOP_XATTR)) {
@@ -999,7 +999,7 @@  int xattr_list_one(char **buffer, ssize_t *remaining_size, const char *name)
 ssize_t
 generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
 {
-	const struct xattr_handler *handler, **handlers = dentry->d_sb->s_xattr;
+	const struct xattr_handler *handler, * const *handlers = dentry->d_sb->s_xattr;
 	ssize_t remaining_size = buffer_size;
 	int err = 0;
 
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 562f2623c9c9..4d8003f48216 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1172,7 +1172,7 @@  struct super_block {
 #ifdef CONFIG_SECURITY
 	void                    *s_security;
 #endif
-	const struct xattr_handler **s_xattr;
+	const struct xattr_handler * const *s_xattr;
 #ifdef CONFIG_FS_ENCRYPTION
 	const struct fscrypt_operations	*s_cop;
 	struct fscrypt_keyring	*s_master_keys; /* master crypto keys in use */