#define NVIDIA_SUPERBLOCK_SIZE 120
-static int nvraid_verify_checksum(blkid_probe pr, const struct nv_metadata *nv)
+static int nvraid_verify_checksum(blkid_probe pr, const struct nv_metadata *nv,
+ size_t bufsiz)
{
uint32_t csum = le32_to_cpu(nv->chksum);
- for (size_t i = 0; i < le32_to_cpu(nv->size); i++)
+ uint32_t count = le32_to_cpu(nv->size);
+
+ if (count > bufsiz / sizeof(uint32_t))
+ return 0;
+
+ for (size_t i = 0; i < count; i++)
csum += le32_to_cpu(((uint32_t *) nv)[i]);
return blkid_probe_verify_csum(pr, csum, le32_to_cpu(nv->chksum));
}
if (memcmp(nv->vendor, NVIDIA_SIGNATURE, sizeof(NVIDIA_SIGNATURE)-1) != 0)
return 1;
- if (le32_to_cpu(nv->size) * 4 != NVIDIA_SUPERBLOCK_SIZE)
+ if (le32_to_cpu(nv->size) != NVIDIA_SUPERBLOCK_SIZE / 4)
return 1;
- if (!nvraid_verify_checksum(pr, nv))
+ if (!nvraid_verify_checksum(pr, nv, NVIDIA_SUPERBLOCK_SIZE))
return 1;
if (blkid_probe_sprintf_version(pr, "%u", le16_to_cpu(nv->version)) != 0)
return 1;