[libvirt] [PATCH v2 06/15] util: Modify the FileTypeInfo to add a version size
John Ferlan
jferlan at redhat.com
Fri Jun 24 14:50:01 UTC 2016
On 06/24/2016 09:28 AM, Peter Krempa wrote:
> 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 at 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;
So you would like to see:
if (fileTypeInfo[format].versionSize == 0)
return false;
>>
>> - 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.
>
It wouldn't be because for all size = 0, the versionOffset == -1 or -2
we will have returned false much sooner.
I *did* have a check at one time for size == 0, then return false, but
took it out. I can replace it though
>> + 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.
>
More information about the libvir-list
mailing list