Files
Romain TISSERAND 2986c1a08c [Core/CD] Bump libchdr and adjust build (#586)
* Bump libchdr and adjust build
* Additional zstd cleanup and fix Wii build
* Fix libretro/android build
* Fix standalone sdl/gx_vstudio projects
* Fix CHD loading for libretro
2025-07-24 19:31:11 +02:00

81 lines
2.2 KiB
C

#include <libchdr/chd.h>
#include <libchdr/coretypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
const uint8_t *buffer;
size_t buffer_size;
size_t buffer_pos;
} membuf;
static uint64_t membuf_fsize(struct chd_core_file *cf) {
return ((membuf *)cf->argp)->buffer_size;
}
static size_t membuf_fread(void *buf, size_t size, size_t count,
struct chd_core_file *cf) {
membuf *mb = (membuf *)cf->argp;
if ((UINT32_MAX / size) < count)
return 0;
size_t copy = size * count;
size_t remain = mb->buffer_size - mb->buffer_pos;
if (remain < copy)
copy = remain;
memcpy(buf, &mb->buffer[mb->buffer_pos], copy);
mb->buffer_pos += copy;
return copy;
}
static int membuf_fclose(struct chd_core_file *cf) { return 0; }
static int membuf_fseek(struct chd_core_file *cf, int64_t pos, int origin) {
membuf *mb = (membuf *)cf->argp;
if (origin == SEEK_SET) {
if (pos < 0 || (size_t)pos > mb->buffer_size)
return -1;
mb->buffer_pos = (size_t)pos;
return 0;
} else if (origin == SEEK_CUR) {
if (pos < 0 && (size_t)-pos > mb->buffer_pos)
return -1;
else if ((mb->buffer_pos + (size_t)pos) > mb->buffer_size)
return -1;
mb->buffer_pos =
(pos < 0) ? (mb->buffer_pos - (size_t)-pos) : (mb->buffer_pos + pos);
return 0;
} else if (origin == SEEK_END) {
mb->buffer_pos = mb->buffer_size;
return 0;
} else {
return -1;
}
}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
unsigned int i;
unsigned int totalbytes;
void *buffer;
membuf mb = {data, size, 0u};
struct chd_core_file cf = {&mb, membuf_fsize, membuf_fread, membuf_fclose,
membuf_fseek};
chd_file *file;
const chd_header *header;
chd_error err = chd_open_core_file(&cf, CHD_OPEN_READ, NULL, &file);
if (err != CHDERR_NONE)
return 0;
header = chd_get_header(file);
totalbytes = header->hunkbytes * header->totalhunks;
buffer = malloc(header->hunkbytes);
for (i = 0; i < header->totalhunks; i++) {
err = chd_read(file, i, buffer);
if (err != CHDERR_NONE)
continue;
}
free(buffer);
chd_close(file);
return 0;
}