btrfs-progs: use alloc_dummy_extent_buffer() for temporary super block

[FALSE ALERT]
There is a false alert when compiling btrfs-progs using gcc 12.2.1:

  $ make D=1
  kernel-shared/print-tree.c: In function 'print_sys_chunk_array':
  kernel-shared/print-tree.c:1797:9: warning: 'buf' may be used uninitialized [-Wmaybe-uninitialized]
   1797 |         write_extent_buffer(buf, sb, 0, sizeof(*sb));
        |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  In file included from ./kernel-shared/ctree.h:27,
                   from kernel-shared/print-tree.c:24:
  ./kernel-shared/extent_io.h:148:6: note: by argument 1 of type 'const struct extent_buffer *' to 'write_extent_buffer' declared here
    148 | void write_extent_buffer(const struct extent_buffer *eb, const void *src,
        |      ^~~~~~~~~~~~~~~~~~~

[CAUSE]
This is a false alert, the uninitialized part of buf will not be
utilized at all during write_extent_buffer().

[FIX]
Instead of allocating such ad-hoc buffer, go a more formal way by
calling alloc_dummy_extent_buffer(), which would properly set all
the members.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2023-03-18 08:18:42 +08:00 committed by David Sterba
parent 788e30f7ea
commit 6c7a6dba95
1 changed files with 3 additions and 3 deletions

View File

@ -1789,7 +1789,7 @@ static void print_sys_chunk_array(struct btrfs_super_block *sb)
struct btrfs_key key; struct btrfs_key key;
int item; int item;
buf = malloc(sizeof(*buf) + sizeof(*sb)); buf = alloc_dummy_extent_buffer(NULL, 0, BTRFS_SUPER_INFO_SIZE);
if (!buf) { if (!buf) {
error_msg(ERROR_MSG_MEMORY, NULL); error_msg(ERROR_MSG_MEMORY, NULL);
return; return;
@ -1860,13 +1860,13 @@ static void print_sys_chunk_array(struct btrfs_super_block *sb)
} }
out: out:
free(buf); free_extent_buffer(buf);
return; return;
out_short_read: out_short_read:
error("sys_array too short to read %u bytes at offset %u", error("sys_array too short to read %u bytes at offset %u",
len, cur_offset); len, cur_offset);
free(buf); free_extent_buffer(buf);
} }
static int empty_backup(struct btrfs_root_backup *backup) static int empty_backup(struct btrfs_root_backup *backup)