]> wimlib.net Git - wimlib/blobdiff - include/wimlib/blob_table.h
Disallow empty blobs from being read
[wimlib] / include / wimlib / blob_table.h
index 1adec4ed6db602aa617b2ba91eb6b2cd1496f03e..0ccccfbbbbb0f876e4172016d7e2fc60d864834e 100644 (file)
@@ -12,7 +12,7 @@ enum blob_location {
        /* The blob's data does not exist.  This is a temporary state only.  */
        BLOB_NONEXISTENT = 0,
 
-       /* The blob's data is located in a WIM resource identified by the
+       /* The blob's data is available in the WIM resource identified by the
         * `struct wim_resource_descriptor' pointed to by @rdesc.
         * @offset_in_res identifies the offset at which this particular blob
         * begins in the uncompressed data of the resource.  */
@@ -35,9 +35,8 @@ enum blob_location {
 
 #ifdef WITH_NTFS_3G
        /* The blob's data is available as the contents of an NTFS attribute
-        * accessible through libntfs-3g.  The attribute is identified by
-        * volume, path to an inode, attribute name, and attribute type.
-        * @ntfs_loc points to a structure containing this information.  */
+        * accessible through libntfs-3g.  @ntfs_loc points to a structure which
+        * identifies the attribute.  */
        BLOB_IN_NTFS_VOLUME,
 #endif
 
@@ -75,7 +74,20 @@ struct blob_descriptor {
        /* List node for a hash bucket of the blob table  */
        struct hlist_node hash_list;
 
-       /* Uncompressed size of this blob  */
+       /*
+        * Uncompressed size of this blob.
+        *
+        * In most cases we are now enforcing that this is nonzero; i.e. an
+        * empty stream will have "no blob" rather than "an empty blob".  The
+        * exceptions are:
+        *
+        *      - blob descriptors with 'blob_location == BLOB_NONEXISTENT',
+        *        e.g. placeholder entries for new metadata resources or for
+        *        blobs required for pipable WIM extraction.  In these cases the
+        *        size is not meaningful information anyway.
+        *      - blob descriptors with 'blob_location == BLOB_IN_STAGING_FILE'
+        *        can vary their size over time, including to 0.
+        */
        u64 size;
 
        union {
@@ -122,7 +134,7 @@ struct blob_descriptor {
 
 #ifdef WITH_FUSE
        /* Number of open file descriptors to this blob during a FUSE mount of
-        * the containing image.  */
+        * a WIM image.  */
        u16 num_opened_fds;
 #endif
 
@@ -175,6 +187,9 @@ struct blob_descriptor {
                                struct {
                                        tchar *file_on_disk;
                                        struct wim_inode *file_inode;
+                               #ifdef __WIN32__
+                                       u64 sort_key;
+                               #endif
                                };
 
                                /* BLOB_IN_ATTACHED_BUFFER */