v2: switch to C and atexit (suggested by Gert) Signed-off-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org> (v1) Reviewed-by: Ryan Neph <ryanneph@google.com> (v1)macos/master
parent
49edf4eda6
commit
30eff50d54
@ -0,0 +1,92 @@ |
||||
/*
|
||||
* Copyright 2021 Google LLC |
||||
* SPDX-License-Identifier: MIT |
||||
*/ |
||||
|
||||
#include <stdbool.h> |
||||
#include <stddef.h> |
||||
#include <stdint.h> |
||||
#include <stdlib.h> |
||||
|
||||
#include "os/os_misc.h" |
||||
#include "virglrenderer.h" |
||||
#include "virglrenderer_hw.h" |
||||
|
||||
int |
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); |
||||
|
||||
struct fuzz_renderer { |
||||
bool initialized; |
||||
}; |
||||
|
||||
static void |
||||
fuzz_atexit_callback(void) |
||||
{ |
||||
virgl_renderer_cleanup(NULL); |
||||
} |
||||
|
||||
static void |
||||
fuzz_debug_callback(UNUSED const char *fmt, UNUSED va_list ap) |
||||
{ |
||||
/* no logging */ |
||||
} |
||||
|
||||
static struct fuzz_renderer * |
||||
fuzz_renderer_get(void) |
||||
{ |
||||
static struct fuzz_renderer renderer; |
||||
if (renderer.initialized) |
||||
return &renderer; |
||||
|
||||
int ret = |
||||
virgl_renderer_init(NULL, VIRGL_RENDERER_VENUS | VIRGL_RENDERER_NO_VIRGL, NULL); |
||||
if (ret) |
||||
abort(); |
||||
|
||||
virgl_set_debug_callback(fuzz_debug_callback); |
||||
|
||||
atexit(fuzz_atexit_callback); |
||||
|
||||
renderer.initialized = true; |
||||
return &renderer; |
||||
} |
||||
|
||||
static uint32_t |
||||
fuzz_context_create(UNUSED struct fuzz_renderer *renderer) |
||||
{ |
||||
const uint32_t ctx_id = 1; |
||||
const char name[] = "virgl_venus_fuzzer"; |
||||
int ret = virgl_renderer_context_create_with_flags(ctx_id, VIRGL_RENDERER_CAPSET_VENUS, |
||||
sizeof(name), name); |
||||
if (ret) |
||||
abort(); |
||||
|
||||
return ctx_id; |
||||
} |
||||
|
||||
static void |
||||
fuzz_context_destroy(UNUSED struct fuzz_renderer *renderer, uint32_t ctx_id) |
||||
{ |
||||
virgl_renderer_context_destroy(ctx_id); |
||||
} |
||||
|
||||
static void |
||||
fuzz_context_submit(UNUSED struct fuzz_renderer *renderer, |
||||
uint32_t ctx_id, |
||||
const uint8_t *data, |
||||
size_t size) |
||||
{ |
||||
virgl_renderer_submit_cmd((void *)data, ctx_id, size / 4); |
||||
} |
||||
|
||||
int |
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) |
||||
{ |
||||
struct fuzz_renderer *renderer = fuzz_renderer_get(); |
||||
|
||||
const uint32_t ctx_id = fuzz_context_create(renderer); |
||||
fuzz_context_submit(renderer, ctx_id, data, size); |
||||
fuzz_context_destroy(renderer, ctx_id); |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue