diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2022-11-24 01:32:16 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2022-11-24 01:32:16 +0200 |
commit | e1acf7107291f8b3d6d609a7133331ff36d35d14 (patch) | |
tree | 58782c40c61abb5d55ebe3851a4d6feb0cdcee3a /src/liblzma/common/stream_encoder.c | |
parent | liblzma: Fix another invalid free() after memory allocation failure. (diff) | |
download | xz-e1acf7107291f8b3d6d609a7133331ff36d35d14.tar.xz |
liblzma: Refactor to use lzma_filters_free().
lzma_filters_free() sets the options to NULL and ids to
LZMA_VLI_UNKNOWN so there is no need to do it by caller;
the filter arrays will always be left in a safe state.
Also use memcpy() instead of a loop to copy a filter chain
when it is known to be safe to copy LZMA_FILTERS_MAX + 1
(even if the elements past the terminator might be uninitialized).
Diffstat (limited to 'src/liblzma/common/stream_encoder.c')
-rw-r--r-- | src/liblzma/common/stream_encoder.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/src/liblzma/common/stream_encoder.c b/src/liblzma/common/stream_encoder.c index b15229c3..ee920460 100644 --- a/src/liblzma/common/stream_encoder.c +++ b/src/liblzma/common/stream_encoder.c @@ -219,8 +219,7 @@ stream_encoder_end(void *coder_ptr, const lzma_allocator *allocator) lzma_next_end(&coder->index_encoder, allocator); lzma_index_end(coder->index, allocator); - for (size_t i = 0; coder->filters[i].id != LZMA_VLI_UNKNOWN; ++i) - lzma_free(coder->filters[i].options, allocator); + lzma_filters_free(coder->filters, allocator); lzma_free(coder, allocator); return; @@ -271,22 +270,15 @@ stream_encoder_update(void *coder_ptr, const lzma_allocator *allocator, } // Free the options of the old chain. - for (size_t i = 0; coder->filters[i].id != LZMA_VLI_UNKNOWN; ++i) - lzma_free(coder->filters[i].options, allocator); + lzma_filters_free(coder->filters, allocator); // Copy the new filter chain in place. - size_t j = 0; - do { - coder->filters[j].id = temp[j].id; - coder->filters[j].options = temp[j].options; - } while (temp[j++].id != LZMA_VLI_UNKNOWN); + memcpy(coder->filters, temp, sizeof(temp)); return LZMA_OK; error: - for (size_t i = 0; temp[i].id != LZMA_VLI_UNKNOWN; ++i) - lzma_free(temp[i].options, allocator); - + lzma_filters_free(temp, allocator); return ret; } |