From: Lasse Collin Date: Fri, 25 Jan 2008 22:25:34 +0000 (+0200) Subject: Return LZMA_HEADER_ERROR if LZMA_SYNC_FLUSH is used with any X-Git-Tag: upstream/5.1.3~789 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f9842f712732c482f2def9f24437851e57dd83f8;p=platform%2Fupstream%2Fxz.git Return LZMA_HEADER_ERROR if LZMA_SYNC_FLUSH is used with any of the so called simple filters. If there is demand, limited support for LZMA_SYNC_FLUSH may be added in future. After this commit, using LZMA_SYNC_FLUSH shouldn't cause undefined behavior in any situation. --- diff --git a/src/liblzma/api/lzma/simple.h b/src/liblzma/api/lzma/simple.h index fb78d01..807a4c4 100644 --- a/src/liblzma/api/lzma/simple.h +++ b/src/liblzma/api/lzma/simple.h @@ -64,6 +64,15 @@ * * If options with non-default values have been specified when encoding, * the same options must also be specified when decoding. + * + * \note At the moment, none of the simple filters support + * LZMA_SYNC_FLUSH. If LZMA_SYNC_FLUSH is specified, + * LZMA_HEADER_ERROR will be returned. If there is need, + * partial support for LZMA_SYNC_FLUSH can be added in future. + * Partial means that flushing would be possible only at + * offsets that are multiple of 2, 4, or 16 depending on + * the filter, except x86 which cannot be made to support + * LZMA_SYNC_FLUSH predictably. */ typedef struct { /** diff --git a/src/liblzma/simple/simple_coder.c b/src/liblzma/simple/simple_coder.c index 6ecd119..e967430 100644 --- a/src/liblzma/simple/simple_coder.c +++ b/src/liblzma/simple/simple_coder.c @@ -101,6 +101,14 @@ simple_code(lzma_coder *coder, lzma_allocator *allocator, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, lzma_action action) { + // TODO: Add partial support for LZMA_SYNC_FLUSH. We can support it + // in cases when the filter is able to filter everything. With most + // simple filters it can be done at offset that is a multiple of 2, + // 4, or 16. With x86 filter, it needs good luck, and thus cannot + // be made to work predictably. + if (action == LZMA_SYNC_FLUSH) + return LZMA_HEADER_ERROR; + // Flush already filtered data from coder->buffer[] to out[]. if (coder->pos < coder->filtered) { bufcpy(coder->buffer, &coder->pos, coder->filtered,