[openssl-commits] [openssl] OpenSSL_1_1_0-stable update

Richard Levitte levitte at openssl.org
Sat Mar 31 14:10:46 UTC 2018


The branch OpenSSL_1_1_0-stable has been updated
       via  df5caeff335877b25a02c40a84935c7c4584e396 (commit)
       via  0bdcf53fec5245bfc9ce27e438f4f5150f2c1d08 (commit)
      from  7ee2a43069913fb7c444c656048996ea92cc465e (commit)


- Log -----------------------------------------------------------------
commit df5caeff335877b25a02c40a84935c7c4584e396
Author: Richard Levitte <levitte at openssl.org>
Date:   Thu Mar 29 10:21:54 2018 +0200

    .travis.yml: with fast fuzz testing, there is no point avoiding it
    
    Reviewed-by: Bernd Edlinger <bernd.edlinger at hotmail.de>
    (Merged from https://github.com/openssl/openssl/pull/5788)

commit 0bdcf53fec5245bfc9ce27e438f4f5150f2c1d08
Author: Richard Levitte <levitte at openssl.org>
Date:   Wed Mar 28 15:46:28 2018 +0200

    Faster fuzz test: teach the fuzz test programs to handle directories
    
    Instead of invoking the fuzz test programs once for every corpora
    file, we invoke them once for each directory of corpora files.  This
    dramatically reduces the number of program invokations, as well as the
    time 90-test_fuzz.t takes to complete.
    
    fuzz/test-corpus.c was enhanced to handle directories as well as
    regular files.
    
    Reviewed-by: Bernd Edlinger <bernd.edlinger at hotmail.de>
    (Merged from https://github.com/openssl/openssl/pull/5788)

-----------------------------------------------------------------------

Summary of changes:
 .travis.yml                 |  4 +--
 fuzz/test-corpus.c          | 85 +++++++++++++++++++++++++++++++++++++--------
 test/recipes/90-test_fuzz.t | 10 +++---
 3 files changed, 77 insertions(+), 22 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index b5fc443..ba06dfd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -69,7 +69,7 @@ matrix:
                       - binutils-mingw-w64
                       - gcc-mingw-w64
           compiler: i686-w64-mingw32-gcc
-          env: CONFIG_OPTS="no-pic" TESTS="-test_fuzz"
+          env: CONFIG_OPTS="no-pic"
         - os: linux
           addons:
               apt:
@@ -85,7 +85,7 @@ matrix:
                       - binutils-mingw-w64
                       - gcc-mingw-w64
           compiler: x86_64-w64-mingw32-gcc
-          env: CONFIG_OPTS="no-pic" TESTS="-test_fuzz"
+          env: CONFIG_OPTS="no-pic"
         - os: linux
           addons:
               apt:
diff --git a/fuzz/test-corpus.c b/fuzz/test-corpus.c
index c553697..7eeac4c 100644
--- a/fuzz/test-corpus.c
+++ b/fuzz/test-corpus.c
@@ -16,31 +16,86 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/stat.h>
 #include <openssl/crypto.h>
 #include "fuzzer.h"
+#include "internal/o_dir.h"
 
-int main(int argc, char **argv) {
-    int n;
+#if defined(_WIN32) && defined(_MAX_PATH)
+# define PATH_MAX _MAX_PATH
+#endif
 
-    FuzzerInitialize(&argc, &argv);
+#ifndef PATH_MAX
+# define PATH_MAX 4096
+#endif
 
-    for (n = 1; n < argc; ++n) {
-        struct stat st;
-        FILE *f;
-        unsigned char *buf;
-        size_t s;
-
-        stat(argv[n], &st);
-        f = fopen(argv[n], "rb");
-        if (f == NULL)
-            continue;
-        buf = malloc(st.st_size);
+# if !defined(S_ISREG)
+#   define S_ISREG(m) ((m) & S_IFREG)
+# endif
+
+static void testfile(const char *pathname)
+{
+    struct stat st;
+    FILE *f;
+    unsigned char *buf;
+    size_t s;
+
+    if (stat(pathname, &st) < 0 || !S_ISREG(st.st_mode))
+        return;
+    printf("# %s\n", pathname);
+    fflush(stdout);
+    f = fopen(pathname, "rb");
+    if (f == NULL)
+        return;
+    buf = malloc(st.st_size);
+    if (buf != NULL) {
         s = fread(buf, 1, st.st_size, f);
         OPENSSL_assert(s == (size_t)st.st_size);
         FuzzerTestOneInput(buf, s);
         free(buf);
-        fclose(f);
+    }
+    fclose(f);
+}
+
+int main(int argc, char **argv) {
+    int n;
+
+    FuzzerInitialize(&argc, &argv);
+
+    for (n = 1; n < argc; ++n) {
+        size_t dirname_len = strlen(argv[n]);
+        const char *filename = NULL;
+        char *pathname = NULL;
+        OPENSSL_DIR_CTX *ctx = NULL;
+        int wasdir = 0;
+
+        /*
+         * We start with trying to read the given path as a directory.
+         */
+        while ((filename = OPENSSL_DIR_read(&ctx, argv[n])) != NULL) {
+            wasdir = 1;
+            if (pathname == NULL) {
+                pathname = malloc(PATH_MAX);
+                if (pathname == NULL)
+                    break;
+                strcpy(pathname, argv[n]);
+#ifdef __VMS
+                if (strchr(":<]", pathname[dirname_len - 1]) == NULL)
+#endif
+                    pathname[dirname_len++] = '/';
+                pathname[dirname_len] = '\0';
+            }
+            strcpy(pathname + dirname_len, filename);
+            testfile(pathname);
+        }
+        OPENSSL_DIR_end(&ctx);
+
+        /* If it wasn't a directory, treat it as a file instead */
+        if (!wasdir)
+            testfile(argv[n]);
+
+        free(pathname);
     }
     return 0;
 }
diff --git a/test/recipes/90-test_fuzz.t b/test/recipes/90-test_fuzz.t
index d152925..753a1f2 100644
--- a/test/recipes/90-test_fuzz.t
+++ b/test/recipes/90-test_fuzz.t
@@ -26,14 +26,14 @@ plan tests => scalar @fuzzers;
 
 foreach my $f (@fuzzers) {
     subtest "Fuzzing $f" => sub {
-        my @files = glob(srctop_file('fuzz', 'corpora', $f, '*'));
-        push @files, glob(srctop_file('fuzz', 'corpora', "$f-*", '*'));
+        my @dirs = glob(srctop_file('fuzz', 'corpora', $f));
+        push @dirs, glob(srctop_file('fuzz', 'corpora', "$f-*"));
 
-        plan skip_all => "No corpora for $f-test" unless @files;
+        plan skip_all => "No corpora for $f-test" unless @dirs;
 
-        plan tests => scalar @files;
+        plan tests => scalar @dirs;
 
-        foreach (@files) {
+        foreach (@dirs) {
             ok(run(fuzz(["$f-test", $_])));
         }
     }


More information about the openssl-commits mailing list