]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
liblzma: index_decoder: Fix missing initializations on LZMA_PROG_ERROR
authorLasse Collin <lasse.collin@tukaani.org>
Sat, 27 Apr 2024 11:33:38 +0000 (14:33 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Sat, 27 Apr 2024 11:33:38 +0000 (14:33 +0300)
If the arguments to lzma_index_decoder() or lzma_index_buffer_decode()
were such that LZMA_PROG_ERROR was returned, the lzma_index **i
argument wasn't touched even though the API docs say that *i = NULL
is done if an error occurs. This obviously won't be done even now
if i == NULL but otherwise it is best to do it due to the wording
in the API docs.

In practice this matters very little: The problem can occur only
if the functions are called with invalid arguments, that is,
the calling application must already have a bug.

src/liblzma/common/index_decoder.c

index f105ff04e8a186fd923319a01c21721a95d46f62..4bcb306921157810ab5e3efa7d1dd59a9eccf2ce 100644 (file)
@@ -305,6 +305,12 @@ lzma_index_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 extern LZMA_API(lzma_ret)
 lzma_index_decoder(lzma_stream *strm, lzma_index **i, uint64_t memlimit)
 {
+       // If i isn't NULL, *i must always be initialized due to
+       // the wording in the API docs. This way it is initialized
+       // if we return LZMA_PROG_ERROR due to strm == NULL.
+       if (i != NULL)
+               *i = NULL;
+
        lzma_next_strm_init(lzma_index_decoder_init, strm, i, memlimit);
 
        strm->internal->supported_actions[LZMA_RUN] = true;
@@ -319,6 +325,11 @@ lzma_index_buffer_decode(lzma_index **i, uint64_t *memlimit,
                const lzma_allocator *allocator,
                const uint8_t *in, size_t *in_pos, size_t in_size)
 {
+       // If i isn't NULL, *i must always be initialized due to
+       // the wording in the API docs.
+       if (i != NULL)
+               *i = NULL;
+
        // Sanity checks
        if (i == NULL || memlimit == NULL
                        || in == NULL || in_pos == NULL || *in_pos > in_size)