Andrea Fioraldi 40b73d4b1b
Book refactoring and update (#280)
* llmp docs skeleton

* llmp documentation

* more llmp docu

* llmp

* some core concepts

* start working on tutorial

* adapted rng_core to lain

* fix tutorial build

* warnings, format

* add explanation

* No need to own the types

* metadata

* writing

* fmt

* tutorial folder

* lain needs nightly

* added mdbook test to ci

* fix ci, add linkcheck

* more book

* baby

* tutorial target

* fix mdbook build

* fix mdbook test

* more book

* fixed typo

* fixed build

* spawn instances'

* 'finish' book

* added sugar crate information

Co-authored-by: Dominik Maier <domenukk@gmail.com>
2021-09-27 09:39:32 +02:00

72 lines
1.5 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#define MAX_PACKET_SIZE 0x1000
typedef enum _packet_type {
data_read = 0x0,
data_write = 0x1,
data_reset = 0x2,
} packet_type;
#pragma pack(1)
typedef struct _packet_data {
packet_type type;
uint64_t offset;
uint64_t length;
char data[0];
} packet_data;
int LLVMFuzzerTestOneInput(const uint8_t *packet_buffer, size_t packet_length) {
ssize_t saved_data_length = 0;
char* saved_data = NULL;
int err = 0;
packet_data* datagram = NULL;
if (packet_length < sizeof(packet_data) || packet_length > MAX_PACKET_SIZE) {
return 1;
}
datagram = (packet_data*)packet_buffer;
switch (datagram->type) {
case data_read:
if (saved_data != NULL && datagram->offset + datagram->length <= saved_data_length) {
write(0, packet_buffer + datagram->offset, datagram->length);
}
break;
case data_write:
// NOTE: Who cares about checking the offset? Nobody would ever provide bad data
if (saved_data != NULL && datagram->length <= saved_data_length) {
memcpy(saved_data + datagram->offset, datagram->data, datagram->length);
}
break;
case data_reset:
if (datagram->length > packet_length - sizeof(*datagram)) {
return 1;
}
if (saved_data != NULL) {
free(saved_data);
}
saved_data = malloc(datagram->length);
saved_data_length = datagram->length;
memcpy(saved_data, datagram->data, datagram->length);
break;
default:
return 1;
}
return 0;
}