btrfs-progs: treat super.magic as an le64

The super block magic is a le64 whose value looks like an unterminated
string in memory.  The lack of null termination leads to clumsy use of
string functions and causes static analysis tools to warn that the
string will be unterminated.

So let's just treat it as the le64 that it is.  Endian wrappers are used
on the constant so that they're compiled into run-time constants.

Signed-off-by: Zach Brown <zab@redhat.com>
This commit is contained in:
Zach Brown 2013-01-17 11:54:47 -08:00
parent 2161e1b6f3
commit 52162700bb
4 changed files with 6 additions and 9 deletions

View File

@ -187,7 +187,7 @@ static void dump_superblock(struct btrfs_super_block *sb)
s = (char *) &sb->magic;
for (i = 0; i < 8; i++)
putchar(isprint(s[i]) ? s[i] : '.');
if (!memcmp(BTRFS_MAGIC, &sb->magic, 8))
if (sb->magic == cpu_to_le64(BTRFS_MAGIC))
printf(" [match]\n");
else
printf(" [DON'T MATCH]\n");

View File

@ -28,7 +28,7 @@
struct btrfs_root;
struct btrfs_trans_handle;
#define BTRFS_MAGIC "_BHRfS_M"
#define BTRFS_MAGIC 0x4D5F53665248425F /* ascii _BHRfS_M, no null */
#define BTRFS_MAX_LEVEL 8

View File

@ -932,8 +932,7 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr)
return -1;
if (btrfs_super_bytenr(&buf) != sb_bytenr ||
strncmp((char *)(&buf.magic), BTRFS_MAGIC,
sizeof(buf.magic)))
buf.magic != cpu_to_le64(BTRFS_MAGIC))
return -1;
memcpy(sb, &buf, sizeof(*sb));
@ -951,8 +950,7 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr)
/* if magic is NULL, the device was removed */
if (buf.magic == 0 && i == 0)
return -1;
if (strncmp((char *)(&buf.magic), BTRFS_MAGIC,
sizeof(buf.magic)))
if (buf.magic != cpu_to_le64(BTRFS_MAGIC))
continue;
if (!fsid_is_initialized) {

View File

@ -112,7 +112,7 @@ int make_btrfs(int fd, const char *device, const char *label,
btrfs_set_super_bytenr(&super, blocks[0]);
btrfs_set_super_num_devices(&super, 1);
strncpy((char *)&super.magic, BTRFS_MAGIC, sizeof(super.magic));
super.magic = cpu_to_le64(BTRFS_MAGIC);
btrfs_set_super_generation(&super, 1);
btrfs_set_super_root(&super, blocks[1]);
btrfs_set_super_chunk_root(&super, blocks[3]);
@ -1085,8 +1085,7 @@ int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
ret = 0;
disk_super = (struct btrfs_super_block *)buf;
if (strncmp((char *)(&disk_super->magic), BTRFS_MAGIC,
sizeof(disk_super->magic)))
if (disk_super->magic != cpu_to_le64(BTRFS_MAGIC))
goto brelse;
if (!memcmp(disk_super->fsid, root->fs_info->super_copy.fsid,