| /* |
| # Copyright 2018 Google Inc. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| ################################################################################ |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdint.h> |
| #include <stdbool.h> |
| #include <assert.h> |
| #include "lzo1x.h" |
| |
| /* Work-memory needed for compression. Allocate memory in units |
| * of 'lzo_align_t' (instead of 'char') to make sure it is properly aligned. |
| */ |
| #define HEAP_ALLOC(var,size) \ |
| lzo_align_t __LZO_MMODEL var [ ((size) + (sizeof(lzo_align_t) - 1)) / sizeof(lzo_align_t) ] |
| |
| static HEAP_ALLOC(wrkmem, LZO1X_1_MEM_COMPRESS); |
| |
| extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) |
| { |
| int r; |
| lzo_uint out_len; |
| lzo_uint new_len; |
| /* We want to compress the data block at 'in' with length 'IN_LEN' to |
| * the block at 'out'. Because the input block may be incompressible, |
| * we must provide a little more output space in case that compression |
| * is not possible. |
| */ |
| unsigned char __LZO_MMODEL in[size]; |
| unsigned char __LZO_MMODEL out[size + size/16 + 64 + 3]; |
| |
| static bool isInit = false; |
| if (!isInit) |
| { |
| if (lzo_init() != LZO_E_OK) |
| { |
| #ifdef __DEBUG__ |
| printf("internal error - lzo_init() failed !!!\n"); |
| #endif |
| return 0; |
| } |
| isInit = true; |
| } |
| |
| /* Compress with LZO1X-1. */ |
| r = lzo1x_1_compress(data, size, out, &out_len, wrkmem); |
| assert(r == LZO_E_OK); |
| #ifdef __DEBUG__ |
| printf("compressed %lu bytes into %lu bytes\n", |
| (unsigned long) size, (unsigned long) out_len); |
| #endif |
| |
| /* check for an incompressible block */ |
| if (out_len >= size) |
| { |
| #ifdef __DEBUG__ |
| printf("This block contains incompressible data.\n"); |
| #endif |
| return 0; |
| } |
| |
| // Decompress |
| new_len = size; |
| r = lzo1x_decompress(out, out_len, in, &new_len,/*wrkmem=*/NULL); |
| assert(r == LZO_E_OK && new_len == size); |
| #ifdef __DEBUG__ |
| printf("decompressed %lu bytes back into %lu bytes\n", |
| (unsigned long) out_len, (unsigned long) size); |
| #endif |
| return 0; |
| } |