|
@@ -27,6 +27,8 @@
|
|
#include <linux/pagemap.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/stringify.h>
|
|
#include <linux/stringify.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
|
|
+#include <linux/uuid.h>
|
|
|
|
+
|
|
#include "ldm.h"
|
|
#include "ldm.h"
|
|
#include "check.h"
|
|
#include "check.h"
|
|
#include "msdos.h"
|
|
#include "msdos.h"
|
|
@@ -65,60 +67,6 @@ void _ldm_printk(const char *level, const char *function, const char *fmt, ...)
|
|
va_end(args);
|
|
va_end(args);
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * ldm_parse_hexbyte - Convert a ASCII hex number to a byte
|
|
|
|
- * @src: Pointer to at least 2 characters to convert.
|
|
|
|
- *
|
|
|
|
- * Convert a two character ASCII hex string to a number.
|
|
|
|
- *
|
|
|
|
- * Return: 0-255 Success, the byte was parsed correctly
|
|
|
|
- * -1 Error, an invalid character was supplied
|
|
|
|
- */
|
|
|
|
-static int ldm_parse_hexbyte (const u8 *src)
|
|
|
|
-{
|
|
|
|
- unsigned int x; /* For correct wrapping */
|
|
|
|
- int h;
|
|
|
|
-
|
|
|
|
- /* high part */
|
|
|
|
- x = h = hex_to_bin(src[0]);
|
|
|
|
- if (h < 0)
|
|
|
|
- return -1;
|
|
|
|
-
|
|
|
|
- /* low part */
|
|
|
|
- h = hex_to_bin(src[1]);
|
|
|
|
- if (h < 0)
|
|
|
|
- return -1;
|
|
|
|
-
|
|
|
|
- return (x << 4) + h;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * ldm_parse_guid - Convert GUID from ASCII to binary
|
|
|
|
- * @src: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
|
|
|
|
- * @dest: Memory block to hold binary GUID (16 bytes)
|
|
|
|
- *
|
|
|
|
- * N.B. The GUID need not be NULL terminated.
|
|
|
|
- *
|
|
|
|
- * Return: 'true' @dest contains binary GUID
|
|
|
|
- * 'false' @dest contents are undefined
|
|
|
|
- */
|
|
|
|
-static bool ldm_parse_guid (const u8 *src, u8 *dest)
|
|
|
|
-{
|
|
|
|
- static const int size[] = { 4, 2, 2, 2, 6 };
|
|
|
|
- int i, j, v;
|
|
|
|
-
|
|
|
|
- if (src[8] != '-' || src[13] != '-' ||
|
|
|
|
- src[18] != '-' || src[23] != '-')
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- for (j = 0; j < 5; j++, src++)
|
|
|
|
- for (i = 0; i < size[j]; i++, src+=2, *dest++ = v)
|
|
|
|
- if ((v = ldm_parse_hexbyte (src)) < 0)
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* ldm_parse_privhead - Read the LDM Database PRIVHEAD structure
|
|
* ldm_parse_privhead - Read the LDM Database PRIVHEAD structure
|
|
* @data: Raw database PRIVHEAD structure loaded from the device
|
|
* @data: Raw database PRIVHEAD structure loaded from the device
|
|
@@ -167,7 +115,7 @@ static bool ldm_parse_privhead(const u8 *data, struct privhead *ph)
|
|
ldm_error("PRIVHEAD disk size doesn't match real disk size");
|
|
ldm_error("PRIVHEAD disk size doesn't match real disk size");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if (!ldm_parse_guid(data + 0x0030, ph->disk_id)) {
|
|
|
|
|
|
+ if (uuid_be_to_bin(data + 0x0030, (uuid_be *)ph->disk_id)) {
|
|
ldm_error("PRIVHEAD contains an invalid GUID.");
|
|
ldm_error("PRIVHEAD contains an invalid GUID.");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -944,7 +892,7 @@ static bool ldm_parse_dsk3 (const u8 *buffer, int buflen, struct vblk *vb)
|
|
disk = &vb->vblk.disk;
|
|
disk = &vb->vblk.disk;
|
|
ldm_get_vstr (buffer + 0x18 + r_diskid, disk->alt_name,
|
|
ldm_get_vstr (buffer + 0x18 + r_diskid, disk->alt_name,
|
|
sizeof (disk->alt_name));
|
|
sizeof (disk->alt_name));
|
|
- if (!ldm_parse_guid (buffer + 0x19 + r_name, disk->disk_id))
|
|
|
|
|
|
+ if (uuid_be_to_bin(buffer + 0x19 + r_name, (uuid_be *)disk->disk_id))
|
|
return false;
|
|
return false;
|
|
|
|
|
|
return true;
|
|
return true;
|