[release/6.0] Use "read" to fetch misaligned 64bit values from bundle header (#63519)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Thu, 13 Jan 2022 16:47:36 +0000 (08:47 -0800)
committerGitHub <noreply@github.com>
Thu, 13 Jan 2022 16:47:36 +0000 (08:47 -0800)
* Use "read" to fetch misaligned 64bit values

* remove read_direct

* rename read() -> read_byte()

Co-authored-by: vsadov <8218165+VSadov@users.noreply.github.com>
src/native/corehost/bundle/file_entry.cpp
src/native/corehost/bundle/header.cpp
src/native/corehost/bundle/reader.cpp
src/native/corehost/bundle/reader.h

index ace0ef5..a6610d7 100644 (file)
@@ -19,15 +19,18 @@ file_entry_t file_entry_t::read(reader_t &reader, uint32_t bundle_major_version,
     // First read the fixed-sized portion of file-entry
     file_entry_fixed_t fixed_data;
 
-    fixed_data.offset = *(int64_t*)reader.read_direct(sizeof(int64_t));
-    fixed_data.size   = *(int64_t*)reader.read_direct(sizeof(int64_t));
+    // NB: the file data is potentially unaligned, thus we use "read" to fetch 64bit values
+    reader.read(&fixed_data.offset, sizeof(int64_t));
+    reader.read(&fixed_data.size, sizeof(int64_t));
 
     // compressedSize is present only in v6+ headers
-    fixed_data.compressedSize = bundle_major_version >= 6 ?
-                        *(int64_t*)reader.read_direct(sizeof(int64_t)) :
-                        0;
+    fixed_data.compressedSize = 0;
+    if (bundle_major_version >= 6)
+    {
+        reader.read(&fixed_data.compressedSize, sizeof(int64_t));
+    }
 
-    fixed_data.type   = *(file_type_t*)reader.read_direct(sizeof(file_type_t));
+    fixed_data.type   = (file_type_t)reader.read_byte();
 
     file_entry_t entry(&fixed_data, force_extraction);
 
index 0eb42d9..bc549f4 100644 (file)
@@ -24,23 +24,23 @@ bool header_fixed_t::is_valid() const
 
 header_t header_t::read(reader_t& reader)
 {
-    const header_fixed_t* fixed_header = reinterpret_cast<const header_fixed_t*>(reader.read_direct(sizeof(header_fixed_t)));
+    header_fixed_t fixed_header;
+    reader.read(&fixed_header, sizeof(header_fixed_t));
 
-    if (!fixed_header->is_valid())
+    if (!fixed_header.is_valid())
     {
         trace::error(_X("Failure processing application bundle."));
-        trace::error(_X("Bundle header version compatibility check failed. Header version: %d.%d"), fixed_header->major_version, fixed_header->minor_version);
+        trace::error(_X("Bundle header version compatibility check failed. Header version: %d.%d"), fixed_header.major_version, fixed_header.minor_version);
 
         throw StatusCode::BundleExtractionFailure;
     }
 
-    header_t header(fixed_header->major_version, fixed_header->minor_version, fixed_header->num_embedded_files);
+    header_t header(fixed_header.major_version, fixed_header.minor_version, fixed_header.num_embedded_files);
 
     // bundle_id is a component of the extraction path
     reader.read_path_string(header.m_bundle_id);
 
-    const header_fixed_v2_t *v2_header = reinterpret_cast<const header_fixed_v2_t*>(reader.read_direct(sizeof(header_fixed_v2_t)));
-    header.m_v2_header = *v2_header;
+    reader.read(&header.m_v2_header, sizeof(header_fixed_v2_t));
 
     return header;
 }
index a7b5e58..8461e5d 100644 (file)
@@ -54,7 +54,7 @@ size_t reader_t::read_path_length()
 {
     size_t length = 0;
 
-    int8_t first_byte = read();
+    int8_t first_byte = read_byte();
 
     // If the high bit is set, it means there are more bytes to read.
     if ((first_byte & 0x80) == 0)
@@ -63,7 +63,7 @@ size_t reader_t::read_path_length()
     }
     else
     {
-        int8_t second_byte = read();
+        int8_t second_byte = read_byte();
 
         if (second_byte & 0x80)
         {
index 576ecd0..a4c1e07 100644 (file)
@@ -81,7 +81,7 @@ namespace bundle
             return m_ptr;
         }
 
-        int8_t read()
+        int8_t read_byte()
         {
             bounds_check();
             return *m_ptr++;
@@ -100,16 +100,6 @@ namespace bundle
             m_ptr += len;
         }
 
-        // Return a pointer to the requested bytes within the memory-mapped file.
-        // Skip over len bytes.
-        const char* read_direct(int64_t len)
-        {
-            bounds_check(len);
-            const char *ptr = m_ptr;
-            m_ptr += len;
-            return ptr;
-        }
-
         size_t read_path_length();
         size_t read_path_string(pal::string_t &str);