X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Flookup_table.c;h=6ff8381d16d2889a87688bd8859f8883f643fb27;hb=1dbfb8e36f81ced8474ce048c2d0e18ac07de60d;hp=357d64387e995867e23b97057a29501567b39075;hpb=883833a4b3dabec325edf1ca938000f91d587c00;p=wimlib diff --git a/src/lookup_table.c b/src/lookup_table.c index 357d6438..6ff8381d 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -619,7 +619,7 @@ read_wim_lookup_table(WIMStruct *wim) if (cur_entry == NULL) { ERROR("Not enough memory to read lookup table!"); ret = WIMLIB_ERR_NOMEM; - goto out_free_lookup_table; + goto err; } part_number = le16_to_cpu(disk_entry->part_number); @@ -639,7 +639,7 @@ read_wim_lookup_table(WIMStruct *wim) if (reshdr.uncompressed_size != reshdr.size_in_wim) { ERROR("Invalid resource entry!"); ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY; - goto out_free_cur_entry; + goto err; } } @@ -656,17 +656,18 @@ read_wim_lookup_table(WIMStruct *wim) * resource. */ struct wim_lookup_table_entry *prev_entry = NULL; - if (back_to_back_pack) { + if (back_to_back_pack && + !list_empty(&cur_rspec->stream_list)) + { prev_entry = list_entry(cur_rspec->stream_list.prev, struct wim_lookup_table_entry, rspec_node); lte_unbind_wim_resource_spec(prev_entry); - cur_rspec->uncompressed_size -= prev_entry->size; } if (cur_rspec != NULL) { ret = validate_resource(cur_rspec); if (ret) - goto out_free_cur_entry; + goto err; } /* Allocate the resource specification and initialize it @@ -675,7 +676,7 @@ read_wim_lookup_table(WIMStruct *wim) if (cur_rspec == NULL) { ERROR("Not enough memory to read lookup table!"); ret = WIMLIB_ERR_NOMEM; - goto out_free_cur_entry; + goto err; } wim_res_hdr_to_spec(&reshdr, wim, cur_rspec); @@ -689,10 +690,8 @@ read_wim_lookup_table(WIMStruct *wim) cur_rspec->offset_in_wim = 0; } - if (prev_entry) { + if (prev_entry) lte_bind_wim_resource_spec(prev_entry, cur_rspec); - cur_rspec->uncompressed_size = prev_entry->size; - } } if ((reshdr.flags & WIM_RESHDR_FLAG_PACKED_STREAMS) && @@ -702,8 +701,19 @@ read_wim_lookup_table(WIMStruct *wim) * Transfer the values to the `struct * wim_resource_spec', and discard the current stream * since this lookup table entry did not, in fact, - * correspond to a "stream". */ + * correspond to a "stream". + */ + + /* Uncompressed size of the resource pack is actually + * stored in the header of the resource itself. */ + struct alt_chunk_table_header_disk hdr; + + ret = full_pread(&wim->in_fd, &hdr, + sizeof(hdr), reshdr.offset_in_wim); + if (ret) + goto err; + cur_rspec->uncompressed_size = le64_to_cpu(hdr.res_usize); cur_rspec->offset_in_wim = reshdr.offset_in_wim; cur_rspec->size_in_wim = reshdr.size_in_wim; cur_rspec->flags = reshdr.flags; @@ -723,10 +733,10 @@ read_wim_lookup_table(WIMStruct *wim) if (reshdr.flags & WIM_RESHDR_FLAG_PACKED_STREAMS) { /* Continuing the pack with another stream. */ - DEBUG("Continuing packed run with stream: " - "%"PRIu64" uncompressed bytes @ resource offset %"PRIu64")", + DEBUG("Continuing pack with stream: " + "%"PRIu64" uncompressed bytes @ " + "resource offset %"PRIu64")", reshdr.size_in_wim, reshdr.offset_in_wim); - cur_rspec->uncompressed_size += reshdr.size_in_wim; } lte_bind_wim_resource_spec(cur_entry, cur_rspec); @@ -764,7 +774,7 @@ read_wim_lookup_table(WIMStruct *wim) print_lookup_table_entry(cur_entry, stderr); } ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY; - goto out_free_cur_entry; + goto err; } if (wim->hdr.part_number != 1) { @@ -818,12 +828,13 @@ read_wim_lookup_table(WIMStruct *wim) * its SHA1 message digest. */ lookup_table_insert(table, cur_entry); } + cur_entry = NULL; /* Validate the last resource. */ if (cur_rspec != NULL) { ret = validate_resource(cur_rspec); if (ret) - goto out_free_lookup_table; + goto err; } if (wim->hdr.part_number == 1 && wim->current_image != wim->hdr.image_count) { @@ -841,9 +852,10 @@ read_wim_lookup_table(WIMStruct *wim) ret = 0; goto out_free_buf; -out_free_cur_entry: - FREE(cur_entry); -out_free_lookup_table: +err: + if (cur_rspec && list_empty(&cur_rspec->stream_list)) + FREE(cur_rspec); + free_lookup_table_entry(cur_entry); free_lookup_table(table); out_free_buf: FREE(buf); @@ -1174,7 +1186,7 @@ wim_pathname_to_stream(WIMStruct *wim, } } - dentry = get_dentry(wim, path); + dentry = get_dentry(wim, path, WIMLIB_CASE_SENSITIVE); if (p) *p = T(':'); if (!dentry)