mirror of
				https://github.com/facebook/zstd.git
				synced 2025-11-04 00:02:59 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2016-present, Facebook, Inc.
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * This source code is licensed under both the BSD-style license (found in the
 | 
						|
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
 | 
						|
 * in the COPYING file in the root directory of this source tree).
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * This fuzz target attempts to comprss the fuzzed data with the simple
 | 
						|
 * compression function with an output buffer that may be too small to
 | 
						|
 * ensure that the compressor never crashes.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stddef.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include "fuzz_helpers.h"
 | 
						|
#include "zstd.h"
 | 
						|
#include "zstd_helpers.h"
 | 
						|
#include "fuzz_data_producer.h"
 | 
						|
 | 
						|
static ZSTD_CCtx *cctx = NULL;
 | 
						|
 | 
						|
int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 | 
						|
{
 | 
						|
    /* Give a random portion of src data to the producer, to use for
 | 
						|
    parameter generation. The rest will be used for (de)compression */
 | 
						|
    FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size);
 | 
						|
    size = FUZZ_dataProducer_reserveDataPrefix(producer);
 | 
						|
 | 
						|
    size_t const maxSize = ZSTD_compressBound(size);
 | 
						|
    size_t const bufSize = FUZZ_dataProducer_uint32Range(producer, 0, maxSize);
 | 
						|
 | 
						|
    int const cLevel = FUZZ_dataProducer_int32Range(producer, kMinClevel, kMaxClevel);
 | 
						|
 | 
						|
    if (!cctx) {
 | 
						|
        cctx = ZSTD_createCCtx();
 | 
						|
        FUZZ_ASSERT(cctx);
 | 
						|
    }
 | 
						|
 | 
						|
    void *rBuf = malloc(bufSize);
 | 
						|
    FUZZ_ASSERT(rBuf);
 | 
						|
    ZSTD_compressCCtx(cctx, rBuf, bufSize, src, size, cLevel);
 | 
						|
    free(rBuf);
 | 
						|
    FUZZ_dataProducer_free(producer);
 | 
						|
#ifndef STATEFUL_FUZZING
 | 
						|
    ZSTD_freeCCtx(cctx); cctx = NULL;
 | 
						|
#endif
 | 
						|
    return 0;
 | 
						|
}
 |