Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Functions
xz_dec_stream.c File Reference
#include "xz_private.h"
#include "xz_stream.h"

Go to the source code of this file.

Data Structures

struct  xz_dec_hash
 
struct  xz_dec
 

Functions

XZ_EXTERN enum xz_ret xz_dec_run (struct xz_dec *s, struct xz_buf *b)
 
XZ_EXTERN struct xz_decxz_dec_init (enum xz_mode mode, uint32_t dict_max)
 
XZ_EXTERN void xz_dec_reset (struct xz_dec *s)
 
XZ_EXTERN void xz_dec_end (struct xz_dec *s)
 

Function Documentation

XZ_EXTERN void xz_dec_end ( struct xz_dec s)

xz_dec_end() - Free the memory allocated for the decoder state : Decoder state allocated using xz_dec_init(). If s is NULL, this function does nothing.

Definition at line 812 of file xz_dec_stream.c.

XZ_EXTERN struct xz_dec* xz_dec_init ( enum xz_mode  mode,
uint32_t  dict_max 
)
read

xz_dec_init() - Allocate and initialize a XZ decoder state : Operation mode : Maximum size of the LZMA2 dictionary (history buffer) for multi-call decoding. This is ignored in single-call mode (mode == XZ_SINGLE). LZMA2 dictionary is always 2^n bytes or 2^n + 2^(n-1) bytes (the latter sizes are less common in practice), so other values for dict_max don't make sense. In the kernel, dictionary sizes of 64 KiB, 128 KiB, 256 KiB, 512 KiB, and 1 MiB are probably the only reasonable values, except for kernel and initramfs images where a bigger dictionary can be fine and useful.

Single-call mode (XZ_SINGLE): xz_dec_run() decodes the whole stream at once. The caller must provide enough output space or the decoding will fail. The output space is used as the dictionary buffer, which is why there is no need to allocate the dictionary as part of the decoder's internal state.

Because the output buffer is used as the workspace, streams encoded using a big dictionary are not a problem in single-call mode. It is enough that the output buffer is big enough to hold the actual uncompressed data; it can be smaller than the dictionary size stored in the stream headers.

Multi-call mode with preallocated dictionary (XZ_PREALLOC): dict_max bytes of memory is preallocated for the LZMA2 dictionary. This way there is no risk that xz_dec_run() could run out of memory, since xz_dec_run() will never allocate any memory. Instead, if the preallocated dictionary is too small for decoding the given input stream, xz_dec_run() will return XZ_MEMLIMIT_ERROR. Thus, it is important to know what kind of data will be decoded to avoid allocating excessive amount of memory for the dictionary.

Multi-call mode with dynamically allocated dictionary (XZ_DYNALLOC): dict_max specifies the maximum allowed dictionary size that xz_dec_run() may allocate once it has parsed the dictionary size from the stream headers. This way excessive allocations can be avoided while still limiting the maximum memory usage to a sane value to prevent running the system out of memory when decompressing streams from untrusted sources.

On success, xz_dec_init() returns a pointer to struct xz_dec, which is ready to be used with xz_dec_run(). If memory allocation fails, xz_dec_init() returns NULL.

Definition at line 770 of file xz_dec_stream.c.

XZ_EXTERN void xz_dec_reset ( struct xz_dec s)

xz_dec_reset() - Reset an already allocated decoder state : Decoder state allocated using xz_dec_init()

This function can be used to reset the multi-call decoder state without freeing and reallocating memory with xz_dec_end() and xz_dec_init().

In single-call mode, xz_dec_reset() is always called in the beginning of xz_dec_run(). Thus, explicit call to xz_dec_reset() is useful only in multi-call mode.

Definition at line 800 of file xz_dec_stream.c.

XZ_EXTERN enum xz_ret xz_dec_run ( struct xz_dec s,
struct xz_buf b 
)

xz_dec_run() - Run the XZ decoder : Decoder state allocated using xz_dec_init() : Input and output buffers

The possible return values depend on build options and operation mode. See enum xz_ret for details.

Note that if an error occurs in single-call mode (return value is not XZ_STREAM_END), b->in_pos and b->out_pos are not modified and the contents of the output buffer from b->out[b->out_pos] onward are undefined. This is true even after XZ_BUF_ERROR, because with some filter chains, there may be a second pass over the output buffer, and this pass cannot be properly done if the output buffer is truncated. Thus, you cannot give the single-call decoder a too small buffer and then expect to get that amount valid data from the beginning of the stream. You must use the multi-call decoder if you don't want to uncompress the whole stream.

Definition at line 734 of file xz_dec_stream.c.