lzxpress: fix for decompression...
authorMatthieu Suiche <matt@msuiche.net>
Thu, 10 Jul 2008 09:31:43 +0000 (09:31 +0000)
committerStefan Metzmacher <metze@samba.org>
Sun, 7 Sep 2008 17:18:17 +0000 (19:18 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
source/lib/compression/lzxpress.c
source/lib/compression/lzxpress.h

index 506305176ffaf6857648d4ef99248b08366fde6b..9ce4eb1e8d0e3685619c4415753fd183c9c51e6c 100644 (file)
@@ -32,7 +32,6 @@
  *
  */
 
-#include "includes.h"
 #include "replace.h"
 #include "lzxpress.h"
 
 ))
 #endif
 
-static uint32_t xpress_decompress(uint8_t *input,
-                               uint32_t input_size,
-                               uint8_t *output,
-                               uint32_t output_size)
+ssize_t lzxpress_decompress(const uint8_t *input,
+                           uint32_t input_size,
+                           uint8_t *output,
+                           uint32_t max_output_size)
 {
        uint32_t output_index, input_index;
        uint32_t indicator, indicator_bit;
@@ -112,11 +111,11 @@ static uint32_t xpress_decompress(uint8_t *input,
                                if (length == 15) {
                                        length = input[input_index];
                                        input_index += sizeof(uint8_t);
-                                               if (length == 255) {
-                                                       length = PULL_LE_UINT16(input, input_index);
-                                                       input_index += sizeof(uint16_t);
-                                                       length -= (15 + 7);
-                                               }
+                                       if (length == 255) {
+                                               length = PULL_LE_UINT16(input, input_index);
+                                               input_index += sizeof(uint16_t);
+                                               length -= (15 + 7);
+                                       }
                                        length += 15;
                                }
                                length += 7;
@@ -125,20 +124,15 @@ static uint32_t xpress_decompress(uint8_t *input,
                        length += 3;
 
                        do {
-                               if (output_index >= output_size) break;
+                               if ((output_index >= max_output_size) || ((offset + 1) > output_index)) break;
+
                                output[output_index] = output[output_index - offset - 1];
+
                                output_index += sizeof(uint8_t);
                                length -= sizeof(uint8_t);
                        } while (length != 0);
                }
-
-       } while ((output_index < output_size) && (input_index < input_size));
+       } while ((output_index < max_output_size) && (input_index < (input_size)));
 
        return output_index;
 }
-
-uint32_t lzxpress_decompress(DATA_BLOB *inbuf,
-                               DATA_BLOB *outbuf)
-{
-       return xpress_decompress(inbuf->data, inbuf->length, outbuf->data, outbuf->length);
-}
index 4862fd2635ce4c9e9673de8f3941162c4ccc60b5..c81dda8f850c22aace92bb8ab8ad9fa2a1bbadfc 100644 (file)
@@ -37,7 +37,9 @@
 
 #define XPRESS_BLOCK_SIZE 0x10000
 
-uint32_t lzxpress_decompress(DATA_BLOB *inbuf,
-                            DATA_BLOB *outbuf);
+ssize_t lzxpress_decompress(const uint8_t *input,
+                           uint32_t input_size,
+                           uint8_t *output,
+                           uint32_t max_output_size);
 
 #endif /* _LZXPRESS_H */