From: Andreas Gruenbacher <agruen@suse.de>
64-bit pointer arithmetic bug in xattr code
The int offset is not enought to hold the difference between arbitraty
pointers on 64-bit machines. Compute the offset of here and last inside
HDR(bh) instead.
goto cleanup;
memcpy(header, HDR(bh), bh->b_size);
header->h_refcount = cpu_to_le32(1);
- offset = (char *)header - bh->b_data;
- here = ENTRY((char *)here + offset);
- last = ENTRY((char *)last + offset);
+
+ offset = (char *)here - bh->b_data;
+ here = ENTRY((char *)header + offset);
+ offset = (char *)last - bh->b_data;
+ last = ENTRY((char *)header + offset);
}
} else {
/* Allocate a buffer where we construct the new block. */
goto cleanup;
memcpy(header, HDR(bh), bh->b_size);
header->h_refcount = cpu_to_le32(1);
- offset = (char *)header - bh->b_data;
- here = ENTRY((char *)here + offset);
- last = ENTRY((char *)last + offset);
+ offset = (char *)here - bh->b_data;
+ here = ENTRY((char *)header + offset);
+ offset = (char *)last - bh->b_data;
+ last = ENTRY((char *)header + offset);
}
} else {
/* Allocate a buffer where we construct the new block. */