summaryrefslogtreecommitdiffstats
path: root/libs/blkid
diff options
context:
space:
mode:
authorKarel Zak2009-01-22 01:15:02 +0100
committerKarel Zak2009-02-11 23:35:23 +0100
commit50469b780e75448a05001aad211c58103bdd0406 (patch)
treecea331612eb6c0de82e5d3ed6f18161ca1ebebfd /libs/blkid
parentblkid: set size for non-blkdevs, add blkid_probe_strcpy_uuid() (diff)
downloadkernel-qcow2-util-linux-50469b780e75448a05001aad211c58103bdd0406.tar.gz
kernel-qcow2-util-linux-50469b780e75448a05001aad211c58103bdd0406.tar.xz
kernel-qcow2-util-linux-50469b780e75448a05001aad211c58103bdd0406.zip
blkid: improve ddf detection
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libs/blkid')
-rw-r--r--libs/blkid/src/probers/ddf_raid.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/libs/blkid/src/probers/ddf_raid.c b/libs/blkid/src/probers/ddf_raid.c
index 1e82281fa..41d6e1235 100644
--- a/libs/blkid/src/probers/ddf_raid.c
+++ b/libs/blkid/src/probers/ddf_raid.c
@@ -16,38 +16,50 @@
#include "blkidP.h"
/* http://www.snia.org/standards/home */
-#define DDF_HEADER 0xDE11DE11
#define DDF_GUID_LENGTH 24
#define DDF_REV_LENGTH 8
struct ddf_header {
- uint32_t signature;
+ uint8_t signature[4];
uint32_t crc;
uint8_t guid[DDF_GUID_LENGTH];
uint8_t ddf_rev[DDF_REV_LENGTH];
-};
+} __attribute__((packed));
static int probe_ddf(blkid_probe pr, const struct blkid_idmag *mag)
{
- uint64_t off;
- struct ddf_header *ddf;
+ int hdrs[] = { 1, 257 };
+ int i;
+ struct ddf_header *ddf = NULL;
+ char version[DDF_REV_LENGTH + 1];
- if (pr->size < 0x10000)
+ if (pr->size < 0x30000)
return -1;
- off = ((pr->size / 0x200) - 1) * 0x200;
- ddf = (struct ddf_header *)
- blkid_probe_get_buffer(pr,
+ for (i = 0; i < ARRAY_SIZE(hdrs); i++) {
+ uint64_t off = ((pr->size / 0x200) - hdrs[i]) * 0x200;
+
+ ddf = (struct ddf_header *) blkid_probe_get_buffer(pr,
off,
sizeof(struct ddf_header));
+ if (!ddf)
+ return -1;
+
+ if (memcmp(ddf->signature, "\x11\xde\x11\xde", 4) == 0 ||
+ memcmp(ddf->signature, "\xde\x11\xde\x11", 4) == 0)
+ break;
+ ddf = NULL;
+ }
+
if (!ddf)
return -1;
- if (ddf->signature != cpu_to_be32(DDF_HEADER))
- return -1;
- if (blkid_probe_sprintf_uuid(pr, ddf->guid,
- sizeof(ddf->guid), "%s", ddf->guid) != 0)
- return -1;
- if (blkid_probe_set_version(pr, (char *) ddf->ddf_rev) != 0)
+
+ blkid_probe_strncpy_uuid(pr, ddf->guid, sizeof(ddf->guid));
+
+ memcpy(version, ddf->ddf_rev, sizeof(ddf->ddf_rev));
+ *(version + sizeof(ddf->ddf_rev)) = '\0';
+
+ if (blkid_probe_set_version(pr, version) != 0)
return -1;
return 0;
}