[PATCH 1/9] util: storagefile: Drop image format probing by file suffix

Peter Krempa pkrempa at redhat.com
Mon Feb 17 17:13:51 UTC 2020


Probing by file suffix was meant to be a last resort if probing by
contents fails or is not supported. For most formats we never specified
any suffix. There's a few formats implementing both magic bytes and
suffix and finally DMG which had only suffix probing. Since suffix
probing is nowhere reliable and only one format depends on in whic has a
comment that qemu doesn't do the probing either drop the whole
infrastructure.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/util/virstoragefile.c | 58 ++++++++++++---------------------------
 1 file changed, 17 insertions(+), 41 deletions(-)

diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 9347c7ab30..4d2e39246c 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -146,12 +146,10 @@ struct FileEncryptionInfo {
     int payloadOffset; /* start offset of the volume data (in 512 byte sectors) */
 };

-/* Either 'magic' or 'extension' *must* be provided */
 struct FileTypeInfo {
     int magicOffset;    /* Byte offset of the magic */
     const char *magic;  /* Optional string of file magic
                          * 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
@@ -297,17 +295,17 @@ static struct FileEncryptionInfo const qcow2EncryptionInfo[] = {
 };

 static struct FileTypeInfo const fileTypeInfo[] = {
-    [VIR_STORAGE_FILE_NONE] = { 0, NULL, NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_NONE] = { 0, NULL, LV_LITTLE_ENDIAN,
                                 -1, 0, {0}, 0, 0, 0, NULL, NULL, NULL },
-    [VIR_STORAGE_FILE_RAW] = { 0, NULL, NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_RAW] = { 0, NULL, LV_LITTLE_ENDIAN,
                                -1, 0, {0}, 0, 0, 0,
                                luksEncryptionInfo,
                                NULL, NULL },
-    [VIR_STORAGE_FILE_DIR] = { 0, NULL, NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_DIR] = { 0, NULL, LV_LITTLE_ENDIAN,
                                -1, 0, {0}, 0, 0, 0, NULL, NULL, NULL },
     [VIR_STORAGE_FILE_BOCHS] = {
         /*"Bochs Virtual HD Image", */ /* Untested */
-        0, NULL, NULL,
+        0, NULL,
         LV_LITTLE_ENDIAN, 64, 4, {0x20000},
         32+16+16+4+4+4+4+4, 8, 1, NULL, NULL, NULL
     },
@@ -316,7 +314,7 @@ static struct FileTypeInfo const fileTypeInfo[] = {
            #V2.0 Format
            modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1
         */ /* Untested */
-        0, NULL, NULL,
+        0, NULL,
         LV_LITTLE_ENDIAN, -1, 0, {0},
         -1, 0, 0, NULL, NULL, NULL
     },
@@ -324,50 +322,50 @@ static struct FileTypeInfo const fileTypeInfo[] = {
         /* XXX QEMU says there's no magic for dmg,
          * /usr/share/misc/magic lists double magic (both offsets
          * would have to match) but then disables that check. */
-        0, NULL, ".dmg",
+        0, NULL,
         0, -1, 0, {0},
         -1, 0, 0, NULL, NULL, NULL
     },
     [VIR_STORAGE_FILE_ISO] = {
-        32769, "CD001", ".iso",
+        32769, "CD001",
         LV_LITTLE_ENDIAN, -2, 0, {0},
         -1, 0, 0, NULL, NULL, NULL
     },
     [VIR_STORAGE_FILE_VPC] = {
-        0, "conectix", NULL,
+        0, "conectix",
         LV_BIG_ENDIAN, 12, 4, {0x10000},
         8 + 4 + 4 + 8 + 4 + 4 + 2 + 2 + 4, 8, 1, NULL, NULL, NULL
     },
     /* TODO: add getBackingStore function */
     [VIR_STORAGE_FILE_VDI] = {
-        64, "\x7f\x10\xda\xbe", ".vdi",
+        64, "\x7f\x10\xda\xbe",
         LV_LITTLE_ENDIAN, 68, 4, {0x00010001},
         64 + 5 * 4 + 256 + 7 * 4, 8, 1, NULL, NULL, NULL},

     /* Not direct file formats, but used for various drivers */
-    [VIR_STORAGE_FILE_FAT] = { 0, NULL, NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_FAT] = { 0, NULL, LV_LITTLE_ENDIAN,
                                -1, 0, {0}, 0, 0, 0, NULL, NULL, NULL },
-    [VIR_STORAGE_FILE_VHD] = { 0, NULL, NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_VHD] = { 0, NULL, LV_LITTLE_ENDIAN,
                                -1, 0, {0}, 0, 0, 0, NULL, NULL, NULL },
-    [VIR_STORAGE_FILE_PLOOP] = { 0, "WithouFreSpacExt", NULL, LV_LITTLE_ENDIAN,
+    [VIR_STORAGE_FILE_PLOOP] = { 0, "WithouFreSpacExt", LV_LITTLE_ENDIAN,
                                  -2, 0, {0}, PLOOP_IMAGE_SIZE_OFFSET, 0,
                                  PLOOP_SIZE_MULTIPLIER, NULL, NULL, NULL },

     /* All formats with a backing store probe below here */
     [VIR_STORAGE_FILE_COW] = {
-        0, "OOOM", NULL,
+        0, "OOOM",
         LV_BIG_ENDIAN, 4, 4, {2},
         4+4+1024+4, 8, 1, NULL, cowGetBackingStore, NULL
     },
     [VIR_STORAGE_FILE_QCOW] = {
-        0, "QFI", NULL,
+        0, "QFI",
         LV_BIG_ENDIAN, 4, 4, {1},
         QCOWX_HDR_IMAGE_SIZE, 8, 1,
         qcow1EncryptionInfo,
         qcowXGetBackingStore, NULL
     },
     [VIR_STORAGE_FILE_QCOW2] = {
-        0, "QFI", NULL,
+        0, "QFI",
         LV_BIG_ENDIAN, 4, 4, {2, 3},
         QCOWX_HDR_IMAGE_SIZE, 8, 1,
         qcow2EncryptionInfo,
@@ -376,12 +374,12 @@ static struct FileTypeInfo const fileTypeInfo[] = {
     },
     [VIR_STORAGE_FILE_QED] = {
         /* https://wiki.qemu.org/Features/QED */
-        0, "QED", NULL,
+        0, "QED",
         LV_LITTLE_ENDIAN, -2, 0, {0},
         QED_HDR_IMAGE_SIZE, 8, 1, NULL, qedGetBackingStore, NULL
     },
     [VIR_STORAGE_FILE_VMDK] = {
-        0, "KDMV", NULL,
+        0, "KDMV",
         LV_LITTLE_ENDIAN, 4, 4, {1, 2, 3},
         4+4+4, 8, 512, NULL, vmdk4GetBackingStore, NULL
     },
@@ -707,20 +705,6 @@ virStorageFileMatchesMagic(int magicOffset,
 }


-static bool
-virStorageFileMatchesExtension(const char *extension,
-                               const char *path)
-{
-    if (extension == NULL)
-        return false;
-
-    if (virStringHasCaseSuffix(path, extension))
-        return true;
-
-    return false;
-}
-
-
 static bool
 virStorageFileMatchesVersion(int versionOffset,
                              int versionSize,
@@ -842,14 +826,6 @@ virStorageFileProbeFormatFromBuf(const char *path,
                  "Please report new version to libvir-list at redhat.com",
                  path, virStorageFileFormatTypeToString(possibleFormat));

-    /* No magic, so check file extension */
-    for (i = 0; i < VIR_STORAGE_FILE_LAST; i++) {
-        if (virStorageFileMatchesExtension(fileTypeInfo[i].extension, path)) {
-            format = i;
-            goto cleanup;
-        }
-    }
-
  cleanup:
     VIR_DEBUG("format=%d", format);
     return format;
-- 
2.24.1




More information about the libvir-list mailing list