87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
# 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;
 | 
						|
}
 |