[openssl-commits] [openssl] master update
Dr. Stephen Henson
steve at openssl.org
Thu Jan 5 23:04:13 UTC 2017
The branch master has been updated
via 71f60ef3376144885384f2b1b3f00c3d54806f38 (commit)
from d8594555ffaf98ada08b26ce3d1138f16bc029c5 (commit)
- Log -----------------------------------------------------------------
commit 71f60ef3376144885384f2b1b3f00c3d54806f38
Author: Dr. Stephen Henson <steve at openssl.org>
Date: Thu Jan 5 19:27:41 2017 +0000
Remove BIO_seek/BIO_tell from evp_test.c
BIO_seek and BIO_tell can cause problems with evp_test.c on some platforms.
Avoid them by using a temporary memory BIO to store key PEM data.
Reviewed-by: Richard Levitte <levitte at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/2183)
-----------------------------------------------------------------------
Summary of changes:
test/evp_test.c | 51 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 36 insertions(+), 15 deletions(-)
diff --git a/test/evp_test.c b/test/evp_test.c
index b6a7c28..e5d7c91 100644
--- a/test/evp_test.c
+++ b/test/evp_test.c
@@ -197,6 +197,8 @@ static int test_uint64(const char *value, uint64_t *pr)
struct evp_test {
/* file being read */
BIO *in;
+ /* temp memory BIO for reading in keys */
+ BIO *key;
/* List of public and private keys */
struct key_list *private;
struct key_list *public;
@@ -459,11 +461,36 @@ static int check_unsupported()
return 0;
}
+
+static int read_key(struct evp_test *t)
+{
+ char tmpbuf[80];
+ if (t->key == NULL)
+ t->key = BIO_new(BIO_s_mem());
+ else if (BIO_reset(t->key) <= 0)
+ return 0;
+ if (t->key == NULL) {
+ fprintf(stderr, "Error allocating key memory BIO\n");
+ return 0;
+ }
+ /* Read to PEM end line and place content in memory BIO */
+ while (BIO_gets(t->in, tmpbuf, sizeof(tmpbuf))) {
+ t->line++;
+ if (BIO_puts(t->key, tmpbuf) <= 0) {
+ fprintf(stderr, "Error writing to key memory BIO\n");
+ return 0;
+ }
+ if (strncmp(tmpbuf, "-----END", 8) == 0)
+ return 1;
+ }
+ fprintf(stderr, "Can't find key end\n");
+ return 0;
+}
+
static int process_test(struct evp_test *t, char *buf, int verbose)
{
char *keyword = NULL, *value = NULL;
int rv = 0, add_key = 0;
- long save_pos = 0;
struct key_list **lst = NULL, *key = NULL;
EVP_PKEY *pk = NULL;
const struct evp_test_method *tmeth = NULL;
@@ -472,8 +499,9 @@ static int process_test(struct evp_test *t, char *buf, int verbose)
if (!parse_line(&keyword, &value, buf))
return 1;
if (strcmp(keyword, "PrivateKey") == 0) {
- save_pos = BIO_tell(t->in);
- pk = PEM_read_bio_PrivateKey(t->in, NULL, 0, NULL);
+ if (!read_key(t))
+ return 0;
+ pk = PEM_read_bio_PrivateKey(t->key, NULL, 0, NULL);
if (pk == NULL && !check_unsupported()) {
fprintf(stderr, "Error reading private key %s\n", value);
ERR_print_errors_fp(stderr);
@@ -483,8 +511,9 @@ static int process_test(struct evp_test *t, char *buf, int verbose)
add_key = 1;
}
if (strcmp(keyword, "PublicKey") == 0) {
- save_pos = BIO_tell(t->in);
- pk = PEM_read_bio_PUBKEY(t->in, NULL, 0, NULL);
+ if (!read_key(t))
+ return 0;
+ pk = PEM_read_bio_PUBKEY(t->key, NULL, 0, NULL);
if (pk == NULL && !check_unsupported()) {
fprintf(stderr, "Error reading public key %s\n", value);
ERR_print_errors_fp(stderr);
@@ -495,7 +524,6 @@ static int process_test(struct evp_test *t, char *buf, int verbose)
}
/* If we have a key add to list */
if (add_key) {
- char tmpbuf[80];
if (find_key(NULL, value, *lst)) {
fprintf(stderr, "Duplicate key %s\n", value);
return 0;
@@ -507,15 +535,7 @@ static int process_test(struct evp_test *t, char *buf, int verbose)
key->key = pk;
key->next = *lst;
*lst = key;
- /* Rewind input, read to end and update line numbers */
- (void)BIO_seek(t->in, save_pos);
- while (BIO_gets(t->in,tmpbuf, sizeof(tmpbuf))) {
- t->line++;
- if (strncmp(tmpbuf, "-----END", 8) == 0)
- return 1;
- }
- fprintf(stderr, "Can't find key end\n");
- return 0;
+ return 1;
}
/* See if keyword corresponds to a test start */
@@ -639,6 +659,7 @@ int main(int argc, char **argv)
t.ntests, t.errors, t.nskip);
free_key_list(t.public);
free_key_list(t.private);
+ BIO_free(t.key);
BIO_free(in);
#ifndef OPENSSL_NO_CRYPTO_MDEBUG
More information about the openssl-commits
mailing list