mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
volume_id: add checksum check to via_raid
This commit is contained in:
parent
f2f957c394
commit
2658afdcf1
@ -13,7 +13,7 @@ INSTALL_DATA = ${INSTALL} -m 644
|
||||
INSTALL_LIB = ${INSTALL} -m 755
|
||||
|
||||
SHLIB_CUR = 0
|
||||
SHLIB_REV = 72
|
||||
SHLIB_REV = 73
|
||||
SHLIB_AGE = 0
|
||||
SHLIB = libvolume_id.so.$(SHLIB_CUR).$(SHLIB_REV).$(SHLIB_AGE)
|
||||
|
||||
|
@ -3,6 +3,9 @@
|
||||
*
|
||||
* Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
|
||||
*
|
||||
* Based on information taken from dmraid:
|
||||
* Copyright (C) 2004-2006 Heinz Mauelshagen, Red Hat GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation version 2 of the License.
|
||||
@ -30,7 +33,7 @@ struct via_meta {
|
||||
uint16_t signature;
|
||||
uint8_t version_number;
|
||||
struct via_array {
|
||||
uint16_t disk_bits;
|
||||
uint16_t disk_bit_mask;
|
||||
uint8_t disk_array_ex;
|
||||
uint32_t capacity_low;
|
||||
uint32_t capacity_high;
|
||||
@ -42,6 +45,18 @@ struct via_meta {
|
||||
|
||||
#define VIA_SIGNATURE 0xAA55
|
||||
|
||||
/* 8 bit checksum on first 50 bytes of metadata. */
|
||||
static uint8_t meta_checksum(struct via_meta *via)
|
||||
{
|
||||
uint8_t i = 50, sum = 0;
|
||||
|
||||
while (i--)
|
||||
sum += ((uint8_t*) via)[i];
|
||||
|
||||
return sum == via->checksum;
|
||||
}
|
||||
|
||||
|
||||
int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size)
|
||||
{
|
||||
const uint8_t *buf;
|
||||
@ -67,6 +82,9 @@ int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size)
|
||||
if (via->version_number > 1)
|
||||
return -1;
|
||||
|
||||
if (!meta_checksum(via))
|
||||
return -1;
|
||||
|
||||
volume_id_set_usage(id, VOLUME_ID_RAID);
|
||||
snprintf(id->type_version, sizeof(id->type_version)-1, "%u", via->version_number);
|
||||
id->type = "via_raid_member";
|
||||
|
Loading…
Reference in New Issue
Block a user