liblzma: Make lzma_code() check the reserved members in lzma_stream.
authorLasse Collin <lasse.collin@tukaani.org>
Sat, 23 Oct 2010 09:30:54 +0000 (12:30 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Sat, 23 Oct 2010 09:30:54 +0000 (12:30 +0300)
If any of the reserved members in lzma_stream are non-zero
or non-NULL, LZMA_OPTIONS_ERROR is returned. It is possible
that a new feature in the future is indicated by just setting
a reserved member to some other value, so the old liblzma
version need to catch it as an unsupported feature.

src/liblzma/common/common.c

index 07b1d47..0408e15 100644 (file)
@@ -182,6 +182,20 @@ lzma_code(lzma_stream *strm, lzma_action action)
                        || !strm->internal->supported_actions[action])
                return LZMA_PROG_ERROR;
 
+       // Check if unsupported members have been set to non-zero or non-NULL,
+       // which would indicate that some new feature is wanted.
+       if (strm->reserved_ptr1 != NULL
+                       || strm->reserved_ptr2 != NULL
+                       || strm->reserved_ptr3 != NULL
+                       || strm->reserved_ptr4 != NULL
+                       || strm->reserved_int1 != 0
+                       || strm->reserved_int2 != 0
+                       || strm->reserved_int3 != 0
+                       || strm->reserved_int4 != 0
+                       || strm->reserved_enum1 != LZMA_RESERVED_ENUM
+                       || strm->reserved_enum2 != LZMA_RESERVED_ENUM)
+               return LZMA_OPTIONS_ERROR;
+
        switch (strm->internal->sequence) {
        case ISEQ_RUN:
                switch (action) {