blob: 372ee055a5196cdcf273823d4ab801e8140886cf [file] [log] [blame]
Robert Swiecki47476f22017-09-28 15:45:02 +02001/*
2 *
3 * honggfuzz - file operations
4 * -----------------------------------------
5 *
6 * Author: Robert Swiecki <swiecki@google.com>
7 *
Robert Swiecki46288f72018-02-27 17:28:47 +01008 * Copyright 2010-2018 by Google Inc. All Rights Reserved.
Robert Swiecki47476f22017-09-28 15:45:02 +02009 *
10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
11 * not use this file except in compliance with the License. You may obtain
12 * a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
19 * implied. See the License for the specific language governing
20 * permissions and limitations under the License.
21 *
22 */
23
24#include "input.h"
25
26#include <dirent.h>
27#include <errno.h>
28#include <fcntl.h>
29#include <inttypes.h>
30#include <stdint.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <sys/mman.h>
35#include <sys/socket.h>
36#include <sys/stat.h>
37#include <sys/types.h>
38#include <unistd.h>
39
Robert Swiecki246af3e2018-01-05 14:56:32 +010040#include "libhfcommon/common.h"
41#include "libhfcommon/files.h"
Robert Swiecki0f2c30a2018-01-13 14:03:39 +010042#include "mangle.h"
43#include "subproc.h"
Robert Swiecki47476f22017-09-28 15:45:02 +020044
45#if defined(_HF_ARCH_LINUX)
46#include <sys/syscall.h>
47#if defined(__NR_memfd_create)
48#include <linux/memfd.h>
Robert Swiecki4e595fb2017-10-11 17:26:51 +020049#endif /* defined(__NR_memfd_create) */
50#endif /* defined(_HF_ARCH_LINUX) */
Robert Swiecki47476f22017-09-28 15:45:02 +020051
Robert Swiecki246af3e2018-01-05 14:56:32 +010052#include "libhfcommon/log.h"
53#include "libhfcommon/util.h"
Robert Swiecki47476f22017-09-28 15:45:02 +020054
Robert Swiecki0f2c30a2018-01-13 14:03:39 +010055void input_setSize(run_t* run, size_t sz) {
Robert Swieckie9231d62018-03-02 03:35:11 +010056 if (sz > run->global->mutate.maxFileSz) {
57 PLOG_F("Too large size requested: %zu > maxSize: %zu", sz, run->global->mutate.maxFileSz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +010058 }
Robert Swiecki56ca1442019-02-19 15:17:49 +010059 /* ftruncate of a mmaped file fails under CygWin, it's also painfully slow under MacOS X */
60#if !defined(__CYGWIN__) && !defined(_HF_ARCH_DARWIN)
Robert Swiecki106c2dd2019-02-11 00:28:16 +010061 if (TEMP_FAILURE_RETRY(ftruncate(run->dynamicFileFd, sz)) == -1) {
62 PLOG_W("ftruncate(run->dynamicFileFd=%d, sz=%zu)", run->dynamicFileFd, sz);
plusun98022492018-08-06 07:16:24 +000063 }
Robert Swiecki56ca1442019-02-19 15:17:49 +010064#endif /* !defined(__CYGWIN__) && !defined(_HF_ARCH_DARWIN) */
Robert Swieckia31b60b2019-02-11 00:04:13 +010065 run->dynamicFileSz = sz;
Robert Swiecki0f2c30a2018-01-13 14:03:39 +010066}
67
Robert Swieckid50ed422017-11-13 23:32:26 +010068static bool input_getDirStatsAndRewind(honggfuzz_t* hfuzz) {
Robert Swieckia35d9d82017-12-15 22:00:41 +010069 rewinddir(hfuzz->io.inputDirPtr);
Robert Swiecki47476f22017-09-28 15:45:02 +020070
71 size_t maxSize = 0U;
72 size_t fileCnt = 0U;
73 for (;;) {
74 errno = 0;
Robert Swieckia35d9d82017-12-15 22:00:41 +010075 struct dirent* entry = readdir(hfuzz->io.inputDirPtr);
Robert Swiecki47476f22017-09-28 15:45:02 +020076 if (entry == NULL && errno == EINTR) {
77 continue;
78 }
79 if (entry == NULL && errno != 0) {
Robert Swiecki82c707c2017-11-14 16:36:23 +010080 PLOG_W("readdir('%s')", hfuzz->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +020081 return false;
82 }
83 if (entry == NULL) {
84 break;
85 }
86
87 char fname[PATH_MAX];
Robert Swiecki82c707c2017-11-14 16:36:23 +010088 snprintf(fname, sizeof(fname), "%s/%s", hfuzz->io.inputDir, entry->d_name);
Robert Swiecki47476f22017-09-28 15:45:02 +020089 LOG_D("Analyzing file '%s'", fname);
90
91 struct stat st;
92 if (stat(fname, &st) == -1) {
93 LOG_W("Couldn't stat() the '%s' file", fname);
94 continue;
95 }
96 if (!S_ISREG(st.st_mode)) {
97 LOG_D("'%s' is not a regular file, skipping", fname);
98 continue;
99 }
Robert Swieckie9231d62018-03-02 03:35:11 +0100100 if (hfuzz->mutate.maxFileSz != 0UL && st.st_size > (off_t)hfuzz->mutate.maxFileSz) {
Robert Swiecki3b7ccf62018-01-25 20:16:52 +0100101 LOG_D("File '%s' is bigger than maximal defined file size (-F): %" PRId64 " > %" PRId64,
Robert Swieckie9231d62018-03-02 03:35:11 +0100102 fname, (int64_t)st.st_size, (int64_t)hfuzz->mutate.maxFileSz);
Robert Swiecki47476f22017-09-28 15:45:02 +0200103 }
Robert Swiecki4e595fb2017-10-11 17:26:51 +0200104 if ((size_t)st.st_size > maxSize) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200105 maxSize = st.st_size;
106 }
107 fileCnt++;
108 }
109
Robert Swiecki82c707c2017-11-14 16:36:23 +0100110 ATOMIC_SET(hfuzz->io.fileCnt, fileCnt);
Robert Swieckie9231d62018-03-02 03:35:11 +0100111 if (hfuzz->mutate.maxFileSz == 0U) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200112 if (maxSize < 8192) {
Robert Swieckie9231d62018-03-02 03:35:11 +0100113 hfuzz->mutate.maxFileSz = 8192;
Robert Swiecki0a01ea72018-01-11 01:50:18 +0100114 } else if (maxSize > _HF_INPUT_MAX_SIZE) {
Robert Swieckie9231d62018-03-02 03:35:11 +0100115 hfuzz->mutate.maxFileSz = _HF_INPUT_MAX_SIZE;
Robert Swiecki47476f22017-09-28 15:45:02 +0200116 } else {
Robert Swieckie9231d62018-03-02 03:35:11 +0100117 hfuzz->mutate.maxFileSz = maxSize;
Robert Swiecki47476f22017-09-28 15:45:02 +0200118 }
119 }
Robert Swiecki47476f22017-09-28 15:45:02 +0200120
Robert Swiecki82c707c2017-11-14 16:36:23 +0100121 if (hfuzz->io.fileCnt == 0U) {
122 LOG_W("No usable files in the input directory '%s'", hfuzz->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200123 }
124
Robert Swiecki82c707c2017-11-14 16:36:23 +0100125 LOG_D("Re-read the '%s', maxFileSz:%zu, number of usable files:%zu", hfuzz->io.inputDir,
Robert Swieckie9231d62018-03-02 03:35:11 +0100126 hfuzz->mutate.maxFileSz, hfuzz->io.fileCnt);
Robert Swiecki47476f22017-09-28 15:45:02 +0200127
Robert Swieckia35d9d82017-12-15 22:00:41 +0100128 rewinddir(hfuzz->io.inputDirPtr);
Robert Swiecki47476f22017-09-28 15:45:02 +0200129
130 return true;
131}
132
Robert Swieckid50ed422017-11-13 23:32:26 +0100133bool input_getNext(run_t* run, char* fname, bool rewind) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200134 static pthread_mutex_t input_mutex = PTHREAD_MUTEX_INITIALIZER;
135 MX_SCOPED_LOCK(&input_mutex);
136
Robert Swiecki82c707c2017-11-14 16:36:23 +0100137 if (run->global->io.fileCnt == 0U) {
Robert Swiecki40332e92018-01-14 16:50:35 +0100138 LOG_W("No useful files in the input directory");
Robert Swiecki47476f22017-09-28 15:45:02 +0200139 return false;
140 }
141
142 for (;;) {
143 errno = 0;
Robert Swieckia35d9d82017-12-15 22:00:41 +0100144 struct dirent* entry = readdir(run->global->io.inputDirPtr);
Robert Swiecki47476f22017-09-28 15:45:02 +0200145 if (entry == NULL && errno == EINTR) {
146 continue;
147 }
148 if (entry == NULL && errno != 0) {
Robert Swiecki82c707c2017-11-14 16:36:23 +0100149 PLOG_W("readdir_r('%s')", run->global->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200150 return false;
151 }
152 if (entry == NULL && rewind == false) {
153 return false;
154 }
155 if (entry == NULL && rewind == true) {
Robert Swiecki78633d12017-11-13 23:24:55 +0100156 if (input_getDirStatsAndRewind(run->global) == false) {
Robert Swiecki82c707c2017-11-14 16:36:23 +0100157 LOG_E("input_getDirStatsAndRewind('%s')", run->global->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200158 return false;
159 }
160 continue;
161 }
162
Robert Swiecki82c707c2017-11-14 16:36:23 +0100163 snprintf(fname, PATH_MAX, "%s/%s", run->global->io.inputDir, entry->d_name);
Robert Swiecki47476f22017-09-28 15:45:02 +0200164
165 struct stat st;
166 if (stat(fname, &st) == -1) {
167 LOG_W("Couldn't stat() the '%s' file", fname);
168 continue;
169 }
170 if (!S_ISREG(st.st_mode)) {
171 LOG_D("'%s' is not a regular file, skipping", fname);
172 continue;
173 }
Robert Swiecki47476f22017-09-28 15:45:02 +0200174 return true;
175 }
176}
177
Robert Swieckid50ed422017-11-13 23:32:26 +0100178bool input_init(honggfuzz_t* hfuzz) {
Robert Swiecki82c707c2017-11-14 16:36:23 +0100179 hfuzz->io.fileCnt = 0U;
Robert Swiecki47476f22017-09-28 15:45:02 +0200180
Robert Swiecki82c707c2017-11-14 16:36:23 +0100181 if (!hfuzz->io.inputDir) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200182 LOG_W("No input file/dir specified");
183 return false;
184 }
185
Robert Swieckiaf7a92b2019-04-17 22:02:53 +0200186 int dir_fd = TEMP_FAILURE_RETRY(open(hfuzz->io.inputDir, O_DIRECTORY | O_RDONLY | O_CLOEXEC));
Robert Swiecki47476f22017-09-28 15:45:02 +0200187 if (dir_fd == -1) {
Robert Swiecki82c707c2017-11-14 16:36:23 +0100188 PLOG_W("open('%s', O_DIRECTORY|O_RDONLY|O_CLOEXEC)", hfuzz->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200189 return false;
190 }
Robert Swieckia35d9d82017-12-15 22:00:41 +0100191 if ((hfuzz->io.inputDirPtr = fdopendir(dir_fd)) == NULL) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200192 close(dir_fd);
Robert Swiecki82c707c2017-11-14 16:36:23 +0100193 PLOG_W("opendir('%s')", hfuzz->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200194 return false;
195 }
196 if (input_getDirStatsAndRewind(hfuzz) == false) {
Robert Swiecki82c707c2017-11-14 16:36:23 +0100197 hfuzz->io.fileCnt = 0U;
198 LOG_W("input_getDirStatsAndRewind('%s')", hfuzz->io.inputDir);
Robert Swiecki47476f22017-09-28 15:45:02 +0200199 return false;
200 }
201
202 return true;
203}
204
Robert Swieckid50ed422017-11-13 23:32:26 +0100205bool input_parseDictionary(honggfuzz_t* hfuzz) {
Robert Swiecki04dcac32018-03-02 03:05:26 +0100206 FILE* fDict = fopen(hfuzz->mutate.dictionaryFile, "rb");
Robert Swiecki47476f22017-09-28 15:45:02 +0200207 if (fDict == NULL) {
Robert Swiecki04dcac32018-03-02 03:05:26 +0100208 PLOG_W("Couldn't open '%s' - R/O mode", hfuzz->mutate.dictionaryFile);
Robert Swiecki47476f22017-09-28 15:45:02 +0200209 return false;
210 }
Robert Swiecki3ab16642018-01-12 18:08:37 +0100211 defer {
212 fclose(fDict);
213 };
Robert Swiecki47476f22017-09-28 15:45:02 +0200214
Robert Swiecki4e595fb2017-10-11 17:26:51 +0200215 char* lineptr = NULL;
Robert Swiecki47476f22017-09-28 15:45:02 +0200216 size_t n = 0;
Robert Swiecki3ab16642018-01-12 18:08:37 +0100217 defer {
218 free(lineptr);
219 };
Robert Swiecki47476f22017-09-28 15:45:02 +0200220 for (;;) {
221 ssize_t len = getdelim(&lineptr, &n, '\n', fDict);
222 if (len == -1) {
223 break;
224 }
225 if (len > 1 && lineptr[len - 1] == '\n') {
226 lineptr[len - 1] = '\0';
227 len--;
228 }
229 if (lineptr[0] == '#') {
230 continue;
231 }
232 if (lineptr[0] == '\n') {
233 continue;
234 }
235 if (lineptr[0] == '\0') {
236 continue;
237 }
Robert Swiecki49117302017-12-27 20:47:31 +0100238 char bufn[1025] = {};
239 char bufv[1025] = {};
Robert Swiecki40332e92018-01-14 16:50:35 +0100240 if (sscanf(lineptr, "\"%1024s", bufv) != 1 &&
241 sscanf(lineptr, "%1024[^=]=\"%1024s", bufn, bufv) != 2) {
Robert Swiecki47476f22017-09-28 15:45:02 +0200242 LOG_W("Incorrect dictionary entry: '%s'. Skipping", lineptr);
243 continue;
244 }
245
Robert Swiecki40332e92018-01-14 16:50:35 +0100246 LOG_D("Parsing word: '%s'", bufv);
247
Robert Swiecki4e595fb2017-10-11 17:26:51 +0200248 char* s = util_StrDup(bufv);
249 struct strings_t* str = (struct strings_t*)util_Malloc(sizeof(struct strings_t));
Robert Swiecki47476f22017-09-28 15:45:02 +0200250 str->len = util_decodeCString(s);
251 str->s = s;
Robert Swiecki04dcac32018-03-02 03:05:26 +0100252 hfuzz->mutate.dictionaryCnt += 1;
253 TAILQ_INSERT_TAIL(&hfuzz->mutate.dictq, str, pointers);
Robert Swiecki47476f22017-09-28 15:45:02 +0200254
255 LOG_D("Dictionary: loaded word: '%s' (len=%zu)", str->s, str->len);
256 }
Robert Swiecki04dcac32018-03-02 03:05:26 +0100257 LOG_I("Loaded %zu words from the dictionary", hfuzz->mutate.dictionaryCnt);
Robert Swiecki47476f22017-09-28 15:45:02 +0200258 return true;
259}
260
Robert Swieckid50ed422017-11-13 23:32:26 +0100261bool input_parseBlacklist(honggfuzz_t* hfuzz) {
Robert Swieckia5b918a2018-03-07 23:59:53 +0100262 FILE* fBl = fopen(hfuzz->feedback.blacklistFile, "rb");
Robert Swiecki47476f22017-09-28 15:45:02 +0200263 if (fBl == NULL) {
Robert Swieckia5b918a2018-03-07 23:59:53 +0100264 PLOG_W("Couldn't open '%s' - R/O mode", hfuzz->feedback.blacklistFile);
Robert Swiecki47476f22017-09-28 15:45:02 +0200265 return false;
266 }
Robert Swiecki3ab16642018-01-12 18:08:37 +0100267 defer {
268 fclose(fBl);
269 };
Robert Swiecki47476f22017-09-28 15:45:02 +0200270
Robert Swiecki4e595fb2017-10-11 17:26:51 +0200271 char* lineptr = NULL;
Robert Swiecki47476f22017-09-28 15:45:02 +0200272 /* lineptr can be NULL, but it's fine for free() */
Robert Swiecki3ab16642018-01-12 18:08:37 +0100273 defer {
274 free(lineptr);
275 };
Robert Swiecki47476f22017-09-28 15:45:02 +0200276 size_t n = 0;
277 for (;;) {
278 if (getline(&lineptr, &n, fBl) == -1) {
279 break;
280 }
281
Robert Swieckia5b918a2018-03-07 23:59:53 +0100282 if ((hfuzz->feedback.blacklist = util_Realloc(hfuzz->feedback.blacklist,
283 (hfuzz->feedback.blacklistCnt + 1) * sizeof(hfuzz->feedback.blacklist[0]))) ==
284 NULL) {
285 PLOG_W("realloc failed (sz=%zu)",
286 (hfuzz->feedback.blacklistCnt + 1) * sizeof(hfuzz->feedback.blacklist[0]));
Robert Swiecki47476f22017-09-28 15:45:02 +0200287 return false;
288 }
289
Robert Swieckia5b918a2018-03-07 23:59:53 +0100290 hfuzz->feedback.blacklist[hfuzz->feedback.blacklistCnt] = strtoull(lineptr, 0, 16);
291 LOG_D("Blacklist: loaded %'" PRIu64 "'",
292 hfuzz->feedback.blacklist[hfuzz->feedback.blacklistCnt]);
Robert Swiecki47476f22017-09-28 15:45:02 +0200293
Robert Swiecki5eeb29b2018-01-21 16:07:06 +0100294 /* Verify entries are sorted so we can use interpolation search */
Robert Swieckia5b918a2018-03-07 23:59:53 +0100295 if (hfuzz->feedback.blacklistCnt > 1) {
296 if (hfuzz->feedback.blacklist[hfuzz->feedback.blacklistCnt - 1] >
297 hfuzz->feedback.blacklist[hfuzz->feedback.blacklistCnt]) {
Robert Swiecki98e23372019-01-30 11:50:18 +0100298 LOG_F("Blacklist file not sorted. Use 'tools/createStackBlacklist.sh' to sort "
299 "records");
Robert Swiecki47476f22017-09-28 15:45:02 +0200300 return false;
301 }
302 }
Robert Swieckia5b918a2018-03-07 23:59:53 +0100303 hfuzz->feedback.blacklistCnt += 1;
Robert Swiecki47476f22017-09-28 15:45:02 +0200304 }
305
Robert Swieckia5b918a2018-03-07 23:59:53 +0100306 if (hfuzz->feedback.blacklistCnt > 0) {
307 LOG_I("Loaded %zu stack hash(es) from the blacklist file", hfuzz->feedback.blacklistCnt);
Robert Swiecki47476f22017-09-28 15:45:02 +0200308 } else {
Robert Swieckia5b918a2018-03-07 23:59:53 +0100309 LOG_F("Empty stack hashes blacklist file '%s'", hfuzz->feedback.blacklistFile);
Robert Swiecki47476f22017-09-28 15:45:02 +0200310 }
311 return true;
312}
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100313
arnow117c7566f62019-04-09 05:14:11 +0800314bool input_prepareDynamicInput(run_t* run, bool need_mangele) {
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100315 {
Robert Swiecki363510f2018-03-09 02:00:30 +0100316 MX_SCOPED_RWLOCK_READ(&run->global->io.dynfileq_mutex);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100317
Robert Swiecki363510f2018-03-09 02:00:30 +0100318 if (run->global->io.dynfileqCnt == 0) {
Robert Swieckifb8a5b62018-01-14 05:16:59 +0100319 LOG_F("The dynamic file corpus is empty. This shouldn't happen");
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100320 }
321
322 if (run->dynfileqCurrent == NULL) {
Robert Swiecki363510f2018-03-09 02:00:30 +0100323 run->dynfileqCurrent = TAILQ_FIRST(&run->global->io.dynfileq);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100324 } else {
Robert Swiecki363510f2018-03-09 02:00:30 +0100325 if (run->dynfileqCurrent == TAILQ_LAST(&run->global->io.dynfileq, dyns_t)) {
326 run->dynfileqCurrent = TAILQ_FIRST(&run->global->io.dynfileq);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100327 } else {
328 run->dynfileqCurrent = TAILQ_NEXT(run->dynfileqCurrent, pointers);
329 }
330 }
331 }
332
333 input_setSize(run, run->dynfileqCurrent->size);
334 memcpy(run->dynamicFile, run->dynfileqCurrent->data, run->dynfileqCurrent->size);
Robert Swiecki251ee7c2019-04-17 21:56:22 +0200335 if (need_mangele) mangle_mangleContent(run);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100336
337 return true;
338}
339
arnow117c7566f62019-04-09 05:14:11 +0800340bool input_prepareStaticFile(run_t* run, bool rewind, bool need_mangele) {
Robert Swiecki94d314c2018-02-07 21:23:00 +0100341 char fname[PATH_MAX];
Robert Swieckifb8a5b62018-01-14 05:16:59 +0100342 if (!input_getNext(run, fname, /* rewind= */ rewind)) {
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100343 return false;
344 }
Robert Swiecki94d314c2018-02-07 21:23:00 +0100345 snprintf(run->origFileName, sizeof(run->origFileName), "%s", fname);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100346
Robert Swieckif31fdf72019-02-11 00:33:27 +0100347 input_setSize(run, run->global->mutate.maxFileSz);
Robert Swieckie9231d62018-03-02 03:35:11 +0100348 ssize_t fileSz = files_readFileToBufMax(fname, run->dynamicFile, run->global->mutate.maxFileSz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100349 if (fileSz < 0) {
350 LOG_E("Couldn't read contents of '%s'", fname);
351 return false;
352 }
353
354 input_setSize(run, fileSz);
Robert Swiecki251ee7c2019-04-17 21:56:22 +0200355 if (need_mangele) mangle_mangleContent(run);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100356
357 return true;
358}
359
360bool input_prepareExternalFile(run_t* run) {
Robert Swiecki94d314c2018-02-07 21:23:00 +0100361 snprintf(run->origFileName, sizeof(run->origFileName), "[EXTERNAL]");
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100362
Robert Swieckib4333062018-01-15 23:00:45 +0100363 int fd = files_writeBufToTmpFile(run->global->io.workDir, (const uint8_t*)"", 0, 0);
Robert Swieckicdb2f232018-01-15 23:05:58 +0100364 if (fd == -1) {
365 LOG_E("Couldn't write input file to a temporary buffer");
366 return false;
367 }
Robert Swieckib4333062018-01-15 23:00:45 +0100368 defer {
369 close(fd);
370 };
Robert Swieckib4333062018-01-15 23:00:45 +0100371
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100372 char fname[PATH_MAX];
Robert Swieckib4333062018-01-15 23:00:45 +0100373 snprintf(fname, sizeof(fname), "/dev/fd/%d", fd);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100374
375 const char* const argv[] = {run->global->exe.externalCommand, fname, NULL};
376 if (subproc_System(run, argv) != 0) {
377 LOG_E("Subprocess '%s' returned abnormally", run->global->exe.externalCommand);
378 return false;
379 }
380 LOG_D("Subporcess '%s' finished with success", run->global->exe.externalCommand);
381
Robert Swieckif31fdf72019-02-11 00:33:27 +0100382 input_setSize(run, run->global->mutate.maxFileSz);
Robert Swieckie9231d62018-03-02 03:35:11 +0100383 ssize_t sz = files_readFromFdSeek(fd, run->dynamicFile, run->global->mutate.maxFileSz, 0);
Robert Swieckib4333062018-01-15 23:00:45 +0100384 if (sz == -1) {
385 LOG_E("Couldn't read file from fd=%d", fd);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100386 return false;
387 }
388
Robert Swieckib4333062018-01-15 23:00:45 +0100389 input_setSize(run, (size_t)sz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100390 return true;
391}
392
393bool input_postProcessFile(run_t* run) {
Robert Swieckib4333062018-01-15 23:00:45 +0100394 int fd =
395 files_writeBufToTmpFile(run->global->io.workDir, run->dynamicFile, run->dynamicFileSz, 0);
Robert Swieckicdb2f232018-01-15 23:05:58 +0100396 if (fd == -1) {
397 LOG_E("Couldn't write input file to a temporary buffer");
398 return false;
399 }
Robert Swieckib4333062018-01-15 23:00:45 +0100400 defer {
401 close(fd);
402 };
Robert Swieckib4333062018-01-15 23:00:45 +0100403
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100404 char fname[PATH_MAX];
Robert Swieckib4333062018-01-15 23:00:45 +0100405 snprintf(fname, sizeof(fname), "/dev/fd/%d", fd);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100406
407 const char* const argv[] = {run->global->exe.postExternalCommand, fname, NULL};
408 if (subproc_System(run, argv) != 0) {
409 LOG_E("Subprocess '%s' returned abnormally", run->global->exe.postExternalCommand);
410 return false;
411 }
412 LOG_D("Subporcess '%s' finished with success", run->global->exe.externalCommand);
413
Robert Swieckif31fdf72019-02-11 00:33:27 +0100414 input_setSize(run, run->global->mutate.maxFileSz);
Robert Swieckie9231d62018-03-02 03:35:11 +0100415 ssize_t sz = files_readFromFdSeek(fd, run->dynamicFile, run->global->mutate.maxFileSz, 0);
Robert Swieckib4333062018-01-15 23:00:45 +0100416 if (sz == -1) {
417 LOG_E("Couldn't read file from fd=%d", fd);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100418 return false;
419 }
420
Robert Swieckib4333062018-01-15 23:00:45 +0100421 input_setSize(run, (size_t)sz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100422 return true;
423}
arnow117c7566f62019-04-09 05:14:11 +0800424
425bool input_feedbackMutateFile(run_t* run) {
426 int fd =
427 files_writeBufToTmpFile(run->global->io.workDir, run->dynamicFile, run->dynamicFileSz, 0);
428 if (fd == -1) {
429 LOG_E("Couldn't write input file to a temporary buffer");
430 return false;
431 }
432 defer {
433 close(fd);
434 };
435
436 char fname[PATH_MAX];
437 snprintf(fname, sizeof(fname), "/dev/fd/%d", fd);
438
439 const char* const argv[] = {run->global->exe.feedbackMutateCommand, fname, NULL};
440 if (subproc_System(run, argv) != 0) {
441 LOG_E("Subprocess '%s' returned abnormally", run->global->exe.feedbackMutateCommand);
442 return false;
443 }
444 LOG_D("Subporcess '%s' finished with success", run->global->exe.externalCommand);
445
446 input_setSize(run, run->global->mutate.maxFileSz);
447 ssize_t sz = files_readFromFdSeek(fd, run->dynamicFile, run->global->mutate.maxFileSz, 0);
448 if (sz == -1) {
449 LOG_E("Couldn't read file from fd=%d", fd);
450 return false;
451 }
452
453 input_setSize(run, (size_t)sz);
454 return true;
Robert Swieckiaf7a92b2019-04-17 22:02:53 +0200455}