BIO_write_ex: No error only on 0 bytes to write
[openssl.git] / crypto / bio / bio_lib.c
1 /*
2  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #define OPENSSL_SUPPRESS_DEPRECATED
11
12 #include <stdio.h>
13 #include <errno.h>
14 #include <openssl/crypto.h>
15 #include "bio_local.h"
16
17 /*
18  * Helper macro for the callback to determine whether an operator expects a
19  * len parameter or not
20  */
21 #define HAS_LEN_OPER(o) ((o) == BIO_CB_READ || (o) == BIO_CB_WRITE \
22                          || (o) == BIO_CB_GETS)
23
24 #ifndef OPENSSL_NO_DEPRECATED_3_0
25 # define HAS_CALLBACK(b) ((b)->callback != NULL || (b)->callback_ex != NULL)
26 #else
27 # define HAS_CALLBACK(b) ((b)->callback_ex != NULL)
28 #endif
29 /*
30  * Helper function to work out whether to call the new style callback or the old
31  * one, and translate between the two.
32  *
33  * This has a long return type for consistency with the old callback. Similarly
34  * for the "long" used for "inret"
35  */
36 static long bio_call_callback(BIO *b, int oper, const char *argp, size_t len,
37                               int argi, long argl, long inret,
38                               size_t *processed)
39 {
40     long ret = inret;
41 #ifndef OPENSSL_NO_DEPRECATED_3_0
42     int bareoper;
43
44     if (b->callback_ex != NULL)
45 #endif
46         return b->callback_ex(b, oper, argp, len, argi, argl, inret, processed);
47
48 #ifndef OPENSSL_NO_DEPRECATED_3_0
49     /* Strip off any BIO_CB_RETURN flag */
50     bareoper = oper & ~BIO_CB_RETURN;
51
52     /*
53      * We have an old style callback, so we will have to do nasty casts and
54      * check for overflows.
55      */
56     if (HAS_LEN_OPER(bareoper)) {
57         /* In this case |len| is set, and should be used instead of |argi| */
58         if (len > INT_MAX)
59             return -1;
60
61         argi = (int)len;
62     }
63
64     if (inret > 0 && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
65         if (*processed > INT_MAX)
66             return -1;
67         inret = *processed;
68     }
69
70     ret = b->callback(b, oper, argp, argi, argl, inret);
71
72     if (ret > 0 && (oper & BIO_CB_RETURN) && bareoper != BIO_CB_CTRL) {
73         *processed = (size_t)ret;
74         ret = 1;
75     }
76 #endif
77     return ret;
78 }
79
80 BIO *BIO_new_ex(OSSL_LIB_CTX *libctx, const BIO_METHOD *method)
81 {
82     BIO *bio = OPENSSL_zalloc(sizeof(*bio));
83
84     if (bio == NULL) {
85         ERR_raise(ERR_LIB_BIO, ERR_R_MALLOC_FAILURE);
86         return NULL;
87     }
88
89     bio->libctx = libctx;
90     bio->method = method;
91     bio->shutdown = 1;
92     bio->references = 1;
93
94     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data))
95         goto err;
96
97     bio->lock = CRYPTO_THREAD_lock_new();
98     if (bio->lock == NULL) {
99         ERR_raise(ERR_LIB_BIO, ERR_R_MALLOC_FAILURE);
100         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
101         goto err;
102     }
103
104     if (method->create != NULL && !method->create(bio)) {
105         ERR_raise(ERR_LIB_BIO, ERR_R_INIT_FAIL);
106         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
107         CRYPTO_THREAD_lock_free(bio->lock);
108         goto err;
109     }
110     if (method->create == NULL)
111         bio->init = 1;
112
113     return bio;
114
115 err:
116     OPENSSL_free(bio);
117     return NULL;
118 }
119
120 BIO *BIO_new(const BIO_METHOD *method)
121 {
122     return BIO_new_ex(NULL, method);
123 }
124
125 int BIO_free(BIO *a)
126 {
127     int ret;
128
129     if (a == NULL)
130         return 0;
131
132     if (CRYPTO_DOWN_REF(&a->references, &ret, a->lock) <= 0)
133         return 0;
134
135     REF_PRINT_COUNT("BIO", a);
136     if (ret > 0)
137         return 1;
138     REF_ASSERT_ISNT(ret < 0);
139
140     if (HAS_CALLBACK(a)) {
141         ret = (int)bio_call_callback(a, BIO_CB_FREE, NULL, 0, 0, 0L, 1L, NULL);
142         if (ret <= 0)
143             return ret;
144     }
145
146     if ((a->method != NULL) && (a->method->destroy != NULL))
147         a->method->destroy(a);
148
149     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data);
150
151     CRYPTO_THREAD_lock_free(a->lock);
152
153     OPENSSL_free(a);
154
155     return 1;
156 }
157
158 void BIO_set_data(BIO *a, void *ptr)
159 {
160     a->ptr = ptr;
161 }
162
163 void *BIO_get_data(BIO *a)
164 {
165     return a->ptr;
166 }
167
168 void BIO_set_init(BIO *a, int init)
169 {
170     a->init = init;
171 }
172
173 int BIO_get_init(BIO *a)
174 {
175     return a->init;
176 }
177
178 void BIO_set_shutdown(BIO *a, int shut)
179 {
180     a->shutdown = shut;
181 }
182
183 int BIO_get_shutdown(BIO *a)
184 {
185     return a->shutdown;
186 }
187
188 void BIO_vfree(BIO *a)
189 {
190     BIO_free(a);
191 }
192
193 int BIO_up_ref(BIO *a)
194 {
195     int i;
196
197     if (CRYPTO_UP_REF(&a->references, &i, a->lock) <= 0)
198         return 0;
199
200     REF_PRINT_COUNT("BIO", a);
201     REF_ASSERT_ISNT(i < 2);
202     return i > 1;
203 }
204
205 void BIO_clear_flags(BIO *b, int flags)
206 {
207     b->flags &= ~flags;
208 }
209
210 int BIO_test_flags(const BIO *b, int flags)
211 {
212     return (b->flags & flags);
213 }
214
215 void BIO_set_flags(BIO *b, int flags)
216 {
217     b->flags |= flags;
218 }
219
220 #ifndef OPENSSL_NO_DEPRECATED_3_0
221 BIO_callback_fn BIO_get_callback(const BIO *b)
222 {
223     return b->callback;
224 }
225
226 void BIO_set_callback(BIO *b, BIO_callback_fn cb)
227 {
228     b->callback = cb;
229 }
230 #endif
231
232 BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b)
233 {
234     return b->callback_ex;
235 }
236
237 void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex cb)
238 {
239     b->callback_ex = cb;
240 }
241
242 void BIO_set_callback_arg(BIO *b, char *arg)
243 {
244     b->cb_arg = arg;
245 }
246
247 char *BIO_get_callback_arg(const BIO *b)
248 {
249     return b->cb_arg;
250 }
251
252 const char *BIO_method_name(const BIO *b)
253 {
254     return b->method->name;
255 }
256
257 int BIO_method_type(const BIO *b)
258 {
259     return b->method->type;
260 }
261
262 /*
263  * This is essentially the same as BIO_read_ex() except that it allows
264  * 0 or a negative value to indicate failure (retryable or not) in the return.
265  * This is for compatibility with the old style BIO_read(), where existing code
266  * may make assumptions about the return value that it might get.
267  */
268 static int bio_read_intern(BIO *b, void *data, size_t dlen, size_t *readbytes)
269 {
270     int ret;
271
272     if (b == NULL) {
273         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
274         return -1;
275     }
276     if (b->method == NULL || b->method->bread == NULL) {
277         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
278         return -2;
279     }
280
281     if (HAS_CALLBACK(b) &&
282         ((ret = (int)bio_call_callback(b, BIO_CB_READ, data, dlen, 0, 0L, 1L,
283                                        NULL)) <= 0))
284         return ret;
285
286     if (!b->init) {
287         ERR_raise(ERR_LIB_BIO, BIO_R_UNINITIALIZED);
288         return -1;
289     }
290
291     ret = b->method->bread(b, data, dlen, readbytes);
292
293     if (ret > 0)
294         b->num_read += (uint64_t)*readbytes;
295
296     if (HAS_CALLBACK(b))
297         ret = (int)bio_call_callback(b, BIO_CB_READ | BIO_CB_RETURN, data,
298                                      dlen, 0, 0L, ret, readbytes);
299
300     /* Shouldn't happen */
301     if (ret > 0 && *readbytes > dlen) {
302         ERR_raise(ERR_LIB_BIO, ERR_R_INTERNAL_ERROR);
303         return -1;
304     }
305
306     return ret;
307 }
308
309 int BIO_read(BIO *b, void *data, int dlen)
310 {
311     size_t readbytes;
312     int ret;
313
314     if (dlen < 0)
315         return 0;
316
317     ret = bio_read_intern(b, data, (size_t)dlen, &readbytes);
318
319     if (ret > 0) {
320         /* *readbytes should always be <= dlen */
321         ret = (int)readbytes;
322     }
323
324     return ret;
325 }
326
327 int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes)
328 {
329     return bio_read_intern(b, data, dlen, readbytes) > 0;
330 }
331
332 static int bio_write_intern(BIO *b, const void *data, size_t dlen,
333                             size_t *written)
334 {
335     size_t local_written;
336     int ret;
337
338     if (written != NULL)
339         *written = 0;
340     /*
341      * b == NULL is not an error but just means that zero bytes are written.
342      * Do not raise an error here.
343      */
344     if (b == NULL)
345         return 0;
346
347     if (b->method == NULL || b->method->bwrite == NULL) {
348         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
349         return -2;
350     }
351
352     if (HAS_CALLBACK(b) &&
353         ((ret = (int)bio_call_callback(b, BIO_CB_WRITE, data, dlen, 0, 0L, 1L,
354                                        NULL)) <= 0))
355         return ret;
356
357     if (!b->init) {
358         ERR_raise(ERR_LIB_BIO, BIO_R_UNINITIALIZED);
359         return -1;
360     }
361
362     ret = b->method->bwrite(b, data, dlen, &local_written);
363
364     if (ret > 0)
365         b->num_write += (uint64_t)local_written;
366
367     if (HAS_CALLBACK(b))
368         ret = (int)bio_call_callback(b, BIO_CB_WRITE | BIO_CB_RETURN, data,
369                                      dlen, 0, 0L, ret, &local_written);
370
371     if (written != NULL)
372         *written = local_written;
373     return ret;
374 }
375
376 int BIO_write(BIO *b, const void *data, int dlen)
377 {
378     size_t written;
379     int ret;
380
381     if (dlen <= 0)
382         return 0;
383
384     ret = bio_write_intern(b, data, (size_t)dlen, &written);
385
386     if (ret > 0) {
387         /* written should always be <= dlen */
388         ret = (int)written;
389     }
390
391     return ret;
392 }
393
394 int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written)
395 {
396     if (dlen == 0) {
397         /* no error */
398         if (written != NULL)
399             *written = 0;
400         return 1;
401     }
402     return bio_write_intern(b, data, dlen, written) > 0;
403 }
404
405 int BIO_puts(BIO *b, const char *buf)
406 {
407     int ret;
408     size_t written = 0;
409
410     if (b == NULL) {
411         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
412         return -1;
413     }
414     if (b->method == NULL || b->method->bputs == NULL) {
415         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
416         return -2;
417     }
418
419     if (HAS_CALLBACK(b)) {
420         ret = (int)bio_call_callback(b, BIO_CB_PUTS, buf, 0, 0, 0L, 1L, NULL);
421         if (ret <= 0)
422             return ret;
423     }
424
425     if (!b->init) {
426         ERR_raise(ERR_LIB_BIO, BIO_R_UNINITIALIZED);
427         return -1;
428     }
429
430     ret = b->method->bputs(b, buf);
431
432     if (ret > 0) {
433         b->num_write += (uint64_t)ret;
434         written = ret;
435         ret = 1;
436     }
437
438     if (HAS_CALLBACK(b))
439         ret = (int)bio_call_callback(b, BIO_CB_PUTS | BIO_CB_RETURN, buf, 0, 0,
440                                      0L, ret, &written);
441
442     if (ret > 0) {
443         if (written > INT_MAX) {
444             ERR_raise(ERR_LIB_BIO, BIO_R_LENGTH_TOO_LONG);
445             ret = -1;
446         } else {
447             ret = (int)written;
448         }
449     }
450
451     return ret;
452 }
453
454 int BIO_gets(BIO *b, char *buf, int size)
455 {
456     int ret;
457     size_t readbytes = 0;
458
459     if (b == NULL) {
460         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
461         return -1;
462     }
463     if (b->method == NULL || b->method->bgets == NULL) {
464         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
465         return -2;
466     }
467
468     if (size < 0) {
469         ERR_raise(ERR_LIB_BIO, BIO_R_INVALID_ARGUMENT);
470         return -1;
471     }
472
473     if (HAS_CALLBACK(b)) {
474         ret = (int)bio_call_callback(b, BIO_CB_GETS, buf, size, 0, 0L, 1, NULL);
475         if (ret <= 0)
476             return ret;
477     }
478
479     if (!b->init) {
480         ERR_raise(ERR_LIB_BIO, BIO_R_UNINITIALIZED);
481         return -1;
482     }
483
484     ret = b->method->bgets(b, buf, size);
485
486     if (ret > 0) {
487         readbytes = ret;
488         ret = 1;
489     }
490
491     if (HAS_CALLBACK(b))
492         ret = (int)bio_call_callback(b, BIO_CB_GETS | BIO_CB_RETURN, buf, size,
493                                      0, 0L, ret, &readbytes);
494
495     if (ret > 0) {
496         /* Shouldn't happen */
497         if (readbytes > (size_t)size)
498             ret = -1;
499         else
500             ret = (int)readbytes;
501     }
502
503     return ret;
504 }
505
506 int BIO_get_line(BIO *bio, char *buf, int size)
507 {
508     int ret = 0;
509     char *ptr = buf;
510
511     if (buf == NULL) {
512         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
513         return -1;
514     }
515     if (size <= 0) {
516         ERR_raise(ERR_LIB_BIO, BIO_R_INVALID_ARGUMENT);
517         return -1;
518     }
519     *buf = '\0';
520
521     if (bio == NULL) {
522         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
523         return -1;
524     }
525     if (!bio->init) {
526         ERR_raise(ERR_LIB_BIO, BIO_R_UNINITIALIZED);
527         return -1;
528     }
529
530     while (size-- > 1 && (ret = BIO_read(bio, ptr, 1)) > 0)
531         if (*ptr++ == '\n')
532             break;
533     *ptr = '\0';
534     return ret > 0 || BIO_eof(bio) ? ptr - buf : ret;
535 }
536
537 int BIO_indent(BIO *b, int indent, int max)
538 {
539     if (indent < 0)
540         indent = 0;
541     if (indent > max)
542         indent = max;
543     while (indent--)
544         if (BIO_puts(b, " ") != 1)
545             return 0;
546     return 1;
547 }
548
549 long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg)
550 {
551     int i;
552
553     i = iarg;
554     return BIO_ctrl(b, cmd, larg, (char *)&i);
555 }
556
557 void *BIO_ptr_ctrl(BIO *b, int cmd, long larg)
558 {
559     void *p = NULL;
560
561     if (BIO_ctrl(b, cmd, larg, (char *)&p) <= 0)
562         return NULL;
563     else
564         return p;
565 }
566
567 long BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
568 {
569     long ret;
570
571     if (b == NULL) {
572         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
573         return -1;
574     }
575     if (b->method == NULL || b->method->ctrl == NULL) {
576         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
577         return -2;
578     }
579
580     if (HAS_CALLBACK(b)) {
581         ret = bio_call_callback(b, BIO_CB_CTRL, parg, 0, cmd, larg, 1L, NULL);
582         if (ret <= 0)
583             return ret;
584     }
585
586     ret = b->method->ctrl(b, cmd, larg, parg);
587
588     if (HAS_CALLBACK(b))
589         ret = bio_call_callback(b, BIO_CB_CTRL | BIO_CB_RETURN, parg, 0, cmd,
590                                 larg, ret, NULL);
591
592     return ret;
593 }
594
595 long BIO_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp)
596 {
597     long ret;
598
599     if (b == NULL) {
600         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
601         return -2;
602     }
603     if (b->method == NULL || b->method->callback_ctrl == NULL
604             || cmd != BIO_CTRL_SET_CALLBACK) {
605         ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
606         return -2;
607     }
608
609     if (HAS_CALLBACK(b)) {
610         ret = bio_call_callback(b, BIO_CB_CTRL, (void *)&fp, 0, cmd, 0, 1L,
611                                 NULL);
612         if (ret <= 0)
613             return ret;
614     }
615
616     ret = b->method->callback_ctrl(b, cmd, fp);
617
618     if (HAS_CALLBACK(b))
619         ret = bio_call_callback(b, BIO_CB_CTRL | BIO_CB_RETURN, (void *)&fp, 0,
620                                 cmd, 0, ret, NULL);
621
622     return ret;
623 }
624
625 /*
626  * It is unfortunate to duplicate in functions what the BIO_(w)pending macros
627  * do; but those macros have inappropriate return type, and for interfacing
628  * from other programming languages, C macros aren't much of a help anyway.
629  */
630 size_t BIO_ctrl_pending(BIO *bio)
631 {
632     return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL);
633 }
634
635 size_t BIO_ctrl_wpending(BIO *bio)
636 {
637     return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL);
638 }
639
640 /* put the 'bio' on the end of b's list of operators */
641 BIO *BIO_push(BIO *b, BIO *bio)
642 {
643     BIO *lb;
644
645     if (b == NULL)
646         return bio;
647     lb = b;
648     while (lb->next_bio != NULL)
649         lb = lb->next_bio;
650     lb->next_bio = bio;
651     if (bio != NULL)
652         bio->prev_bio = lb;
653     /* called to do internal processing */
654     BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb);
655     return b;
656 }
657
658 /* Remove the first and return the rest */
659 BIO *BIO_pop(BIO *b)
660 {
661     BIO *ret;
662
663     if (b == NULL) {
664         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
665         return NULL;
666     }
667     ret = b->next_bio;
668
669     BIO_ctrl(b, BIO_CTRL_POP, 0, b);
670
671     if (b->prev_bio != NULL)
672         b->prev_bio->next_bio = b->next_bio;
673     if (b->next_bio != NULL)
674         b->next_bio->prev_bio = b->prev_bio;
675
676     b->next_bio = NULL;
677     b->prev_bio = NULL;
678     return ret;
679 }
680
681 BIO *BIO_get_retry_BIO(BIO *bio, int *reason)
682 {
683     BIO *b, *last;
684
685     b = last = bio;
686     for (;;) {
687         if (!BIO_should_retry(b))
688             break;
689         last = b;
690         b = b->next_bio;
691         if (b == NULL)
692             break;
693     }
694     if (reason != NULL)
695         *reason = last->retry_reason;
696     return last;
697 }
698
699 int BIO_get_retry_reason(BIO *bio)
700 {
701     return bio->retry_reason;
702 }
703
704 void BIO_set_retry_reason(BIO *bio, int reason)
705 {
706     bio->retry_reason = reason;
707 }
708
709 BIO *BIO_find_type(BIO *bio, int type)
710 {
711     int mt, mask;
712
713     if (bio == NULL) {
714         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
715         return NULL;
716     }
717     mask = type & 0xff;
718     do {
719         if (bio->method != NULL) {
720             mt = bio->method->type;
721
722             if (!mask) {
723                 if (mt & type)
724                     return bio;
725             } else if (mt == type) {
726                 return bio;
727             }
728         }
729         bio = bio->next_bio;
730     } while (bio != NULL);
731     return NULL;
732 }
733
734 BIO *BIO_next(BIO *b)
735 {
736     if (b == NULL) {
737         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
738         return NULL;
739     }
740     return b->next_bio;
741 }
742
743 void BIO_set_next(BIO *b, BIO *next)
744 {
745     b->next_bio = next;
746 }
747
748 void BIO_free_all(BIO *bio)
749 {
750     BIO *b;
751     int ref;
752
753     while (bio != NULL) {
754         b = bio;
755         ref = b->references;
756         bio = bio->next_bio;
757         BIO_free(b);
758         /* Since ref count > 1, don't free anyone else. */
759         if (ref > 1)
760             break;
761     }
762 }
763
764 BIO *BIO_dup_chain(BIO *in)
765 {
766     BIO *ret = NULL, *eoc = NULL, *bio, *new_bio;
767
768     for (bio = in; bio != NULL; bio = bio->next_bio) {
769         if ((new_bio = BIO_new(bio->method)) == NULL)
770             goto err;
771 #ifndef OPENSSL_NO_DEPRECATED_3_0
772         new_bio->callback = bio->callback;
773 #endif
774         new_bio->callback_ex = bio->callback_ex;
775         new_bio->cb_arg = bio->cb_arg;
776         new_bio->init = bio->init;
777         new_bio->shutdown = bio->shutdown;
778         new_bio->flags = bio->flags;
779
780         /* This will let SSL_s_sock() work with stdin/stdout */
781         new_bio->num = bio->num;
782
783         if (!BIO_dup_state(bio, (char *)new_bio)) {
784             BIO_free(new_bio);
785             goto err;
786         }
787
788         /* copy app data */
789         if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data,
790                                 &bio->ex_data)) {
791             BIO_free(new_bio);
792             goto err;
793         }
794
795         if (ret == NULL) {
796             eoc = new_bio;
797             ret = eoc;
798         } else {
799             BIO_push(eoc, new_bio);
800             eoc = new_bio;
801         }
802     }
803     return ret;
804  err:
805     BIO_free_all(ret);
806
807     return NULL;
808 }
809
810 void BIO_copy_next_retry(BIO *b)
811 {
812     BIO_set_flags(b, BIO_get_retry_flags(b->next_bio));
813     b->retry_reason = b->next_bio->retry_reason;
814 }
815
816 int BIO_set_ex_data(BIO *bio, int idx, void *data)
817 {
818     return CRYPTO_set_ex_data(&(bio->ex_data), idx, data);
819 }
820
821 void *BIO_get_ex_data(const BIO *bio, int idx)
822 {
823     return CRYPTO_get_ex_data(&(bio->ex_data), idx);
824 }
825
826 uint64_t BIO_number_read(BIO *bio)
827 {
828     if (bio)
829         return bio->num_read;
830     return 0;
831 }
832
833 uint64_t BIO_number_written(BIO *bio)
834 {
835     if (bio)
836         return bio->num_write;
837     return 0;
838 }
839
840 void bio_free_ex_data(BIO *bio)
841 {
842     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
843 }
844
845 void bio_cleanup(void)
846 {
847 #ifndef OPENSSL_NO_SOCK
848     bio_sock_cleanup_int();
849     CRYPTO_THREAD_lock_free(bio_lookup_lock);
850     bio_lookup_lock = NULL;
851 #endif
852     CRYPTO_THREAD_lock_free(bio_type_lock);
853     bio_type_lock = NULL;
854 }
855
856 /* Internal variant of the below BIO_wait() not calling BIOerr() */
857 static int bio_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds)
858 {
859 #ifndef OPENSSL_NO_SOCK
860     int fd;
861 #endif
862     long sec_diff;
863
864     if (max_time == 0) /* no timeout */
865         return 1;
866
867 #ifndef OPENSSL_NO_SOCK
868     if (BIO_get_fd(bio, &fd) > 0 && fd < FD_SETSIZE)
869         return BIO_socket_wait(fd, BIO_should_read(bio), max_time);
870 #endif
871     /* fall back to polling since no sockets are available */
872
873     sec_diff = (long)(max_time - time(NULL)); /* might overflow */
874     if (sec_diff < 0)
875         return 0; /* clearly timeout */
876
877     /* now take a nap at most the given number of milliseconds */
878     if (sec_diff == 0) { /* we are below the 1 seconds resolution of max_time */
879         if (nap_milliseconds > 1000)
880             nap_milliseconds = 1000;
881     } else { /* for sec_diff > 0, take min(sec_diff * 1000, nap_milliseconds) */
882         if ((unsigned long)sec_diff * 1000 < nap_milliseconds)
883             nap_milliseconds = (unsigned int)sec_diff * 1000;
884     }
885     ossl_sleep(nap_milliseconds);
886     return 1;
887 }
888
889 /*-
890  * Wait on (typically socket-based) BIO at most until max_time.
891  * Succeed immediately if max_time == 0.
892  * If sockets are not available support polling: succeed after waiting at most
893  * the number of nap_milliseconds in order to avoid a tight busy loop.
894  * Call BIOerr(...) on timeout or error.
895  * Returns -1 on error, 0 on timeout, and 1 on success.
896  */
897 int BIO_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds)
898 {
899     int rv = bio_wait(bio, max_time, nap_milliseconds);
900
901     if (rv <= 0)
902         ERR_raise(ERR_LIB_BIO,
903                   rv == 0 ? BIO_R_TRANSFER_TIMEOUT : BIO_R_TRANSFER_ERROR);
904     return rv;
905 }
906
907 /*
908  * Connect via given BIO using BIO_do_connect() until success/timeout/error.
909  * Parameter timeout == 0 means no timeout, < 0 means exactly one try.
910  * For non-blocking and potentially even non-socket BIOs perform polling with
911  * the given density: between polls sleep nap_milliseconds using BIO_wait()
912  * in order to avoid a tight busy loop.
913  * Returns -1 on error, 0 on timeout, and 1 on success.
914  */
915 int BIO_do_connect_retry(BIO *bio, int timeout, int nap_milliseconds)
916 {
917     int blocking = timeout <= 0;
918     time_t max_time = timeout > 0 ? time(NULL) + timeout : 0;
919     int rv;
920
921     if (bio == NULL) {
922         ERR_raise(ERR_LIB_BIO, ERR_R_PASSED_NULL_PARAMETER);
923         return -1;
924     }
925
926     if (nap_milliseconds < 0)
927         nap_milliseconds = 100;
928     BIO_set_nbio(bio, !blocking);
929
930  retry:
931     ERR_set_mark();
932     rv = BIO_do_connect(bio);
933
934     if (rv <= 0) { /* could be timeout or retryable error or fatal error */
935         int err = ERR_peek_last_error();
936         int reason = ERR_GET_REASON(err);
937         int do_retry = BIO_should_retry(bio); /* may be 1 only if !blocking */
938
939         if (ERR_GET_LIB(err) == ERR_LIB_BIO) {
940             switch (reason) {
941             case ERR_R_SYS_LIB:
942                 /*
943                  * likely retryable system error occurred, which may be
944                  * EAGAIN (resource temporarily unavailable) some 40 secs after
945                  * calling getaddrinfo(): Temporary failure in name resolution
946                  * or a premature ETIMEDOUT, some 30 seconds after connect()
947                  */
948             case BIO_R_CONNECT_ERROR:
949             case BIO_R_NBIO_CONNECT_ERROR:
950                 /* some likely retryable connection error occurred */
951                 (void)BIO_reset(bio); /* often needed to avoid retry failure */
952                 do_retry = 1;
953                 break;
954             default:
955                 break;
956             }
957         }
958         if (timeout >= 0 && do_retry) {
959             ERR_pop_to_mark();
960             /* will not actually wait if timeout == 0 (i.e., blocking BIO): */
961             rv = bio_wait(bio, max_time, nap_milliseconds);
962             if (rv > 0)
963                 goto retry;
964             ERR_raise(ERR_LIB_BIO,
965                       rv == 0 ? BIO_R_CONNECT_TIMEOUT : BIO_R_CONNECT_ERROR);
966         } else {
967             ERR_clear_last_mark();
968             rv = -1;
969             if (err == 0) /* missing error queue entry */
970                 /* workaround: general error */
971                 ERR_raise(ERR_LIB_BIO, BIO_R_CONNECT_ERROR);
972         }
973     } else {
974         ERR_clear_last_mark();
975     }
976
977     return rv;
978 }