From efe749c84050b99a8470aa58a6c464cf886cfc00 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 26 Mar 2018 11:00:05 +0200 Subject: [PATCH] Refuse to run test_cipherlist unless shared library matches build test/cipherlist_test.c is an internal consistency check, and therefore requires that the shared library it runs against matches what it was built for. test/recipes/test_cipherlist.t is made to refuse running unless library version and build version match. This adds a helper program test/versions.c, that simply displays the library and the build version. Partially fixes #5751 Reviewed-by: Andy Polyakov (Merged from https://github.com/openssl/openssl/pull/5753) (cherry picked from commit cde87deafa7486f26bdf954867a6d72ca4ea06e7) --- test/build.info | 5 +++++ test/recipes/80-test_cipherlist.t | 7 ++++++- test/versions.c | 20 ++++++++++++++++++++ util/perl/OpenSSL/Test.pm | 29 ++++++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/versions.c diff --git a/test/build.info b/test/build.info index f6f36fa0b2..7887813047 100644 --- a/test/build.info +++ b/test/build.info @@ -24,6 +24,7 @@ INCLUDE_MAIN___test_libtestutil_OLB = /INCLUDE=MAIN ENDRAW[descrip.mms] PROGRAMS_NO_INST=\ + versions \ aborttest test_test \ sanitytest exdatatest bntest \ ectest ecstresstest ecdsatest gmdifftest pbelutest ideatest \ @@ -52,6 +53,10 @@ INCLUDE_MAIN___test_libtestutil_OLB = /INCLUDE=MAIN servername_test ocspapitest rsa_mp_test fatalerrtest tls13ccstest \ sysdefaulttest + SOURCE[versions]=versions.c + INCLUDE[versions]=../include + DEPEND[versions]=../libcrypto + SOURCE[aborttest]=aborttest.c INCLUDE[aborttest]=../include DEPEND[aborttest]=../libcrypto diff --git a/test/recipes/80-test_cipherlist.t b/test/recipes/80-test_cipherlist.t index 98d537e5f3..6e869c85b4 100644 --- a/test/recipes/80-test_cipherlist.t +++ b/test/recipes/80-test_cipherlist.t @@ -12,11 +12,16 @@ use strict; use warnings; use OpenSSL::Test::Simple; -use OpenSSL::Test; +use OpenSSL::Test qw(:DEFAULT openssl_versions); use OpenSSL::Test::Utils qw(alldisabled available_protocols); setup("test_cipherlist"); +my ($build_version, $library_version) = openssl_versions(); +plan skip_all => + "This test recipe isn't supported when doing regression testing" + if $build_version != $library_version; + my $no_anytls = alldisabled(available_protocols("tls")); # If we have no protocols, then we also have no supported ciphers. diff --git a/test/versions.c b/test/versions.c new file mode 100644 index 0000000000..3ab05ec35d --- /dev/null +++ b/test/versions.c @@ -0,0 +1,20 @@ +/* + * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (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 +#include +#include + +/* A simple helper for the perl function OpenSSL::Test::openssl_versions */ +int main(void) +{ + printf("Build version: 0x%08lX\n", OPENSSL_VERSION_NUMBER); + printf("Library version: 0x%08lX\n", OpenSSL_version_num()); + return 0; +} diff --git a/util/perl/OpenSSL/Test.pm b/util/perl/OpenSSL/Test.pm index ad77896c85..f4b1b50d8b 100644 --- a/util/perl/OpenSSL/Test.pm +++ b/util/perl/OpenSSL/Test.pm @@ -21,7 +21,8 @@ $VERSION = "0.8"; @EXPORT_OK = (@Test::More::EXPORT_OK, qw(bldtop_dir bldtop_file srctop_dir srctop_file data_file - pipe with cmdstr quotify)); + pipe with cmdstr quotify + openssl_versions)); =head1 NAME @@ -788,6 +789,32 @@ sub quotify { return map { $arg_formatter->($_) } @_; } +=over 4 + +=item B + +Returns a list of two numbers, the first representing the build version, +the second representing the library version. See opensslv.h for more +information on those numbers. + += back + +=cut + +my @versions = (); +sub openssl_versions { + unless (@versions) { + my %lines = + map { s/\R$//; + /^(.*): (0x[[:xdigit:]]{8})$/; + die "Weird line: $_" unless defined $1; + $1 => hex($2) } + run(test(['versions']), capture => 1); + @versions = ( $lines{'Build version'}, $lines{'Library version'} ); + } + return @versions; +} + ###################################################################### # private functions. These are never exported. -- 2.34.1