On Thu, Jun 23, 2016 at 13:29:02 -0400, John Ferlan wrote:
The version field historically has been a 4 byte data; however, an
upcoming
new type will use a 2 byte version. So let's adjust for that now.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/util/virstoragefile.c | 60 +++++++++++++++++++++++++++++------------------
1 file changed, 37 insertions(+), 23 deletions(-)
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index de4955b..37e9798 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1,7 +1,7 @@
/*
* virstoragefile.c: file utility functions for FS storage backend
*
- * Copyright (C) 2007-2014 Red Hat, Inc.
+ * Copyright (C) 2007-2014, 2016 Red Hat, Inc.
* Copyright (C) 2007-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -120,10 +120,12 @@ struct FileTypeInfo {
* to check at head of file */
const char *extension; /* Optional file extension to check */
enum lv_endian endian; /* Endianness of file format */
+
int versionOffset; /* Byte offset from start of file
* where we find version number,
* -1 to always fail the version test,
* -2 to always pass the version test */
+ int versionSize; /* Size in bytes of version data (0, 2, or 4) */
If the size is 0 ...
int versionNumbers[FILE_TYPE_VERSIONS_LAST];
/* Version numbers to validate. Zeroes are ignored. */
int sizeOffset; /* Byte offset from start of file
[...]
@@ -635,13 +637,25 @@ virStorageFileMatchesVersion(int format,
if (fileTypeInfo[format].versionOffset == -2)
return true;
- if ((fileTypeInfo[format].versionOffset + 4) > buflen)
+ if ((fileTypeInfo[format].versionOffset +
+ fileTypeInfo[format].versionSize) > buflen)
return false;
- if (fileTypeInfo[format].endian == LV_LITTLE_ENDIAN)
- version = virReadBufInt32LE(buf + fileTypeInfo[format].versionOffset);
- else
- version = virReadBufInt32BE(buf + fileTypeInfo[format].versionOffset);
+ if (fileTypeInfo[format].endian == LV_LITTLE_ENDIAN) {
... code below shouldn't be executed at all.
+ if (fileTypeInfo[format].versionSize == 4)
+ version = virReadBufInt32LE(buf +
+ fileTypeInfo[format].versionOffset);
+ else
+ version = virReadBufInt16LE(buf +
+ fileTypeInfo[format].versionOffset);
+ } else {
+ if (fileTypeInfo[format].versionSize == 4)
+ version = virReadBufInt32BE(buf +
+ fileTypeInfo[format].versionOffset);
+ else
+ version = virReadBufInt16BE(buf +
+ fileTypeInfo[format].versionOffset);
+ }
ACK with the change.