suricata
fuzz_mimedecparseline.c
Go to the documentation of this file.
1 /**
2  * @file
3  * @author Philippe Antoine <contact@catenacyber.fr>
4  * fuzz target for ConfYamlLoadString
5  */
6 
7 
8 #include "suricata-common.h"
9 #include "suricata.h"
10 #include "util-decode-mime.h"
11 
12 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
13 
14 static int initialized = 0;
15 static int dummy = 0;
16 
17 static int MimeParserDataFromFileCB(const uint8_t *chunk, uint32_t len,
18  MimeDecParseState *state)
19 {
20  if (len > 0 && chunk[len-1] == 0) {
21  // do not get optimized away
22  dummy++;
23  }
24  return MIME_DEC_OK;
25 }
26 
27 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
28 {
29  if (initialized == 0) {
30  //Redirects logs to /dev/null
31  setenv("SC_LOG_OP_IFACE", "file", 0);
32  setenv("SC_LOG_FILE", "/dev/null", 0);
33  //global init
34  InitGlobal();
36  initialized = 1;
37  }
38 
39  uint32_t line_count = 0;
40 
41  MimeDecParseState *state = MimeDecInitParser(&line_count, MimeParserDataFromFileCB);
42  MimeDecEntity *msg_head = state->msg;
43  const uint8_t * buffer = data;
44  while (1) {
45  uint8_t * next = memchr(buffer, '\n', size);
46  if (next == NULL) {
47  if (state->state_flag >= BODY_STARTED)
48  (void)MimeDecParseLine(buffer, size, 0, state);
49  break;
50  } else {
51  (void) MimeDecParseLine(buffer, next - buffer, 1, state);
52  if (buffer + size < next + 1) {
53  break;
54  }
55  size -= next - buffer + 1;
56  buffer = next + 1;
57  }
58  }
59  /* Completed */
60  (void)MimeDecParseComplete(state);
61  /* De Init parser */
62  MimeDecDeInitParser(state);
63  MimeDecFreeEntity(msg_head);
64 
65  return 0;
66 }
MimeDecParseComplete
int MimeDecParseComplete(MimeDecParseState *state)
Called to indicate that the last message line has been processed and the parsing operation is complet...
Definition: util-decode-mime.c:2500
len
uint8_t len
Definition: app-layer-dnp3.h:2
MIME_DEC_OK
@ MIME_DEC_OK
Definition: util-decode-mime.h:78
RUNMODE_UNITTEST
@ RUNMODE_UNITTEST
Definition: runmodes.h:41
MimeDecParseLine
int MimeDecParseLine(const uint8_t *line, const uint32_t len, const uint8_t delim_len, MimeDecParseState *state)
Parse a line of a MIME message and update the parser state.
Definition: util-decode-mime.c:2568
next
struct HtpBodyChunk_ * next
Definition: app-layer-htp.h:0
SCRunmodeSet
void SCRunmodeSet(int run_mode)
Set the current run mode.
Definition: suricata.c:268
MimeDecInitParser
MimeDecParseState * MimeDecInitParser(void *data, int(*DataChunkProcessorFunc)(const uint8_t *chunk, uint32_t len, MimeDecParseState *state))
Init the parser by allocating memory for the state and top-level entity.
Definition: util-decode-mime.c:2414
BODY_STARTED
#define BODY_STARTED
Definition: util-decode-mime.h:68
setenv
void setenv(const char *name, const char *value, int overwrite)
MimeDecParseState::msg
MimeDecEntity * msg
Definition: util-decode-mime.h:187
suricata-common.h
util-decode-mime.h
MimeDecParseState
Structure contains the current state of the MIME parser.
Definition: util-decode-mime.h:186
LLVMFuzzerTestOneInput
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition: fuzz_mimedecparseline.c:27
MimeDecFreeEntity
void MimeDecFreeEntity(MimeDecEntity *entity)
Frees a mime entity tree.
Definition: util-decode-mime.c:176
suricata.h
InitGlobal
int InitGlobal(void)
Global initialization common to all runmodes.
Definition: suricata.c:2875
MimeDecDeInitParser
void MimeDecDeInitParser(MimeDecParseState *state)
De-Init parser by freeing up any residual memory.
Definition: util-decode-mime.c:2464
MimeDecEntity
This represents the MIME Entity (or also top level message) in a child-sibling tree.
Definition: util-decode-mime.h:132
MimeDecParseState::state_flag
uint8_t state_flag
Definition: util-decode-mime.h:199