Thread (4 messages) 4 messages, 2 authors, 2014-10-21

Re: dm raid: pointer math issue in super_sync()

From: Mike Snitzer <hidden>
Date: 2014-10-21 13:25:19
Also in: dm-devel, kernel-janitors

On Tue, Oct 21 2014 at  8:57am -0400,
Dan Carpenter [off-list ref] wrote:
On Tue, Oct 21, 2014 at 08:48:26AM -0400, Mike Snitzer wrote:
quoted
quoted
-	memset(sb + sizeof(*sb), 0, rdev->sb_size - sizeof(*sb));
+	memset(sb + 1, 0, rdev->sb_size - sizeof(*sb));
 
 	sb->magic = cpu_to_le32(DM_RAID_MAGIC);
 	sb->features = cpu_to_le32(0);	/* No features yet */
Not following... sizeof(*sb) != sizeof(sb).  So I'm not seeing a
problem.

Nor am I seeing how you think sb + 1 is equivalent to what Heinz
intended (zero the memory following the sizeof(struct dm_raid_superblock)).
It's pointer math.
Yes, I see that now..
sizeof(*sb) is 512.

"sb + sizeof(*sb)" is the same as (void *)sb + 512 * 512.
"sb + 1" is the same as (void *)sb + 512.
Actually, Heinz removed the 452 bytes of padding from struct
dm_raid_superblock, so it is more like:

sizeof(*sb) == sizeof(struct dm_raid_super_block) == 60

"sb + sizeof(*sb)" is the same as (void *)sb + 60 * 60
"sb + 1" is the same as (void *)sb + 60.

But regardless, your broader point on the math stands.  I'll get this
fixed up, thanks!

Mike
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help