]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
updated fuzz tests to use FileNamesTable* abstraction
authorYann Collet <cyan@fb.com>
Wed, 6 Nov 2019 22:42:13 +0000 (14:42 -0800)
committerYann Collet <cyan@fb.com>
Wed, 6 Nov 2019 22:42:13 +0000 (14:42 -0800)
programs/util.c
programs/util.h
tests/fuzz/regression_driver.c
tests/regression/data.c
tests/regression/data.h

index dae26badb6ac5aca1ef16848624fa9cd2761060b..769ec8b73b864f3ad57bc83e928a8c30e398bd5c 100644 (file)
@@ -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
index 6808c4e3dd2984191a76567d78400722f76ce9f8..91a449a679a5df57168f7e0f43d28c1e28db7aa2 100644 (file)
@@ -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
index e3ebcd5ced7477fb3db216dee78f8b31456c9526..e91ef0def7e49642b7b72e308a9c2c8446de3db1 100644 (file)
 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;
 }
index 86e7687de5ee1a451d6cd8b0bd239261bbba2814..631a6f27f576c7e98b1cb6a184714eb996505b86 100644 (file)
@@ -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;
 }
 
index 717fe1294c1463ab304f4dbb4b4242cc988c957c..2de8134f52a8b9147909a58af68382dcfd57c3a1 100644 (file)
@@ -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;