diff options
| author | Phillip Lougher <phillip@lougher.demon.co.uk> | 2009-09-23 15:57:37 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-24 07:21:05 -0700 | 
| commit | 6a8811629e9aa611aa710162f9e02020bba52c87 (patch) | |
| tree | d3b8ff16950f5cda94b3259fbfa097aea9cb1e5f /lib/decompress_unlzma.c | |
| parent | 3354f73b24c6d392ed7fd5583cfcc7604c1934ae (diff) | |
| download | olio-linux-3.10-6a8811629e9aa611aa710162f9e02020bba52c87.tar.xz olio-linux-3.10-6a8811629e9aa611aa710162f9e02020bba52c87.zip  | |
lzma/gzip: fix potential oops when input data is truncated
If the lzma/gzip decompressors are called with insufficient input data
(len > 0 & fill = NULL), they will attempt to call the fill function to
obtain more data, leading to a kernel oops.
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/decompress_unlzma.c')
| -rw-r--r-- | lib/decompress_unlzma.c | 10 | 
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c index 0b954e04bd3..ca82fde81c8 100644 --- a/lib/decompress_unlzma.c +++ b/lib/decompress_unlzma.c @@ -82,6 +82,11 @@ struct rc {  #define RC_MODEL_TOTAL_BITS 11 +static int nofill(void *buffer, unsigned int len) +{ +	return -1; +} +  /* Called twice: once at startup and once in rc_normalize() */  static void INIT rc_read(struct rc *rc)  { @@ -97,7 +102,10 @@ static inline void INIT rc_init(struct rc *rc,  				       int (*fill)(void*, unsigned int),  				       char *buffer, int buffer_size)  { -	rc->fill = fill; +	if (fill) +		rc->fill = fill; +	else +		rc->fill = nofill;  	rc->buffer = (uint8_t *)buffer;  	rc->buffer_size = buffer_size;  	rc->buffer_end = rc->buffer + rc->buffer_size;  |