[Libvir] PATCH: 11/16: directory/fs/netfs backend
Jim Meyering
jim at meyering.net
Fri Feb 15 20:37:53 UTC 2008
"Daniel P. Berrange" <berrange at redhat.com> wrote:
> diff -r 739490b4a2f6 src/storage_backend_fs.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/src/storage_backend_fs.c Thu Feb 07 13:44:25 2008 -0500
...
> + /* Optionally extract capacity from file */
> + if (fileTypeInfo[i].sizeOffset != -1) {
> + if (fileTypeInfo[i].endian == __LITTLE_ENDIAN) {
> + def->capacity =
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+7] << 56) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+6] << 48) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+5] << 40) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+4] << 32) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+3] << 24) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+2] << 16) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+1] << 8) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset]);
> + def->capacity *= fileTypeInfo[i].sizeMultiplier;
> + } else {
> + def->capacity =
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset] << 56) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+1] << 48) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+2] << 40) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+3] << 32) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+4] << 24) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+5] << 16) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+6] << 8) |
> + ((unsigned long long)head[fileTypeInfo[i].sizeOffset+7]);
> + def->capacity *= fileTypeInfo[i].sizeMultiplier;
> + }
> + }
> +
> + /* Validation passed, we know the file format now */
> + def->target.format = fileTypeInfo[i].type;
> + return 0;
> + }
Hi Dan,
It'd be good to pull the duplicate capacity update out of the
if- and else- blocks.
def->capacity *= ...
Also, just in case the file data is bogus enough to make the resulting
product overflow, you can detect that with e.g.,
if (def->capacity > ULLONG_MAX / fileTypeInfo[i].sizeMultiplier)
continue;
def->capacity *= fileTypeInfo[i].sizeMultiplier;
If the test fails, I'd be tempted to give a diagnostic
about the corrupt "size" data.
More information about the libvir-list
mailing list