diff --git a/programs/util.c b/programs/util.c index dae26bad..769ec8b7 100644 --- a/programs/util.c +++ b/programs/util.c @@ -642,6 +642,15 @@ void UTIL_expandFNT(FileNamesTable** fnt, int followLinks) *fnt = newFNT; } +FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames) +{ + size_t const sizeof_FNTable = nbFilenames * sizeof(*filenames); + const char** const newFNTable = (const char**)malloc(sizeof_FNTable); + if (newFNTable==NULL) return NULL; + memcpy(newFNTable, filenames, sizeof_FNTable); + return UTIL_createFileNamesTable(newFNTable, nbFilenames, NULL); +} + /*-**************************************** * count the number of physical cores diff --git a/programs/util.h b/programs/util.h index 6808c4e3..91a449a6 100644 --- a/programs/util.h +++ b/programs/util.h @@ -204,6 +204,14 @@ UTIL_mergeFileNamesTable(FileNamesTable* table1, FileNamesTable* table2); */ void UTIL_expandFNT(FileNamesTable** fnt, int followLinks); +/*! UTIL_createFNT_fromROTable() : + * copy the @filenames pointer table inside the returned object. + * The names themselves are still stored in their original buffer, which must outlive the object. + * @return : a FileNamesTable* object, + * or NULL in case of error + */ +FileNamesTable* UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames); + /*! UTIL_createExpandedFNT() : * read names from @filenames, and expand those corresponding to directories * @return : an expanded FileNamesTable*, where each name is a file diff --git a/tests/fuzz/regression_driver.c b/tests/fuzz/regression_driver.c index e3ebcd5c..e91ef0de 100644 --- a/tests/fuzz/regression_driver.c +++ b/tests/fuzz/regression_driver.c @@ -18,24 +18,26 @@ int main(int argc, char const **argv) { size_t const kMaxFileSize = (size_t)1 << 27; int const kFollowLinks = 1; - char *fileNamesBuf = NULL; - char const **files = argv + 1; - unsigned numFiles = argc - 1; + FileNamesTable* files; + const char** const fnTable = argv + 1; + unsigned numFiles = (unsigned)(argc - 1); uint8_t *buffer = NULL; size_t bufferSize = 0; unsigned i; int ret; #ifdef UTIL_HAS_CREATEFILELIST - files = UTIL_createFileList(files, numFiles, &fileNamesBuf, &numFiles, - kFollowLinks); - if (!files) - numFiles = 0; + files = UTIL_createExpandedFNT(fnTable, numFiles, kFollowLinks); + if (!files) numFiles = 0; +#else + files = UTIL_createFNT_fromROTable(fnTable, numFiles); + if (!files) numFiles = 0; #endif + if (files) assert(numFiles == files->tableSize); if (numFiles == 0) fprintf(stderr, "WARNING: No files passed to %s\n", argv[0]); for (i = 0; i < numFiles; ++i) { - char const *fileName = files[i]; + char const *fileName = files->fileNames[i]; DEBUGLOG(3, "Running %s", fileName); size_t const fileSize = UTIL_getFileSize(fileName); size_t readSize; @@ -70,8 +72,6 @@ int main(int argc, char const **argv) { ret = 0; free(buffer); -#ifdef UTIL_HAS_CREATEFILELIST - UTIL_freeFileList(files, fileNamesBuf); -#endif + UTIL_freeFileNamesTable(files); return ret; } diff --git a/tests/regression/data.c b/tests/regression/data.c index 86e7687d..631a6f27 100644 --- a/tests/regression/data.c +++ b/tests/regression/data.c @@ -173,21 +173,10 @@ void data_buffer_free(data_buffer_t buffer) { * data filenames helpers. */ -data_filenames_t data_filenames_get(data_t const* data) { - data_filenames_t filenames = {.buffer = NULL, .size = 0}; - char const* path = data->data.path; - - filenames.filenames = UTIL_createFileList( - &path, - 1, - &filenames.buffer, - &filenames.size, - /* followLinks */ 0); - return filenames; -} - -void data_filenames_free(data_filenames_t filenames) { - UTIL_freeFileList(filenames.filenames, filenames.buffer); +FileNamesTable* data_filenames_get(data_t const* data) +{ + char const* const path = data->data.path; + return UTIL_createExpandedFNT(&path, 1, 0 /* followLinks */ ); } /** @@ -196,26 +185,33 @@ void data_filenames_free(data_filenames_t filenames) { data_buffers_t data_buffers_get(data_t const* data) { data_buffers_t buffers = {.size = 0}; - data_filenames_t filenames = data_filenames_get(data); - if (filenames.size == 0) + FileNamesTable* const filenames = data_filenames_get(data); + if (filenames == NULL) return buffers; + if (filenames->tableSize == 0) { + UTIL_freeFileNamesTable(filenames); return buffers; + } data_buffer_t* buffersPtr = - (data_buffer_t*)malloc(filenames.size * sizeof(data_buffer_t)); - if (buffersPtr == NULL) + (data_buffer_t*)malloc(filenames->tableSize * sizeof(*buffersPtr)); + if (buffersPtr == NULL) { + UTIL_freeFileNamesTable(filenames); return buffers; + } buffers.buffers = (data_buffer_t const*)buffersPtr; - buffers.size = filenames.size; + buffers.size = filenames->tableSize; - for (size_t i = 0; i < filenames.size; ++i) { - buffersPtr[i] = data_buffer_read(filenames.filenames[i]); + for (size_t i = 0; i < filenames->tableSize; ++i) { + buffersPtr[i] = data_buffer_read(filenames->fileNames[i]); if (buffersPtr[i].data == NULL) { data_buffers_t const kEmptyBuffer = {}; data_buffers_free(buffers); + UTIL_freeFileNamesTable(filenames); return kEmptyBuffer; } } + UTIL_freeFileNamesTable(filenames); return buffers; } diff --git a/tests/regression/data.h b/tests/regression/data.h index 717fe129..2de8134f 100644 --- a/tests/regression/data.h +++ b/tests/regression/data.h @@ -102,25 +102,6 @@ int data_buffer_compare(data_buffer_t buffer1, data_buffer_t buffer2); */ void data_buffer_free(data_buffer_t buffer); -typedef struct { - char* buffer; - char const** filenames; - unsigned size; -} data_filenames_t; - -/** - * Get a recursive list of filenames in the data object. If it is a file, it - * will only contain one entry. If it is a directory, it will recursively walk - * the directory. - * - * @returns The list of filenames, which has size 0 and NULL pointers on error. - */ -data_filenames_t data_filenames_get(data_t const* data); - -/** - * Frees the filenames table. - */ -void data_filenames_free(data_filenames_t filenames); typedef struct { data_buffer_t const* buffers;