diff options
| author | tb <> | 2022-12-03 09:53:47 +0000 |
|---|---|---|
| committer | tb <> | 2022-12-03 09:53:47 +0000 |
| commit | 67d9ae3e900cc6190fd2ba523b6868ac8ff8868e (patch) | |
| tree | 9f492c5fa4026a08bd17280d8bb902af82be1fe9 /src | |
| parent | ebb8a55a47df51220646df1254717da269937f03 (diff) | |
| download | openbsd-67d9ae3e900cc6190fd2ba523b6868ac8ff8868e.tar.gz openbsd-67d9ae3e900cc6190fd2ba523b6868ac8ff8868e.tar.bz2 openbsd-67d9ae3e900cc6190fd2ba523b6868ac8ff8868e.zip | |
Test BIO_{push,pop}() along a linear chain
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libcrypto/bio/biotest.c | 136 |
1 files changed, 135 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/bio/biotest.c b/src/regress/lib/libcrypto/bio/biotest.c index 531913461a..55daea78fc 100644 --- a/src/regress/lib/libcrypto/bio/biotest.c +++ b/src/regress/lib/libcrypto/bio/biotest.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* $OpenBSD: biotest.c,v 1.9 2022/09/05 21:06:31 tb Exp $ */ | 1 | /* $OpenBSD: biotest.c,v 1.10 2022/12/03 09:53:47 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014, 2022 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014, 2022 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2022 Theo Buehler <tb@openbsd.org> | ||
| 4 | * | 5 | * |
| 5 | * Permission to use, copy, modify, and distribute this software for any | 6 | * Permission to use, copy, modify, and distribute this software for any |
| 6 | * purpose with or without fee is hereby granted, provided that the above | 7 | * purpose with or without fee is hereby granted, provided that the above |
| @@ -28,6 +29,8 @@ | |||
| 28 | #include <openssl/buffer.h> | 29 | #include <openssl/buffer.h> |
| 29 | #include <openssl/err.h> | 30 | #include <openssl/err.h> |
| 30 | 31 | ||
| 32 | #include "bio_local.h" | ||
| 33 | |||
| 31 | struct bio_get_host_ip_test { | 34 | struct bio_get_host_ip_test { |
| 32 | char *input; | 35 | char *input; |
| 33 | uint32_t ip; | 36 | uint32_t ip; |
| @@ -465,6 +468,136 @@ do_bio_mem_tests(void) | |||
| 465 | return failed; | 468 | return failed; |
| 466 | } | 469 | } |
| 467 | 470 | ||
| 471 | #define N_CHAIN_BIOS 5 | ||
| 472 | |||
| 473 | static BIO * | ||
| 474 | BIO_prev(BIO *bio) | ||
| 475 | { | ||
| 476 | if (bio == NULL) | ||
| 477 | return NULL; | ||
| 478 | |||
| 479 | return bio->prev_bio; | ||
| 480 | } | ||
| 481 | |||
| 482 | static int | ||
| 483 | do_bio_chain_pop_test(void) | ||
| 484 | { | ||
| 485 | BIO *bio[N_CHAIN_BIOS]; | ||
| 486 | BIO *prev, *next; | ||
| 487 | size_t i, j; | ||
| 488 | int failed = 1; | ||
| 489 | |||
| 490 | for (i = 0; i < N_CHAIN_BIOS; i++) { | ||
| 491 | memset(bio, 0, sizeof(bio)); | ||
| 492 | prev = NULL; | ||
| 493 | |||
| 494 | /* Create a linear chain of BIOs. */ | ||
| 495 | for (j = 0; j < N_CHAIN_BIOS; j++) { | ||
| 496 | if ((bio[j] = BIO_new(BIO_s_null())) == NULL) | ||
| 497 | errx(1, "BIO_new"); | ||
| 498 | if ((prev = BIO_push(prev, bio[j])) == NULL) | ||
| 499 | errx(1, "BIO_push"); | ||
| 500 | } | ||
| 501 | |||
| 502 | /* Check that the doubly-linked list was set up as expected. */ | ||
| 503 | if (BIO_prev(bio[0]) != NULL) { | ||
| 504 | fprintf(stderr, | ||
| 505 | "i = %zu: first BIO has predecessor\n", i); | ||
| 506 | goto err; | ||
| 507 | } | ||
| 508 | if (BIO_next(bio[N_CHAIN_BIOS - 1]) != NULL) { | ||
| 509 | fprintf(stderr, "i = %zu: last BIO has successor\n", i); | ||
| 510 | goto err; | ||
| 511 | } | ||
| 512 | for (j = 0; j < N_CHAIN_BIOS; j++) { | ||
| 513 | if (j > 0) { | ||
| 514 | if (BIO_prev(bio[j]) != bio[j - 1]) { | ||
| 515 | fprintf(stderr, "i = %zu: " | ||
| 516 | "BIO_prev(bio[%zu]) != bio[%zu]\n", | ||
| 517 | i, j, j - 1); | ||
| 518 | goto err; | ||
| 519 | } | ||
| 520 | } | ||
| 521 | if (j < N_CHAIN_BIOS - 1) { | ||
| 522 | if (BIO_next(bio[j]) != bio[j + 1]) { | ||
| 523 | fprintf(stderr, "i = %zu: " | ||
| 524 | "BIO_next(bio[%zu]) != bio[%zu]\n", | ||
| 525 | i, j, j + 1); | ||
| 526 | goto err; | ||
| 527 | } | ||
| 528 | } | ||
| 529 | } | ||
| 530 | |||
| 531 | /* Drop the ith bio from the chain. */ | ||
| 532 | next = BIO_pop(bio[i]); | ||
| 533 | |||
| 534 | if (BIO_prev(bio[i]) != NULL || BIO_next(bio[i]) != NULL) { | ||
| 535 | fprintf(stderr, | ||
| 536 | "BIO_pop() didn't isolate bio[%zu]\n", i); | ||
| 537 | goto err; | ||
| 538 | } | ||
| 539 | |||
| 540 | if (i < N_CHAIN_BIOS - 1) { | ||
| 541 | if (next != bio[i + 1]) { | ||
| 542 | fprintf(stderr, "BIO_pop(bio[%zu]) did not " | ||
| 543 | "return bio[%zu]\n", i, i + 1); | ||
| 544 | goto err; | ||
| 545 | } | ||
| 546 | } else { | ||
| 547 | if (next != NULL) { | ||
| 548 | fprintf(stderr, "i = %zu: " | ||
| 549 | "BIO_pop(last) != NULL\n", i); | ||
| 550 | goto err; | ||
| 551 | } | ||
| 552 | } | ||
| 553 | |||
| 554 | /* | ||
| 555 | * Walk the remainder of the chain and see if the doubly linked | ||
| 556 | * list checks out. | ||
| 557 | */ | ||
| 558 | if (i == 0) { | ||
| 559 | prev = bio[1]; | ||
| 560 | j = 2; | ||
| 561 | } else { | ||
| 562 | prev = bio[0]; | ||
| 563 | j = 1; | ||
| 564 | } | ||
| 565 | |||
| 566 | for (; j < N_CHAIN_BIOS; j++) { | ||
| 567 | if (j == i) | ||
| 568 | continue; | ||
| 569 | if (BIO_next(prev) != bio[j]) { | ||
| 570 | fprintf(stderr, "i = %zu, j = %zu: " | ||
| 571 | "BIO_next(prev) != bio[%zu]\n", i, j, j); | ||
| 572 | goto err; | ||
| 573 | } | ||
| 574 | if (BIO_prev(bio[j]) != prev) { | ||
| 575 | fprintf(stderr, "i = %zu, j = %zu: " | ||
| 576 | "BIO_prev(bio[%zu]) != prev\n", i, j, j); | ||
| 577 | goto err; | ||
| 578 | } | ||
| 579 | prev = bio[j]; | ||
| 580 | } | ||
| 581 | |||
| 582 | if (BIO_next(prev) != NULL) { | ||
| 583 | fprintf(stderr, "i = %zu: BIO_next(prev) != NULL\n", i); | ||
| 584 | goto err; | ||
| 585 | } | ||
| 586 | |||
| 587 | for (j = 0; j < N_CHAIN_BIOS; j++) | ||
| 588 | BIO_free(bio[j]); | ||
| 589 | memset(bio, 0, sizeof(bio)); | ||
| 590 | } | ||
| 591 | |||
| 592 | failed = 0; | ||
| 593 | |||
| 594 | err: | ||
| 595 | for (i = 0; i < N_CHAIN_BIOS; i++) | ||
| 596 | BIO_free(bio[i]); | ||
| 597 | |||
| 598 | return failed; | ||
| 599 | } | ||
| 600 | |||
| 468 | int | 601 | int |
| 469 | main(int argc, char **argv) | 602 | main(int argc, char **argv) |
| 470 | { | 603 | { |
| @@ -473,6 +606,7 @@ main(int argc, char **argv) | |||
| 473 | ret |= do_bio_get_host_ip_tests(); | 606 | ret |= do_bio_get_host_ip_tests(); |
| 474 | ret |= do_bio_get_port_tests(); | 607 | ret |= do_bio_get_port_tests(); |
| 475 | ret |= do_bio_mem_tests(); | 608 | ret |= do_bio_mem_tests(); |
| 609 | ret |= do_bio_chain_pop_test(); | ||
| 476 | 610 | ||
| 477 | return (ret); | 611 | return (ret); |
| 478 | } | 612 | } |
