Skip to content

Commit

Permalink
APPS/storeutl: fix case where uri and outfile are the same
Browse files Browse the repository at this point in the history
  • Loading branch information
DDvO committed Sep 27, 2024
1 parent d41a3cc commit 9059fd1
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
22 changes: 13 additions & 9 deletions apps/storeutl.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata,
int expected, int criterion, OSSL_STORE_SEARCH *search,
int text, int noout, int recursive, int indent, BIO *out,
int text, int noout, int recursive, int indent, const char *outfile,
const char *prog, OSSL_LIB_CTX *libctx);

typedef enum OPTION_choice {
Expand Down Expand Up @@ -67,11 +67,12 @@ const OPTIONS storeutl_options[] = {
{NULL}
};

static BIO *out = NULL;

int storeutl_main(int argc, char *argv[])
{
int ret = 1, noout = 0, text = 0, recursive = 0;
char *outfile = NULL, *passin = NULL, *passinarg = NULL;
BIO *out = NULL;
ENGINE *e = NULL;
OPTION_CHOICE o;
char *prog;
Expand Down Expand Up @@ -311,13 +312,9 @@ int storeutl_main(int argc, char *argv[])
pw_cb_data.password = passin;
pw_cb_data.prompt_info = argv[0];

out = bio_open_default(outfile, 'w', FORMAT_TEXT);
if (out == NULL)
goto end;

ret = process(argv[0], get_ui_method(), &pw_cb_data,
expected, criterion, search,
text, noout, recursive, 0, out, prog, libctx);
text, noout, recursive, 0, outfile, prog, libctx);

end:
EVP_MD_free(digest);
Expand Down Expand Up @@ -348,7 +345,7 @@ static int indent_printf(int indent, BIO *bio, const char *format, ...)

static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata,
int expected, int criterion, OSSL_STORE_SEARCH *search,
int text, int noout, int recursive, int indent, BIO *out,
int text, int noout, int recursive, int indent, const char *outfile,
const char *prog, OSSL_LIB_CTX *libctx)
{
OSSL_STORE_CTX *store_ctx = NULL;
Expand Down Expand Up @@ -427,6 +424,13 @@ static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata,
indent_printf(indent, bio_out, "%d: %s\n", items, infostr);
}

if (out == NULL) {
if ((out = bio_open_default(outfile, 'w', FORMAT_TEXT)) == NULL) {
ret++;
goto end2;
}
}

/*
* Unfortunately, PEM_X509_INFO_write_bio() is sorely lacking in
* functionality, so we must figure out how exactly to write things
Expand All @@ -438,7 +442,7 @@ static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata,
const char *suburi = OSSL_STORE_INFO_get0_NAME(info);
ret += process(suburi, uimeth, uidata,
expected, criterion, search,
text, noout, recursive, indent + 2, out, prog,
text, noout, recursive, indent + 2, outfile, prog,
libctx);
}
break;
Expand Down
9 changes: 8 additions & 1 deletion test/recipes/90-test_store.t
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ use OpenSSL::Test::Utils;
my $test_name = "test_store";
setup($test_name);

require(srctop_file("test", "recipes", "tconversion.pl")); # for test_file_contains()

my $use_md5 = !disabled("md5");
my $use_des = !(disabled("des") || disabled("legacy")); # also affects 3des and pkcs12 app
my $use_dsa = !disabled("dsa");
Expand Down Expand Up @@ -106,7 +108,7 @@ push @methods, [ @prov_method ];
push @methods, [qw(-engine loader_attic)]
unless disabled('loadereng');

my $n = 2 + scalar @methods
my $n = 4 + scalar @methods
* ( (3 * scalar @noexist_files)
+ (6 * scalar @src_files)
+ (2 * scalar @data_files)
Expand Down Expand Up @@ -172,6 +174,11 @@ indir "store_$$" => sub {

my $rehash = init_rehash();

ok(run(app(["openssl", "storeutl", "-out", "cacert.pem", "cacert.pem"])),
"identical infile and outfile");
test_file_contains("storeutl output on same input",
"cacert.pem", "Total found: 1");

foreach my $method (@methods) {
my @storeutl = ( qw(openssl storeutl), @$method );

Expand Down

0 comments on commit 9059fd1

Please sign in to comment.