testutil: ensure good treatment of argv on non-Unix platforms
authorRichard Levitte <levitte@openssl.org>
Sun, 3 Mar 2019 09:27:10 +0000 (10:27 +0100)
committerRichard Levitte <levitte@openssl.org>
Tue, 5 Mar 2019 07:53:19 +0000 (08:53 +0100)
From a Unix point of view, some other platform families have certain
quirks.  Windows command prompt doesn't expand globs into actual file
names, so we must do this.  VMS has some oddity with argv pointer size
that can cause crashes if you're not careful (by copying it to a less
surprising pointer size array).

The fixups already exist and are used in the apps/ code.  However, the
testutil code started using the opt routines from apps/ without
including the non-Unix fixups.  This change fixes that.

For VMS' sake, libtestutil gets an app_malloc() shim, to avoid sucking
in all of apps/apps.c.

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8381)

apps/include/apps.h
apps/include/platform.h [new file with mode: 0644]
apps/vms_decc_argv.c
test/build.info
test/testutil/apps_mem.c [new file with mode: 0644]
test/testutil/driver.c

index da8eae2d87a66750dce1c52f447d5f3b51853cc1..59e3e928210d5a0d37120dbcb5e15f2505eaedf1 100644 (file)
@@ -32,6 +32,7 @@
 # include "apps_ui.h"
 # include "opt.h"
 # include "fmt.h"
+# include "platform.h"
 
 # if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINCE)
 #  define openssl_fdset(a,b) FD_SET((unsigned int)a, b)
@@ -97,18 +98,6 @@ typedef struct args_st {
     char **argv;
 } ARGS;
 
-/*
- * VMS C only for now, implemented in vms_decc_init.c
- * If other C compilers forget to terminate argv with NULL, this function
- * can be re-used.
- */
-char **copy_argv(int *argc, char *argv[]);
-/*
- * Win32-specific argv initialization that splits OS-supplied UNICODE
- * command line string to array of UTF8-encoded strings.
- */
-void win32_utf8argv(int *argc, char **argv[]);
-
 /* We need both wrap and the "real" function because libcrypto uses both. */
 int wrap_password_callback(char *buf, int bufsiz, int verify, void *cb_data);
 
diff --git a/apps/include/platform.h b/apps/include/platform.h
new file mode 100644 (file)
index 0000000..49276b6
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef HEADER_PLATFORM_H
+# define HEADER_PLATFORM_H
+
+# include <openssl/e_os2.h>
+
+# if defined(OPENSSL_SYS_VMS) && defined(__DECC)
+/*
+ * VMS C only for now, implemented in vms_decc_init.c
+ * If other C compilers forget to terminate argv with NULL, this function
+ * can be re-used.
+ */
+char **copy_argv(int *argc, char *argv[]);
+# endif
+
+# ifdef _WIN32
+/*
+ * Win32-specific argv initialization that splits OS-supplied UNICODE
+ * command line string to array of UTF8-encoded strings.
+ */
+void win32_utf8argv(int *argc, char **argv[]);
+# endif
+
+#endif
index 54ccc1bf17c6846413148b29d8c7166b8571cd0f..932b51a837646bb125220d0924dc8b55ed88c872 100644 (file)
@@ -9,7 +9,8 @@
 
 #include <stdlib.h>
 #include <openssl/crypto.h>
-#include "apps.h"                /* for app_malloc() and copy_argv() */
+#include "platform.h"            /* for copy_argv() */
+#include "apps.h"                /* for app_malloc() */
 
 char **newargv = NULL;
 
index 1a474634c566fc034a38ec9458f2814097acd70f..372f9be9d6d724ca0982aa580cb04832f2a65bd6 100644 (file)
@@ -6,6 +6,8 @@ SUBDIRS=ossl_shim
          my ($base, $files) = @_;
          return join(" ", map { "$base/$_" } split(/\s+/, $files));
      }
+     our $apps_aux_src =
+         join(' ', map { "../apps/$_" } split(/\s+/, $target{apps_aux_src}));
      ""
 -}
 IF[{- !$disabled{tests} -}]
@@ -14,7 +16,8 @@ IF[{- !$disabled{tests} -}]
           testutil/driver.c testutil/tests.c testutil/cb.c testutil/stanza.c \
           testutil/format_output.c testutil/tap_bio.c \
           testutil/test_cleanup.c testutil/main.c testutil/init.c \
-          testutil/options.c testutil/test_options.c ../apps/opt.c
+          testutil/options.c testutil/test_options.c \
+          testutil/apps_mem.c ../apps/opt.c {- $apps_aux_src; -}
   INCLUDE[libtestutil.a]=../include ../apps/include ..
   DEPEND[libtestutil.a]=../libcrypto
 
diff --git a/test/testutil/apps_mem.c b/test/testutil/apps_mem.c
new file mode 100644 (file)
index 0000000..fa60bc6
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "apps.h"
+
+/* shim that avoids sucking in too much from apps/apps.c */
+
+void* app_malloc(int sz, const char *what)
+{
+    void *vp = OPENSSL_malloc(sz);
+
+    return vp;
+}
index df62625fc05965e51796784eea1d44b4e7c19948..10d74e2ea47f882f53da9df947ebc840058b1d98 100644 (file)
@@ -17,6 +17,8 @@
 #include "internal/nelem.h"
 #include <openssl/bio.h>
 
+#include "platform.h"            /* From libapps */
+
 #ifdef _WIN32
 # define strdup _strdup
 #endif
@@ -132,6 +134,16 @@ int setup_test_framework(int argc, char *argv[])
         CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
     }
 #endif
+
+#if defined(OPENSSL_SYS_VMS) && defined(__DECC)
+    argv = copy_argv(&argc, argv);
+#elif defined(_WIN32)
+    /*
+     * Replace argv[] with UTF-8 encoded strings.
+     */
+    win32_utf8argv(&argc, &argv);
+#endif
+
     if (!opt_init(argc, argv, test_get_options()))
         return 0;
     return 1;