small block optimisation check
diff --git a/src/libbz3.c b/src/libbz3.c
index b66096d..0f63c8a 100644
--- a/src/libbz3.c
+++ b/src/libbz3.c
@@ -186,16 +186,21 @@ PUBLIC_API s32 bz3_decode_block(struct bz3_state * state, u8 * buffer, s32 data_
u32 crc32 = read_neutral_s32(buffer);
s32 bwt_idx = read_neutral_s32(buffer + 4);
+ if(data_size > state->block_size + state->block_size / 50 + 16 || data_size < 0) {
+ state->last_error = BZ3_ERR_MALFORMED_HEADER;
+ return -1;
+ }
+
if (bwt_idx == -1) {
+ if(data_size > 64) {
+ state->last_error = BZ3_ERR_MALFORMED_HEADER;
+ return -1;
+ }
+
memmove(buffer, buffer + 8, data_size - 8);
return data_size - 8;
}
- if (orig_size > state->block_size) {
- state->last_error = BZ3_ERR_DATA_TOO_BIG;
- return -1;
- }
-
s8 model = buffer[8];
s32 lzp_size = -1, rle_size, p = 0;
diff --git a/src/main.c b/src/main.c
index bc8c28b..d67354a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -142,9 +142,11 @@ int main(int argc, char * argv[]) {
output = regular_file;
if (!force_stdstreams && output == NULL && input != NULL) {
// strip the bz3 extension
- output = malloc(strlen(input) - 4);
- strncpy(output, input, strlen(input) - 4);
- output[strlen(input) - 4] = '\0';
+ if(strlen(input) > 4 && !strcmp(input + strlen(input) - 4, ".bz3")) {
+ output = malloc(strlen(input));
+ strncpy(output, input, strlen(input) - 4);
+ output[strlen(input) - 4] = '\0';
+ }
}
}
} else {
