]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fs: ubifs: Set pointers to NULL after free
authorAlexander Dahl <ada@thorsis.com>
Wed, 3 Jul 2024 10:12:56 +0000 (12:12 +0200)
committerHeiko Schocher <hs@denx.de>
Sat, 10 Aug 2024 09:54:10 +0000 (11:54 +0200)
Global superblock pointer 'ubifs_sb' and volume pointer 'ubi' of type
struct ubi_volume_desc in private member sb->s_fs_info of type struct
ubifs_info, can be allocated and freed at runtime, and allocated and
freed again, depending which console or script commands are run.  In
some cases ubifs_sb is even tested to determine if the filesystem is
mounted.  Reset those pointers to NULL after free to clearly mark them
as not valid.  This avoids potential double free on invalid pointers.

(The ubifs_sb pointer was already reset, but that statement was moved
now to directly after the free() to make it easier to understand.)

Signed-off-by: Alexander Dahl <ada@thorsis.com>
fs/ubifs/super.c
fs/ubifs/ubifs.c

index d8d78a2d3d60fc841a7e5f38f50c72c8cac78b0a..bbbbeb5ee17337141838e3aaddf95bd8a152c9a1 100644 (file)
@@ -1758,11 +1758,13 @@ void ubifs_umount(struct ubifs_info *c)
        ubifs_debugging_exit(c);
 #ifdef __UBOOT__
        ubi_close_volume(c->ubi);
+       c->ubi = NULL;
        mutex_unlock(&c->umount_mutex);
        /* Finally free U-Boot's global copy of superblock */
        if (ubifs_sb != NULL) {
                free(ubifs_sb->s_fs_info);
                free(ubifs_sb);
+               ubifs_sb = NULL;
        }
 #endif
 }
@@ -2061,6 +2063,7 @@ static void ubifs_put_super(struct super_block *sb)
 #ifndef __UBOOT__
        bdi_destroy(&c->bdi);
        ubi_close_volume(c->ubi);
+       c->ubi = NULL;
        mutex_unlock(&c->umount_mutex);
 #endif
 }
@@ -2340,6 +2343,7 @@ out_bdi:
 out_close:
 #endif
        ubi_close_volume(c->ubi);
+       c->ubi = NULL;
 out:
        return err;
 }
index 61ae5580e6215378c03fc137fcfd44af89bf7760..6ed9318f7398dc1c4a0acef7ff19ca15573081d1 100644 (file)
@@ -976,6 +976,5 @@ void uboot_ubifs_umount(void)
                printf("Unmounting UBIFS volume %s!\n",
                       ((struct ubifs_info *)(ubifs_sb->s_fs_info))->vi.name);
                ubifs_umount(ubifs_sb->s_fs_info);
-               ubifs_sb = NULL;
        }
 }