diff options
author | tb <> | 2022-12-10 10:42:13 +0000 |
---|---|---|
committer | tb <> | 2022-12-10 10:42:13 +0000 |
commit | 38a508be23cfe9bb502552eab3091e8c037cf037 (patch) | |
tree | b754c59084b5895a3dd316c67dfac195a24669b7 | |
parent | 71105cb2a9dbee4d10b998a0344722138d048080 (diff) | |
download | openbsd-38a508be23cfe9bb502552eab3091e8c037cf037.tar.gz openbsd-38a508be23cfe9bb502552eab3091e8c037cf037.tar.bz2 openbsd-38a508be23cfe9bb502552eab3091e8c037cf037.zip |
bio chain test: handle walking of empty chains
Rework the loops walking the chains to be correct for empty chains as well.
This simplifies the checking at the cost of slightly more initialization
and will allow further refactoring in a subsequent check.
-rw-r--r-- | src/regress/lib/libcrypto/bio/bio_chain.c | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/src/regress/lib/libcrypto/bio/bio_chain.c b/src/regress/lib/libcrypto/bio/bio_chain.c index f5c46d710b..810395676f 100644 --- a/src/regress/lib/libcrypto/bio/bio_chain.c +++ b/src/regress/lib/libcrypto/bio/bio_chain.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bio_chain.c,v 1.11 2022/12/09 17:23:05 tb Exp $ */ | 1 | /* $OpenBSD: bio_chain.c,v 1.12 2022/12/10 10:42:13 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2022 Theo Buehler <tb@openbsd.org> | 3 | * Copyright (c) 2022 Theo Buehler <tb@openbsd.org> |
4 | * | 4 | * |
@@ -200,24 +200,15 @@ walk_forward(BIO *start, BIO *end, size_t expected_len, size_t i, size_t j, | |||
200 | size_t len; | 200 | size_t len; |
201 | int ret = 0; | 201 | int ret = 0; |
202 | 202 | ||
203 | if (start == NULL || end == NULL) { | 203 | prev = NULL; |
204 | if (expected_len != 0) { | ||
205 | fprintf(stderr, "%s case (%zu, %zu) %s: empty chain " | ||
206 | "with expected length %zu > 0\n", | ||
207 | fn, i, j, description, expected_len); | ||
208 | goto err; | ||
209 | } | ||
210 | goto done; | ||
211 | } | ||
212 | |||
213 | next = start; | 204 | next = start; |
214 | len = 0; | 205 | len = 0; |
215 | 206 | ||
216 | do { | 207 | while (next != NULL) { |
217 | prev = next; | 208 | prev = next; |
218 | next = BIO_next(prev); | 209 | next = BIO_next(prev); |
219 | len++; | 210 | len++; |
220 | } while (next != NULL); | 211 | } |
221 | 212 | ||
222 | if (prev != end) { | 213 | if (prev != end) { |
223 | fprintf(stderr, "%s case (%zu, %zu) %s has unexpected end\n", | 214 | fprintf(stderr, "%s case (%zu, %zu) %s has unexpected end\n", |
@@ -232,7 +223,6 @@ walk_forward(BIO *start, BIO *end, size_t expected_len, size_t i, size_t j, | |||
232 | goto err; | 223 | goto err; |
233 | } | 224 | } |
234 | 225 | ||
235 | done: | ||
236 | ret = 1; | 226 | ret = 1; |
237 | 227 | ||
238 | err: | 228 | err: |
@@ -247,24 +237,15 @@ walk_backward(BIO *start, BIO *end, size_t expected_len, size_t i, size_t j, | |||
247 | size_t len; | 237 | size_t len; |
248 | int ret = 0; | 238 | int ret = 0; |
249 | 239 | ||
250 | if (start == NULL || end == NULL) { | 240 | next = NULL; |
251 | if (expected_len != 0) { | ||
252 | fprintf(stderr, "%s case (%zu, %zu) %s: empty chain " | ||
253 | "with expected length %zu > 0\n", | ||
254 | fn, i, j, description, expected_len); | ||
255 | goto err; | ||
256 | } | ||
257 | goto done; | ||
258 | } | ||
259 | |||
260 | prev = end; | 241 | prev = end; |
261 | len = 0; | 242 | len = 0; |
262 | 243 | ||
263 | do { | 244 | while (prev != NULL) { |
264 | next = prev; | 245 | next = prev; |
265 | prev = BIO_prev(prev); | 246 | prev = BIO_prev(prev); |
266 | len++; | 247 | len++; |
267 | } while (prev != NULL); | 248 | } |
268 | 249 | ||
269 | if (next != start) { | 250 | if (next != start) { |
270 | fprintf(stderr, "%s case (%zu, %zu) %s has unexpected start\n", | 251 | fprintf(stderr, "%s case (%zu, %zu) %s has unexpected start\n", |
@@ -279,7 +260,6 @@ walk_backward(BIO *start, BIO *end, size_t expected_len, size_t i, size_t j, | |||
279 | goto err; | 260 | goto err; |
280 | } | 261 | } |
281 | 262 | ||
282 | done: | ||
283 | ret = 1; | 263 | ret = 1; |
284 | 264 | ||
285 | err: | 265 | err: |
@@ -369,6 +349,7 @@ link_chains_at(size_t i, size_t j, int use_bio_push) | |||
369 | 349 | ||
370 | new_start = A[0]; | 350 | new_start = A[0]; |
371 | new_end = B[nitems(B) - 1]; | 351 | new_end = B[nitems(B) - 1]; |
352 | /* new_len depends on use_bio_push. It is set a few lines down. */ | ||
372 | 353 | ||
373 | oldhead_start = B[0]; | 354 | oldhead_start = B[0]; |
374 | oldhead_end = BIO_prev(B[j]); | 355 | oldhead_end = BIO_prev(B[j]); |
@@ -394,6 +375,13 @@ link_chains_at(size_t i, size_t j, int use_bio_push) | |||
394 | oldtail_start = BIO_next(A[i]); | 375 | oldtail_start = BIO_next(A[i]); |
395 | oldtail_end = A[nitems(A) - 1]; | 376 | oldtail_end = A[nitems(A) - 1]; |
396 | oldtail_len = nitems(A) - i - 1; | 377 | oldtail_len = nitems(A) - i - 1; |
378 | |||
379 | /* If we set next on end of A[], the oldtail chain is empty. */ | ||
380 | if (i == nitems(A) - 1) { | ||
381 | oldtail_start = NULL; | ||
382 | oldtail_end = NULL; | ||
383 | oldtail_len = 0; | ||
384 | } | ||
397 | } | 385 | } |
398 | 386 | ||
399 | /* The two chains A[] and B[] are split into three disjoint pieces. */ | 387 | /* The two chains A[] and B[] are split into three disjoint pieces. */ |