testutil: ensure good treatment of argv on non-Unix platforms
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)
This commit is contained in:
parent
9b542d72d2
commit
ce506d27ab
6 changed files with 70 additions and 14 deletions
|
@ -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);
|
||||
|
||||
|
|
32
apps/include/platform.h
Normal file
32
apps/include/platform.h
Normal file
|
@ -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
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
19
test/testutil/apps_mem.c
Normal file
19
test/testutil/apps_mem.c
Normal file
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue