fs: Make unload_nls() NULL pointer safe
Subsystems (7)
PATCH 1/1 fs: Make unload_nls() NULL pointer safe
Most call sites of unload_nls() do:
if (nls) unload_nls(nls);
Check the pointer inside unload_nls() like we do in kfree() and simplify the call sites.
Signed-off-by Thomas Gleixner <[email protected]>
Cc Steve French <[email protected]>
Cc OGAWA Hirofumi <[email protected]>
Cc Roman Zippel <[email protected]>
Cc Dave Kleikamp <[email protected]>
Cc Petr Vandrovec <[email protected]>
Cc Anton Altaparmakov <[email protected]>
--- fs/befs/linuxvfs.c | 7 +------ fs/cifs/cifsfs.c | 3 +-- fs/fat/inode.c | 16 ++++------------ fs/hfs/mdb.c | 6 ++---- fs/hfsplus/super.c | 6 ++---- fs/isofs/inode.c | 8 ++------ fs/jfs/super.c | 9 +++------ fs/ncpfs/inode.c | 12 ++---------- fs/ncpfs/ioctl.c | 6 ++---- fs/nls/nls_base.c | 3 ++- fs/ntfs/super.c | 10 ++++------ fs/smbfs/inode.c | 10 ++-------- 12 files changed, 27 insertions(+), 69 deletions(-)
fs/befs/linuxvfs.c +1 -6
@@ -737,12 +737,7 @@ befs_put_super(struct super_block *sb) {kfree (BEFS_SB (sb)->mount_opts.iocharset);BEFS_SB (sb)->mount_opts.iocharset =NULL ; - -if (BEFS_SB (sb)->nls) { -unload_nls (BEFS_SB (sb)->nls); -BEFS_SB (sb)->nls =NULL ; - } - +unload_nls (BEFS_SB (sb)->nls);kfree (sb->s_fs_info); sb->s_fs_info =NULL ; }
fs/cifs/cifsfs.c +1 -2
@@ -185,8 +185,7 @@ out_mount_failed: cifs_sb->mountdata = NULL; }#endif -if (cifs_sb->local_nls) -unload_nls (cifs_sb->local_nls); +unload_nls (cifs_sb->local_nls);kfree (cifs_sb); }return rc;
fs/fat/inode.c +4 -12
@@ -470,19 +470,11 @@ static void fat_put_super(struct super_biput (sbi->fat_inode); -if (sbi->nls_disk) { -unload_nls (sbi->nls_disk); - sbi->nls_disk =NULL ; - sbi->options.codepage = fat_default_codepage; - } -if (sbi->nls_io) { -unload_nls (sbi->nls_io); - sbi->nls_io =NULL ; - } -if (sbi->options.iocharset != fat_default_iocharset) { +unload_nls (sbi->nls_disk); +unload_nls (sbi->nls_io); + +if (sbi->options.iocharset != fat_default_iocharset)kfree (sbi->options.iocharset); - sbi->options.iocharset = fat_default_iocharset; - } sb->s_fs_info =NULL ;kfree (sbi);
fs/hfs/mdb.c +2 -4
@@ -344,10 +344,8 @@ void hfs_mdb_put(struct super_block *sb)brelse (HFS_SB (sb)->mdb_bh);brelse (HFS_SB (sb)->alt_mdb_bh); -if (HFS_SB (sb)->nls_io) -unload_nls (HFS_SB (sb)->nls_io); -if (HFS_SB (sb)->nls_disk) -unload_nls (HFS_SB (sb)->nls_disk); +unload_nls (HFS_SB (sb)->nls_io); +unload_nls (HFS_SB (sb)->nls_disk);free_pages ((unsigned long )HFS_SB (sb)->bitmap,PAGE_SIZE <8192 ?1 :0 );kfree (HFS_SB (sb));
fs/hfsplus/super.c +2 -4
@@ -229,8 +229,7 @@ static void hfsplus_put_super(struct supiput (HFSPLUS_SB (sb).alloc_file);iput (HFSPLUS_SB (sb).hidden_dir);brelse (HFSPLUS_SB (sb).s_vhbh); -if (HFSPLUS_SB (sb).nls) -unload_nls (HFSPLUS_SB (sb).nls); +unload_nls (HFSPLUS_SB (sb).nls);kfree (sb->s_fs_info); sb->s_fs_info =NULL ;
@@ -464,8 +463,7 @@ out: cleanup:hfsplus_put_super (sb); -if (nls) -unload_nls (nls); +unload_nls (nls);return err; }
fs/isofs/inode.c +2 -6
@@ -46,10 +46,7 @@ static void isofs_put_super(struct super#ifdef CONFIG_JOLIET lock_kernel (); -if (sbi->s_nls_iocharset) { -unload_nls (sbi->s_nls_iocharset); - sbi->s_nls_iocharset =NULL ; - } +unload_nls (sbi->s_nls_iocharset);unlock_kernel ();#endif
@@ -912,8 +909,7 @@ out_no_root:printk (KERN_WARNING "%s: get root inode failed\n" , __func__); out_no_inode:#ifdef CONFIG_JOLIET -if (sbi->s_nls_iocharset) -unload_nls (sbi->s_nls_iocharset); +unload_nls (sbi->s_nls_iocharset);#endif goto out_freesbi; out_no_read:
fs/jfs/super.c +3 -6
@@ -178,13 +178,11 @@ static void jfs_put_super(struct super_b rc =jfs_umount (sb);if (rc)jfs_err ("jfs_umount failed with return code %d" , rc); -if (sbi->nls_tab) -unload_nls (sbi->nls_tab); - sbi->nls_tab =NULL ; + +unload_nls (sbi->nls_tab);truncate_inode_pages (sbi->direct_inode->i_mapping,0 );iput (sbi->direct_inode); - sbi->direct_inode =NULL ;kfree (sbi);
@@ -347,8 +345,7 @@ static int parse_options(char *options,if (nls_map != (void *)-1 ) {/* Discard old (if remount) */ -if (sbi->nls_tab) -unload_nls (sbi->nls_tab); +unload_nls (sbi->nls_tab); sbi->nls_tab = nls_map; }return 1 ;
fs/ncpfs/inode.c +2 -10
@@ -746,16 +746,8 @@ static void ncp_put_super(struct super_b#ifdef CONFIG_NCPFS_NLS /* unload the NLS charsets */ -if (server->nls_vol) - { -unload_nls (server->nls_vol); - server->nls_vol =NULL ; - } -if (server->nls_io) - { -unload_nls (server->nls_io); - server->nls_io =NULL ; - } +unload_nls (server->nls_vol); +unload_nls (server->nls_io);#endif /* CONFIG_NCPFS_NLS */ if (server->info_filp)
fs/ncpfs/ioctl.c +2 -4
@@ -223,10 +223,8 @@ ncp_set_charsets(struct ncp_server* serv oldset_io = server->nls_io; server->nls_io = iocharset; -if (oldset_cp) -unload_nls (oldset_cp); -if (oldset_io) -unload_nls (oldset_io); +unload_nls (oldset_cp); +unload_nls (oldset_io);return 0 ; }
fs/nls/nls_base.c +2 -1
@@ -270,7 +270,8 @@ struct nls_table *load_nls(char *charsetvoid unload_nls (struct nls_table *nls) { -module_put (nls->owner); +if (nls) +module_put (nls->owner); }static const wchar_t charset2uni[256 ] = {
fs/ntfs/super.c +4 -6
@@ -201,8 +201,7 @@ use_utf8: v, old_nls->charset); nls_map = old_nls; }else /* nls_map */ { -if (old_nls) -unload_nls (old_nls); +unload_nls (old_nls); } }else if (!strcmp (p,"utf8" )) {bool val = false;
@@ -2427,10 +2426,9 @@ static void ntfs_put_super(struct super_ntfs_free (vol->upcase); vol->upcase =NULL ; } -if (vol->nls_map) { -unload_nls (vol->nls_map); - vol->nls_map =NULL ; - } + +unload_nls (vol->nls_map); + sb->s_fs_info =NULL ;kfree (vol);
fs/smbfs/inode.c +2 -8
@@ -459,14 +459,8 @@ smb_show_options(struct seq_file *s, strstatic void smb_unload_nls (struct smb_sb_info *server) { -if (server->remote_nls) { -unload_nls (server->remote_nls); - server->remote_nls =NULL ; - } -if (server->local_nls) { -unload_nls (server->local_nls); - server->local_nls =NULL ; - } +unload_nls (server->remote_nls); +unload_nls (server->local_nls); } static void
Quoted 5 lines · Thomas Gleixner
plain text document attachment (unload_nls.patch)
Most call sites ofunload_nls()do:if (nls) unload_nls(nls);
Quoted 7 lines
Check the pointer inside
unload_nls()like we do inkfree()and simplify the call sites.Signed-off-by Thomas Gleixner <[email protected]>Cc Steve French <[email protected]>Cc OGAWA Hirofumi <[email protected]>Cc Roman Zippel <[email protected]>
Acked-by Dave Kleikamp <[email protected]>
Quoted 17 lines
Cc Petr Vandrovec <[email protected]>Cc Anton Altaparmakov <[email protected]>--- fs/befs/linuxvfs.c | 7 +------ fs/cifs/cifsfs.c | 3 +-- fs/fat/inode.c | 16 ++++------------ fs/hfs/mdb.c | 6 ++---- fs/hfsplus/super.c | 6 ++---- fs/isofs/inode.c | 8 ++------ fs/jfs/super.c | 9 +++------ fs/ncpfs/inode.c | 12 ++---------- fs/ncpfs/ioctl.c | 6 ++---- fs/nls/nls_base.c | 3 ++- fs/ntfs/super.c | 10 ++++------ fs/smbfs/inode.c | 10 ++-------- 12 files changed, 27 insertions(+), 69 deletions(-)
Signature · 2 lines
David Kleikamp IBM Linux Technology Center