]> wimlib.net Git - wimlib/blobdiff - src/header.c
read_wim_header(): Check return value of lseek()
[wimlib] / src / header.c
index e4c6d67c092aa98a1ac3dc71f5cf4ce5090f4a15..e223ce9fa291f1e3756fa0eae2c400cadf1c6996 100644 (file)
@@ -49,8 +49,8 @@
  * Reads the header from a WIM file.
  *
  * @wim
- *     WIM to read the header from; @wim->in_fd must be positioned at the
- *     offset at which to read the header.
+ *     WIM to read the header from @wim->in_fd must be positioned at the
+ *     beginning of the file.
  *
  * @hdr
  *     Structure to read the header into.
@@ -96,7 +96,9 @@ read_wim_header(WIMStruct *wim, struct wim_header *hdr)
                        /* Pipable WIM:  Use header at end instead, unless
                         * actually reading from a pipe.  */
                        if (!in_fd->is_pipe) {
-                               lseek(in_fd->fd, -WIM_HEADER_DISK_SIZE, SEEK_END);
+                               ret = WIMLIB_ERR_READ;
+                               if (-1 == lseek(in_fd->fd, -WIM_HEADER_DISK_SIZE, SEEK_END))
+                                       goto read_error;
                                ret = full_read(in_fd, &disk_hdr, sizeof(disk_hdr));
                                if (ret)
                                        goto read_error;
@@ -124,7 +126,7 @@ read_wim_header(WIMStruct *wim, struct wim_header *hdr)
 
        hdr->flags = le32_to_cpu(disk_hdr.wim_flags);
        hdr->chunk_size = le32_to_cpu(disk_hdr.chunk_size);
-       memcpy(hdr->guid, disk_hdr.guid, WIM_GID_LEN);
+       memcpy(hdr->guid, disk_hdr.guid, WIM_GUID_LEN);
        hdr->part_number = le16_to_cpu(disk_hdr.part_number);
        hdr->total_parts = le16_to_cpu(disk_hdr.total_parts);
 
@@ -141,7 +143,7 @@ read_wim_header(WIMStruct *wim, struct wim_header *hdr)
        DEBUG("part_number = %u, total_parts = %u, image_count = %u",
              hdr->part_number, hdr->total_parts, hdr->image_count);
 
-       if (hdr->image_count >= INT_MAX) {
+       if (unlikely(hdr->image_count > MAX_IMAGES)) {
                ERROR("\"%"TS"\": Invalid image count (%u)",
                      filename, hdr->image_count);
                return WIMLIB_ERR_IMAGE_COUNT;
@@ -181,7 +183,7 @@ write_wim_header_at_offset(const struct wim_header *hdr, struct filedes *out_fd,
                disk_hdr.chunk_size = cpu_to_le32(hdr->chunk_size);
        else
                disk_hdr.chunk_size = 0;
-       memcpy(disk_hdr.guid, hdr->guid, WIM_GID_LEN);
+       memcpy(disk_hdr.guid, hdr->guid, WIM_GUID_LEN);
 
        disk_hdr.part_number = cpu_to_le16(hdr->part_number);
        disk_hdr.total_parts = cpu_to_le16(hdr->total_parts);
@@ -312,7 +314,7 @@ wimlib_print_header(const WIMStruct *wim)
 
        tprintf(T("Chunk Size                  = %u\n"), hdr->chunk_size);
        tfputs (T("GUID                        = "), stdout);
-       print_byte_field(hdr->guid, WIM_GID_LEN, stdout);
+       print_byte_field(hdr->guid, WIM_GUID_LEN, stdout);
        tputchar(T('\n'));
        tprintf(T("Part Number                 = %hu\n"), hdr->part_number);
        tprintf(T("Total Parts                 = %hu\n"), hdr->total_parts);