Imported Upstream version 2.1.10
[platform/upstream/libevent.git] / bufferevent_openssl.c
1 /*
2  * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  * 3. The name of the author may not be used to endorse or promote products
13  *    derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 // Get rid of OSX 10.7 and greater deprecation warnings.
28 #if defined(__APPLE__) && defined(__clang__)
29 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
30 #endif
31
32 #include "event2/event-config.h"
33 #include "evconfig-private.h"
34
35 #include <sys/types.h>
36
37 #ifdef EVENT__HAVE_SYS_TIME_H
38 #include <sys/time.h>
39 #endif
40
41 #include <errno.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #ifdef EVENT__HAVE_STDARG_H
46 #include <stdarg.h>
47 #endif
48 #ifdef EVENT__HAVE_UNISTD_H
49 #include <unistd.h>
50 #endif
51
52 #ifdef _WIN32
53 #include <winsock2.h>
54 #endif
55
56 #include "event2/bufferevent.h"
57 #include "event2/bufferevent_struct.h"
58 #include "event2/bufferevent_ssl.h"
59 #include "event2/buffer.h"
60 #include "event2/event.h"
61
62 #include "mm-internal.h"
63 #include "bufferevent-internal.h"
64 #include "log-internal.h"
65
66 #include <openssl/ssl.h>
67 #include <openssl/err.h>
68 #include "openssl-compat.h"
69
70 /*
71  * Define an OpenSSL bio that targets a bufferevent.
72  */
73
74 /* --------------------
75    A BIO is an OpenSSL abstraction that handles reading and writing data.  The
76    library will happily speak SSL over anything that implements a BIO
77    interface.
78
79    Here we define a BIO implementation that directs its output to a
80    bufferevent.  We'll want to use this only when none of OpenSSL's built-in
81    IO mechanisms work for us.
82    -------------------- */
83
84 /* every BIO type needs its own integer type value. */
85 #define BIO_TYPE_LIBEVENT 57
86 /* ???? Arguably, we should set BIO_TYPE_FILTER or BIO_TYPE_SOURCE_SINK on
87  * this. */
88
89 #if 0
90 static void
91 print_err(int val)
92 {
93         int err;
94         printf("Error was %d\n", val);
95
96         while ((err = ERR_get_error())) {
97                 const char *msg = (const char*)ERR_reason_error_string(err);
98                 const char *lib = (const char*)ERR_lib_error_string(err);
99                 const char *func = (const char*)ERR_func_error_string(err);
100
101                 printf("%s in %s %s\n", msg, lib, func);
102         }
103 }
104 #else
105 #define print_err(v) ((void)0)
106 #endif
107
108 /* Called to initialize a new BIO */
109 static int
110 bio_bufferevent_new(BIO *b)
111 {
112         BIO_set_init(b, 0);
113         BIO_set_data(b, NULL); /* We'll be putting the bufferevent in this field.*/
114         return 1;
115 }
116
117 /* Called to uninitialize the BIO. */
118 static int
119 bio_bufferevent_free(BIO *b)
120 {
121         if (!b)
122                 return 0;
123         if (BIO_get_shutdown(b)) {
124                 if (BIO_get_init(b) && BIO_get_data(b))
125                         bufferevent_free(BIO_get_data(b));
126                 BIO_free(b);
127         }
128         return 1;
129 }
130
131 /* Called to extract data from the BIO. */
132 static int
133 bio_bufferevent_read(BIO *b, char *out, int outlen)
134 {
135         int r = 0;
136         struct evbuffer *input;
137
138         BIO_clear_retry_flags(b);
139
140         if (!out)
141                 return 0;
142         if (!BIO_get_data(b))
143                 return -1;
144
145         input = bufferevent_get_input(BIO_get_data(b));
146         if (evbuffer_get_length(input) == 0) {
147                 /* If there's no data to read, say so. */
148                 BIO_set_retry_read(b);
149                 return -1;
150         } else {
151                 r = evbuffer_remove(input, out, outlen);
152         }
153
154         return r;
155 }
156
157 /* Called to write data into the BIO */
158 static int
159 bio_bufferevent_write(BIO *b, const char *in, int inlen)
160 {
161         struct bufferevent *bufev = BIO_get_data(b);
162         struct evbuffer *output;
163         size_t outlen;
164
165         BIO_clear_retry_flags(b);
166
167         if (!BIO_get_data(b))
168                 return -1;
169
170         output = bufferevent_get_output(bufev);
171         outlen = evbuffer_get_length(output);
172
173         /* Copy only as much data onto the output buffer as can fit under the
174          * high-water mark. */
175         if (bufev->wm_write.high && bufev->wm_write.high <= (outlen+inlen)) {
176                 if (bufev->wm_write.high <= outlen) {
177                         /* If no data can fit, we'll need to retry later. */
178                         BIO_set_retry_write(b);
179                         return -1;
180                 }
181                 inlen = bufev->wm_write.high - outlen;
182         }
183
184         EVUTIL_ASSERT(inlen > 0);
185         evbuffer_add(output, in, inlen);
186         return inlen;
187 }
188
189 /* Called to handle various requests */
190 static long
191 bio_bufferevent_ctrl(BIO *b, int cmd, long num, void *ptr)
192 {
193         struct bufferevent *bufev = BIO_get_data(b);
194         long ret = 1;
195
196         switch (cmd) {
197         case BIO_CTRL_GET_CLOSE:
198                 ret = BIO_get_shutdown(b);
199                 break;
200         case BIO_CTRL_SET_CLOSE:
201                 BIO_set_shutdown(b, (int)num);
202                 break;
203         case BIO_CTRL_PENDING:
204                 ret = evbuffer_get_length(bufferevent_get_input(bufev)) != 0;
205                 break;
206         case BIO_CTRL_WPENDING:
207                 ret = evbuffer_get_length(bufferevent_get_output(bufev)) != 0;
208                 break;
209         /* XXXX These two are given a special-case treatment because
210          * of cargo-cultism.  I should come up with a better reason. */
211         case BIO_CTRL_DUP:
212         case BIO_CTRL_FLUSH:
213                 ret = 1;
214                 break;
215         default:
216                 ret = 0;
217                 break;
218         }
219         return ret;
220 }
221
222 /* Called to write a string to the BIO */
223 static int
224 bio_bufferevent_puts(BIO *b, const char *s)
225 {
226         return bio_bufferevent_write(b, s, strlen(s));
227 }
228
229 /* Method table for the bufferevent BIO */
230 static BIO_METHOD *methods_bufferevent;
231
232 /* Return the method table for the bufferevents BIO */
233 static BIO_METHOD *
234 BIO_s_bufferevent(void)
235 {
236         if (methods_bufferevent == NULL) {
237                 methods_bufferevent = BIO_meth_new(BIO_TYPE_LIBEVENT, "bufferevent");
238                 if (methods_bufferevent == NULL)
239                         return NULL;
240                 BIO_meth_set_write(methods_bufferevent, bio_bufferevent_write);
241                 BIO_meth_set_read(methods_bufferevent, bio_bufferevent_read);
242                 BIO_meth_set_puts(methods_bufferevent, bio_bufferevent_puts);
243                 BIO_meth_set_ctrl(methods_bufferevent, bio_bufferevent_ctrl);
244                 BIO_meth_set_create(methods_bufferevent, bio_bufferevent_new);
245                 BIO_meth_set_destroy(methods_bufferevent, bio_bufferevent_free);
246         }
247         return methods_bufferevent;
248 }
249
250 /* Create a new BIO to wrap communication around a bufferevent.  If close_flag
251  * is true, the bufferevent will be freed when the BIO is closed. */
252 static BIO *
253 BIO_new_bufferevent(struct bufferevent *bufferevent)
254 {
255         BIO *result;
256         if (!bufferevent)
257                 return NULL;
258         if (!(result = BIO_new(BIO_s_bufferevent())))
259                 return NULL;
260         BIO_set_init(result, 1);
261         BIO_set_data(result, bufferevent);
262         /* We don't tell the BIO to close the bufferevent; we do it ourselves on
263          * be_openssl_destruct() */
264         BIO_set_shutdown(result, 0);
265         return result;
266 }
267
268 /* --------------------
269    Now, here's the OpenSSL-based implementation of bufferevent.
270
271    The implementation comes in two flavors: one that connects its SSL object
272    to an underlying bufferevent using a BIO_bufferevent, and one that has the
273    SSL object connect to a socket directly.  The latter should generally be
274    faster, except on Windows, where your best bet is using a
275    bufferevent_async.
276
277    (OpenSSL supports many other BIO types, too.  But we can't use any unless
278    we have a good way to get notified when they become readable/writable.)
279    -------------------- */
280
281 struct bio_data_counts {
282         unsigned long n_written;
283         unsigned long n_read;
284 };
285
286 struct bufferevent_openssl {
287         /* Shared fields with common bufferevent implementation code.
288            If we were set up with an underlying bufferevent, we use the
289            events here as timers only.  If we have an SSL, then we use
290            the events as socket events.
291          */
292         struct bufferevent_private bev;
293         /* An underlying bufferevent that we're directing our output to.
294            If it's NULL, then we're connected to an fd, not an evbuffer. */
295         struct bufferevent *underlying;
296         /* The SSL object doing our encryption. */
297         SSL *ssl;
298
299         /* A callback that's invoked when data arrives on our outbuf so we
300            know to write data to the SSL. */
301         struct evbuffer_cb_entry *outbuf_cb;
302
303         /* A count of how much data the bios have read/written total.  Used
304            for rate-limiting. */
305         struct bio_data_counts counts;
306
307         /* If this value is greater than 0, then the last SSL_write blocked,
308          * and we need to try it again with this many bytes. */
309         ev_ssize_t last_write;
310
311 #define NUM_ERRORS 3
312         ev_uint32_t errors[NUM_ERRORS];
313
314         /* When we next get available space, we should say "read" instead of
315            "write". This can happen if there's a renegotiation during a read
316            operation. */
317         unsigned read_blocked_on_write : 1;
318         /* When we next get data, we should say "write" instead of "read". */
319         unsigned write_blocked_on_read : 1;
320         /* Treat TCP close before SSL close on SSL >= v3 as clean EOF. */
321         unsigned allow_dirty_shutdown : 1;
322         /* XXX */
323         unsigned n_errors : 2;
324
325         /* Are we currently connecting, accepting, or doing IO? */
326         unsigned state : 2;
327         /* If we reset fd, we sould reset state too */
328         unsigned old_state : 2;
329 };
330
331 static int be_openssl_enable(struct bufferevent *, short);
332 static int be_openssl_disable(struct bufferevent *, short);
333 static void be_openssl_unlink(struct bufferevent *);
334 static void be_openssl_destruct(struct bufferevent *);
335 static int be_openssl_adj_timeouts(struct bufferevent *);
336 static int be_openssl_flush(struct bufferevent *bufev,
337     short iotype, enum bufferevent_flush_mode mode);
338 static int be_openssl_ctrl(struct bufferevent *, enum bufferevent_ctrl_op, union bufferevent_ctrl_data *);
339
340 const struct bufferevent_ops bufferevent_ops_openssl = {
341         "ssl",
342         evutil_offsetof(struct bufferevent_openssl, bev.bev),
343         be_openssl_enable,
344         be_openssl_disable,
345         be_openssl_unlink,
346         be_openssl_destruct,
347         be_openssl_adj_timeouts,
348         be_openssl_flush,
349         be_openssl_ctrl,
350 };
351
352 /* Given a bufferevent, return a pointer to the bufferevent_openssl that
353  * contains it, if any. */
354 static inline struct bufferevent_openssl *
355 upcast(struct bufferevent *bev)
356 {
357         struct bufferevent_openssl *bev_o;
358         if (!BEV_IS_OPENSSL(bev))
359                 return NULL;
360         bev_o = (void*)( ((char*)bev) -
361                          evutil_offsetof(struct bufferevent_openssl, bev.bev));
362         EVUTIL_ASSERT(BEV_IS_OPENSSL(&bev_o->bev.bev));
363         return bev_o;
364 }
365
366 static inline void
367 put_error(struct bufferevent_openssl *bev_ssl, unsigned long err)
368 {
369         if (bev_ssl->n_errors == NUM_ERRORS)
370                 return;
371         /* The error type according to openssl is "unsigned long", but
372            openssl never uses more than 32 bits of it.  It _can't_ use more
373            than 32 bits of it, since it needs to report errors on systems
374            where long is only 32 bits.
375          */
376         bev_ssl->errors[bev_ssl->n_errors++] = (ev_uint32_t) err;
377 }
378
379 /* Have the base communications channel (either the underlying bufferevent or
380  * ev_read and ev_write) start reading.  Take the read-blocked-on-write flag
381  * into account. */
382 static int
383 start_reading(struct bufferevent_openssl *bev_ssl)
384 {
385         if (bev_ssl->underlying) {
386                 bufferevent_unsuspend_read_(bev_ssl->underlying,
387                     BEV_SUSPEND_FILT_READ);
388                 return 0;
389         } else {
390                 struct bufferevent *bev = &bev_ssl->bev.bev;
391                 int r;
392                 r = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
393                 if (r == 0 && bev_ssl->read_blocked_on_write)
394                         r = bufferevent_add_event_(&bev->ev_write,
395                             &bev->timeout_write);
396                 return r;
397         }
398 }
399
400 /* Have the base communications channel (either the underlying bufferevent or
401  * ev_read and ev_write) start writing.  Take the write-blocked-on-read flag
402  * into account. */
403 static int
404 start_writing(struct bufferevent_openssl *bev_ssl)
405 {
406         int r = 0;
407         if (bev_ssl->underlying) {
408                 if (bev_ssl->write_blocked_on_read) {
409                         bufferevent_unsuspend_read_(bev_ssl->underlying,
410                             BEV_SUSPEND_FILT_READ);
411                 }
412         } else {
413                 struct bufferevent *bev = &bev_ssl->bev.bev;
414                 r = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
415                 if (!r && bev_ssl->write_blocked_on_read)
416                         r = bufferevent_add_event_(&bev->ev_read,
417                             &bev->timeout_read);
418         }
419         return r;
420 }
421
422 static void
423 stop_reading(struct bufferevent_openssl *bev_ssl)
424 {
425         if (bev_ssl->write_blocked_on_read)
426                 return;
427         if (bev_ssl->underlying) {
428                 bufferevent_suspend_read_(bev_ssl->underlying,
429                     BEV_SUSPEND_FILT_READ);
430         } else {
431                 struct bufferevent *bev = &bev_ssl->bev.bev;
432                 event_del(&bev->ev_read);
433         }
434 }
435
436 static void
437 stop_writing(struct bufferevent_openssl *bev_ssl)
438 {
439         if (bev_ssl->read_blocked_on_write)
440                 return;
441         if (bev_ssl->underlying) {
442                 bufferevent_unsuspend_read_(bev_ssl->underlying,
443                     BEV_SUSPEND_FILT_READ);
444         } else {
445                 struct bufferevent *bev = &bev_ssl->bev.bev;
446                 event_del(&bev->ev_write);
447         }
448 }
449
450 static int
451 set_rbow(struct bufferevent_openssl *bev_ssl)
452 {
453         if (!bev_ssl->underlying)
454                 stop_reading(bev_ssl);
455         bev_ssl->read_blocked_on_write = 1;
456         return start_writing(bev_ssl);
457 }
458
459 static int
460 set_wbor(struct bufferevent_openssl *bev_ssl)
461 {
462         if (!bev_ssl->underlying)
463                 stop_writing(bev_ssl);
464         bev_ssl->write_blocked_on_read = 1;
465         return start_reading(bev_ssl);
466 }
467
468 static int
469 clear_rbow(struct bufferevent_openssl *bev_ssl)
470 {
471         struct bufferevent *bev = &bev_ssl->bev.bev;
472         int r = 0;
473         bev_ssl->read_blocked_on_write = 0;
474         if (!(bev->enabled & EV_WRITE))
475                 stop_writing(bev_ssl);
476         if (bev->enabled & EV_READ)
477                 r = start_reading(bev_ssl);
478         return r;
479 }
480
481
482 static int
483 clear_wbor(struct bufferevent_openssl *bev_ssl)
484 {
485         struct bufferevent *bev = &bev_ssl->bev.bev;
486         int r = 0;
487         bev_ssl->write_blocked_on_read = 0;
488         if (!(bev->enabled & EV_READ))
489                 stop_reading(bev_ssl);
490         if (bev->enabled & EV_WRITE)
491                 r = start_writing(bev_ssl);
492         return r;
493 }
494
495 static void
496 conn_closed(struct bufferevent_openssl *bev_ssl, int when, int errcode, int ret)
497 {
498         int event = BEV_EVENT_ERROR;
499         int dirty_shutdown = 0;
500         unsigned long err;
501
502         switch (errcode) {
503         case SSL_ERROR_ZERO_RETURN:
504                 /* Possibly a clean shutdown. */
505                 if (SSL_get_shutdown(bev_ssl->ssl) & SSL_RECEIVED_SHUTDOWN)
506                         event = BEV_EVENT_EOF;
507                 else
508                         dirty_shutdown = 1;
509                 break;
510         case SSL_ERROR_SYSCALL:
511                 /* IO error; possibly a dirty shutdown. */
512                 if ((ret == 0 || ret == -1) && ERR_peek_error() == 0)
513                         dirty_shutdown = 1;
514                 put_error(bev_ssl, errcode);
515                 break;
516         case SSL_ERROR_SSL:
517                 /* Protocol error. */
518                 put_error(bev_ssl, errcode);
519                 break;
520         case SSL_ERROR_WANT_X509_LOOKUP:
521                 /* XXXX handle this. */
522                 put_error(bev_ssl, errcode);
523                 break;
524         case SSL_ERROR_NONE:
525         case SSL_ERROR_WANT_READ:
526         case SSL_ERROR_WANT_WRITE:
527         case SSL_ERROR_WANT_CONNECT:
528         case SSL_ERROR_WANT_ACCEPT:
529         default:
530                 /* should be impossible; treat as normal error. */
531                 event_warnx("BUG: Unexpected OpenSSL error code %d", errcode);
532                 break;
533         }
534
535         while ((err = ERR_get_error())) {
536                 put_error(bev_ssl, err);
537         }
538
539         if (dirty_shutdown && bev_ssl->allow_dirty_shutdown)
540                 event = BEV_EVENT_EOF;
541
542         stop_reading(bev_ssl);
543         stop_writing(bev_ssl);
544
545         /* when is BEV_EVENT_{READING|WRITING} */
546         event = when | event;
547         bufferevent_run_eventcb_(&bev_ssl->bev.bev, event, 0);
548 }
549
550 static void
551 init_bio_counts(struct bufferevent_openssl *bev_ssl)
552 {
553         BIO *rbio, *wbio;
554
555         wbio = SSL_get_wbio(bev_ssl->ssl);
556         bev_ssl->counts.n_written = wbio ? BIO_number_written(wbio) : 0;
557         rbio = SSL_get_rbio(bev_ssl->ssl);
558         bev_ssl->counts.n_read = rbio ? BIO_number_read(rbio) : 0;
559 }
560
561 static inline void
562 decrement_buckets(struct bufferevent_openssl *bev_ssl)
563 {
564         unsigned long num_w = BIO_number_written(SSL_get_wbio(bev_ssl->ssl));
565         unsigned long num_r = BIO_number_read(SSL_get_rbio(bev_ssl->ssl));
566         /* These next two subtractions can wrap around. That's okay. */
567         unsigned long w = num_w - bev_ssl->counts.n_written;
568         unsigned long r = num_r - bev_ssl->counts.n_read;
569         if (w)
570                 bufferevent_decrement_write_buckets_(&bev_ssl->bev, w);
571         if (r)
572                 bufferevent_decrement_read_buckets_(&bev_ssl->bev, r);
573         bev_ssl->counts.n_written = num_w;
574         bev_ssl->counts.n_read = num_r;
575 }
576
577 #define OP_MADE_PROGRESS 1
578 #define OP_BLOCKED 2
579 #define OP_ERR 4
580
581 /* Return a bitmask of OP_MADE_PROGRESS (if we read anything); OP_BLOCKED (if
582    we're now blocked); and OP_ERR (if an error occurred). */
583 static int
584 do_read(struct bufferevent_openssl *bev_ssl, int n_to_read) {
585         /* Requires lock */
586         struct bufferevent *bev = &bev_ssl->bev.bev;
587         struct evbuffer *input = bev->input;
588         int r, n, i, n_used = 0, atmost;
589         struct evbuffer_iovec space[2];
590         int result = 0;
591
592         if (bev_ssl->bev.read_suspended)
593                 return 0;
594
595         atmost = bufferevent_get_read_max_(&bev_ssl->bev);
596         if (n_to_read > atmost)
597                 n_to_read = atmost;
598
599         n = evbuffer_reserve_space(input, n_to_read, space, 2);
600         if (n < 0)
601                 return OP_ERR;
602
603         for (i=0; i<n; ++i) {
604                 if (bev_ssl->bev.read_suspended)
605                         break;
606                 ERR_clear_error();
607                 r = SSL_read(bev_ssl->ssl, space[i].iov_base, space[i].iov_len);
608                 if (r>0) {
609                         result |= OP_MADE_PROGRESS;
610                         if (bev_ssl->read_blocked_on_write)
611                                 if (clear_rbow(bev_ssl) < 0)
612                                         return OP_ERR | result;
613                         ++n_used;
614                         space[i].iov_len = r;
615                         decrement_buckets(bev_ssl);
616                 } else {
617                         int err = SSL_get_error(bev_ssl->ssl, r);
618                         print_err(err);
619                         switch (err) {
620                         case SSL_ERROR_WANT_READ:
621                                 /* Can't read until underlying has more data. */
622                                 if (bev_ssl->read_blocked_on_write)
623                                         if (clear_rbow(bev_ssl) < 0)
624                                                 return OP_ERR | result;
625                                 break;
626                         case SSL_ERROR_WANT_WRITE:
627                                 /* This read operation requires a write, and the
628                                  * underlying is full */
629                                 if (!bev_ssl->read_blocked_on_write)
630                                         if (set_rbow(bev_ssl) < 0)
631                                                 return OP_ERR | result;
632                                 break;
633                         default:
634                                 conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
635                                 break;
636                         }
637                         result |= OP_BLOCKED;
638                         break; /* out of the loop */
639                 }
640         }
641
642         if (n_used) {
643                 evbuffer_commit_space(input, space, n_used);
644                 if (bev_ssl->underlying)
645                         BEV_RESET_GENERIC_READ_TIMEOUT(bev);
646         }
647
648         return result;
649 }
650
651 /* Return a bitmask of OP_MADE_PROGRESS (if we wrote anything); OP_BLOCKED (if
652    we're now blocked); and OP_ERR (if an error occurred). */
653 static int
654 do_write(struct bufferevent_openssl *bev_ssl, int atmost)
655 {
656         int i, r, n, n_written = 0;
657         struct bufferevent *bev = &bev_ssl->bev.bev;
658         struct evbuffer *output = bev->output;
659         struct evbuffer_iovec space[8];
660         int result = 0;
661
662         if (bev_ssl->last_write > 0)
663                 atmost = bev_ssl->last_write;
664         else
665                 atmost = bufferevent_get_write_max_(&bev_ssl->bev);
666
667         n = evbuffer_peek(output, atmost, NULL, space, 8);
668         if (n < 0)
669                 return OP_ERR | result;
670
671         if (n > 8)
672                 n = 8;
673         for (i=0; i < n; ++i) {
674                 if (bev_ssl->bev.write_suspended)
675                         break;
676
677                 /* SSL_write will (reasonably) return 0 if we tell it to
678                    send 0 data.  Skip this case so we don't interpret the
679                    result as an error */
680                 if (space[i].iov_len == 0)
681                         continue;
682
683                 ERR_clear_error();
684                 r = SSL_write(bev_ssl->ssl, space[i].iov_base,
685                     space[i].iov_len);
686                 if (r > 0) {
687                         result |= OP_MADE_PROGRESS;
688                         if (bev_ssl->write_blocked_on_read)
689                                 if (clear_wbor(bev_ssl) < 0)
690                                         return OP_ERR | result;
691                         n_written += r;
692                         bev_ssl->last_write = -1;
693                         decrement_buckets(bev_ssl);
694                 } else {
695                         int err = SSL_get_error(bev_ssl->ssl, r);
696                         print_err(err);
697                         switch (err) {
698                         case SSL_ERROR_WANT_WRITE:
699                                 /* Can't read until underlying has more data. */
700                                 if (bev_ssl->write_blocked_on_read)
701                                         if (clear_wbor(bev_ssl) < 0)
702                                                 return OP_ERR | result;
703                                 bev_ssl->last_write = space[i].iov_len;
704                                 break;
705                         case SSL_ERROR_WANT_READ:
706                                 /* This read operation requires a write, and the
707                                  * underlying is full */
708                                 if (!bev_ssl->write_blocked_on_read)
709                                         if (set_wbor(bev_ssl) < 0)
710                                                 return OP_ERR | result;
711                                 bev_ssl->last_write = space[i].iov_len;
712                                 break;
713                         default:
714                                 conn_closed(bev_ssl, BEV_EVENT_WRITING, err, r);
715                                 bev_ssl->last_write = -1;
716                                 break;
717                         }
718                         result |= OP_BLOCKED;
719                         break;
720                 }
721         }
722         if (n_written) {
723                 evbuffer_drain(output, n_written);
724                 if (bev_ssl->underlying)
725                         BEV_RESET_GENERIC_WRITE_TIMEOUT(bev);
726
727                 bufferevent_trigger_nolock_(bev, EV_WRITE, BEV_OPT_DEFER_CALLBACKS);
728         }
729         return result;
730 }
731
732 #define WRITE_FRAME 15000
733
734 #define READ_DEFAULT 4096
735
736 /* Try to figure out how many bytes to read; return 0 if we shouldn't be
737  * reading. */
738 static int
739 bytes_to_read(struct bufferevent_openssl *bev)
740 {
741         struct evbuffer *input = bev->bev.bev.input;
742         struct event_watermark *wm = &bev->bev.bev.wm_read;
743         int result = READ_DEFAULT;
744         ev_ssize_t limit;
745         /* XXX 99% of this is generic code that nearly all bufferevents will
746          * want. */
747
748         if (bev->write_blocked_on_read) {
749                 return 0;
750         }
751
752         if (! (bev->bev.bev.enabled & EV_READ)) {
753                 return 0;
754         }
755
756         if (bev->bev.read_suspended) {
757                 return 0;
758         }
759
760         if (wm->high) {
761                 if (evbuffer_get_length(input) >= wm->high) {
762                         return 0;
763                 }
764
765                 result = wm->high - evbuffer_get_length(input);
766         } else {
767                 result = READ_DEFAULT;
768         }
769
770         /* Respect the rate limit */
771         limit = bufferevent_get_read_max_(&bev->bev);
772         if (result > limit) {
773                 result = limit;
774         }
775
776         return result;
777 }
778
779
780 /* Things look readable.  If write is blocked on read, write till it isn't.
781  * Read from the underlying buffer until we block or we hit our high-water
782  * mark.
783  */
784 static void
785 consider_reading(struct bufferevent_openssl *bev_ssl)
786 {
787         int r;
788         int n_to_read;
789         int all_result_flags = 0;
790
791         while (bev_ssl->write_blocked_on_read) {
792                 r = do_write(bev_ssl, WRITE_FRAME);
793                 if (r & (OP_BLOCKED|OP_ERR))
794                         break;
795         }
796         if (bev_ssl->write_blocked_on_read)
797                 return;
798
799         n_to_read = bytes_to_read(bev_ssl);
800
801         while (n_to_read) {
802                 r = do_read(bev_ssl, n_to_read);
803                 all_result_flags |= r;
804
805                 if (r & (OP_BLOCKED|OP_ERR))
806                         break;
807
808                 if (bev_ssl->bev.read_suspended)
809                         break;
810
811                 /* Read all pending data.  This won't hit the network
812                  * again, and will (most importantly) put us in a state
813                  * where we don't need to read anything else until the
814                  * socket is readable again.  It'll potentially make us
815                  * overrun our read high-watermark (somewhat
816                  * regrettable).  The damage to the rate-limit has
817                  * already been done, since OpenSSL went and read a
818                  * whole SSL record anyway. */
819                 n_to_read = SSL_pending(bev_ssl->ssl);
820
821                 /* XXX This if statement is actually a bad bug, added to avoid
822                  * XXX a worse bug.
823                  *
824                  * The bad bug: It can potentially cause resource unfairness
825                  * by reading too much data from the underlying bufferevent;
826                  * it can potentially cause read looping if the underlying
827                  * bufferevent is a bufferevent_pair and deferred callbacks
828                  * aren't used.
829                  *
830                  * The worse bug: If we didn't do this, then we would
831                  * potentially not read any more from bev_ssl->underlying
832                  * until more data arrived there, which could lead to us
833                  * waiting forever.
834                  */
835                 if (!n_to_read && bev_ssl->underlying)
836                         n_to_read = bytes_to_read(bev_ssl);
837         }
838
839         if (all_result_flags & OP_MADE_PROGRESS) {
840                 struct bufferevent *bev = &bev_ssl->bev.bev;
841
842                 bufferevent_trigger_nolock_(bev, EV_READ, 0);
843         }
844
845         if (!bev_ssl->underlying) {
846                 /* Should be redundant, but let's avoid busy-looping */
847                 if (bev_ssl->bev.read_suspended ||
848                     !(bev_ssl->bev.bev.enabled & EV_READ)) {
849                         event_del(&bev_ssl->bev.bev.ev_read);
850                 }
851         }
852 }
853
854 static void
855 consider_writing(struct bufferevent_openssl *bev_ssl)
856 {
857         int r;
858         struct evbuffer *output = bev_ssl->bev.bev.output;
859         struct evbuffer *target = NULL;
860         struct event_watermark *wm = NULL;
861
862         while (bev_ssl->read_blocked_on_write) {
863                 r = do_read(bev_ssl, 1024); /* XXXX 1024 is a hack */
864                 if (r & OP_MADE_PROGRESS) {
865                         struct bufferevent *bev = &bev_ssl->bev.bev;
866
867                         bufferevent_trigger_nolock_(bev, EV_READ, 0);
868                 }
869                 if (r & (OP_ERR|OP_BLOCKED))
870                         break;
871         }
872         if (bev_ssl->read_blocked_on_write)
873                 return;
874         if (bev_ssl->underlying) {
875                 target = bev_ssl->underlying->output;
876                 wm = &bev_ssl->underlying->wm_write;
877         }
878         while ((bev_ssl->bev.bev.enabled & EV_WRITE) &&
879             (! bev_ssl->bev.write_suspended) &&
880             evbuffer_get_length(output) &&
881             (!target || (! wm->high || evbuffer_get_length(target) < wm->high))) {
882                 int n_to_write;
883                 if (wm && wm->high)
884                         n_to_write = wm->high - evbuffer_get_length(target);
885                 else
886                         n_to_write = WRITE_FRAME;
887                 r = do_write(bev_ssl, n_to_write);
888                 if (r & (OP_BLOCKED|OP_ERR))
889                         break;
890         }
891
892         if (!bev_ssl->underlying) {
893                 if (evbuffer_get_length(output) == 0) {
894                         event_del(&bev_ssl->bev.bev.ev_write);
895                 } else if (bev_ssl->bev.write_suspended ||
896                     !(bev_ssl->bev.bev.enabled & EV_WRITE)) {
897                         /* Should be redundant, but let's avoid busy-looping */
898                         event_del(&bev_ssl->bev.bev.ev_write);
899                 }
900         }
901 }
902
903 static void
904 be_openssl_readcb(struct bufferevent *bev_base, void *ctx)
905 {
906         struct bufferevent_openssl *bev_ssl = ctx;
907         consider_reading(bev_ssl);
908 }
909
910 static void
911 be_openssl_writecb(struct bufferevent *bev_base, void *ctx)
912 {
913         struct bufferevent_openssl *bev_ssl = ctx;
914         consider_writing(bev_ssl);
915 }
916
917 static void
918 be_openssl_eventcb(struct bufferevent *bev_base, short what, void *ctx)
919 {
920         struct bufferevent_openssl *bev_ssl = ctx;
921         int event = 0;
922
923         if (what & BEV_EVENT_EOF) {
924                 if (bev_ssl->allow_dirty_shutdown)
925                         event = BEV_EVENT_EOF;
926                 else
927                         event = BEV_EVENT_ERROR;
928         } else if (what & BEV_EVENT_TIMEOUT) {
929                 /* We sure didn't set this.  Propagate it to the user. */
930                 event = what;
931         } else if (what & BEV_EVENT_ERROR) {
932                 /* An error occurred on the connection.  Propagate it to the user. */
933                 event = what;
934         } else if (what & BEV_EVENT_CONNECTED) {
935                 /* Ignore it.  We're saying SSL_connect() already, which will
936                    eat it. */
937         }
938         if (event)
939                 bufferevent_run_eventcb_(&bev_ssl->bev.bev, event, 0);
940 }
941
942 static void
943 be_openssl_readeventcb(evutil_socket_t fd, short what, void *ptr)
944 {
945         struct bufferevent_openssl *bev_ssl = ptr;
946         bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
947         if (what == EV_TIMEOUT) {
948                 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
949                     BEV_EVENT_TIMEOUT|BEV_EVENT_READING, 0);
950         } else {
951                 consider_reading(bev_ssl);
952         }
953         bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
954 }
955
956 static void
957 be_openssl_writeeventcb(evutil_socket_t fd, short what, void *ptr)
958 {
959         struct bufferevent_openssl *bev_ssl = ptr;
960         bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
961         if (what == EV_TIMEOUT) {
962                 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
963                     BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING, 0);
964         } else {
965                 consider_writing(bev_ssl);
966         }
967         bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
968 }
969
970 static evutil_socket_t
971 be_openssl_auto_fd(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
972 {
973         if (!bev_ssl->underlying) {
974                 struct bufferevent *bev = &bev_ssl->bev.bev;
975                 if (event_initialized(&bev->ev_read) && fd < 0) {
976                         fd = event_get_fd(&bev->ev_read);
977                 }
978         }
979         return fd;
980 }
981
982 static int
983 set_open_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
984 {
985         if (bev_ssl->underlying) {
986                 bufferevent_setcb(bev_ssl->underlying,
987                     be_openssl_readcb, be_openssl_writecb, be_openssl_eventcb,
988                     bev_ssl);
989                 return 0;
990         } else {
991                 struct bufferevent *bev = &bev_ssl->bev.bev;
992                 int rpending=0, wpending=0, r1=0, r2=0;
993
994                 if (event_initialized(&bev->ev_read)) {
995                         rpending = event_pending(&bev->ev_read, EV_READ, NULL);
996                         wpending = event_pending(&bev->ev_write, EV_WRITE, NULL);
997
998                         event_del(&bev->ev_read);
999                         event_del(&bev->ev_write);
1000                 }
1001
1002                 event_assign(&bev->ev_read, bev->ev_base, fd,
1003                     EV_READ|EV_PERSIST|EV_FINALIZE,
1004                     be_openssl_readeventcb, bev_ssl);
1005                 event_assign(&bev->ev_write, bev->ev_base, fd,
1006                     EV_WRITE|EV_PERSIST|EV_FINALIZE,
1007                     be_openssl_writeeventcb, bev_ssl);
1008
1009                 if (rpending)
1010                         r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
1011                 if (wpending)
1012                         r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
1013
1014                 return (r1<0 || r2<0) ? -1 : 0;
1015         }
1016 }
1017
1018 static int
1019 do_handshake(struct bufferevent_openssl *bev_ssl)
1020 {
1021         int r;
1022
1023         switch (bev_ssl->state) {
1024         default:
1025         case BUFFEREVENT_SSL_OPEN:
1026                 EVUTIL_ASSERT(0);
1027                 return -1;
1028         case BUFFEREVENT_SSL_CONNECTING:
1029         case BUFFEREVENT_SSL_ACCEPTING:
1030                 ERR_clear_error();
1031                 r = SSL_do_handshake(bev_ssl->ssl);
1032                 break;
1033         }
1034         decrement_buckets(bev_ssl);
1035
1036         if (r==1) {
1037                 evutil_socket_t fd = event_get_fd(&bev_ssl->bev.bev.ev_read);
1038                 /* We're done! */
1039                 bev_ssl->state = BUFFEREVENT_SSL_OPEN;
1040                 set_open_callbacks(bev_ssl, fd); /* XXXX handle failure */
1041                 /* Call do_read and do_write as needed */
1042                 bufferevent_enable(&bev_ssl->bev.bev, bev_ssl->bev.bev.enabled);
1043                 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
1044                     BEV_EVENT_CONNECTED, 0);
1045                 return 1;
1046         } else {
1047                 int err = SSL_get_error(bev_ssl->ssl, r);
1048                 print_err(err);
1049                 switch (err) {
1050                 case SSL_ERROR_WANT_WRITE:
1051                         stop_reading(bev_ssl);
1052                         return start_writing(bev_ssl);
1053                 case SSL_ERROR_WANT_READ:
1054                         stop_writing(bev_ssl);
1055                         return start_reading(bev_ssl);
1056                 default:
1057                         conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
1058                         return -1;
1059                 }
1060         }
1061 }
1062
1063 static void
1064 be_openssl_handshakecb(struct bufferevent *bev_base, void *ctx)
1065 {
1066         struct bufferevent_openssl *bev_ssl = ctx;
1067         do_handshake(bev_ssl);/* XXX handle failure */
1068 }
1069
1070 static void
1071 be_openssl_handshakeeventcb(evutil_socket_t fd, short what, void *ptr)
1072 {
1073         struct bufferevent_openssl *bev_ssl = ptr;
1074
1075         bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
1076         if (what & EV_TIMEOUT) {
1077                 bufferevent_run_eventcb_(&bev_ssl->bev.bev, BEV_EVENT_TIMEOUT, 0);
1078         } else
1079                 do_handshake(bev_ssl);/* XXX handle failure */
1080         bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
1081 }
1082
1083 static int
1084 set_handshake_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
1085 {
1086         if (bev_ssl->underlying) {
1087                 bufferevent_setcb(bev_ssl->underlying,
1088                     be_openssl_handshakecb, be_openssl_handshakecb,
1089                     be_openssl_eventcb,
1090                     bev_ssl);
1091
1092                 if (fd < 0)
1093                         return 0;
1094
1095                 if (bufferevent_setfd(bev_ssl->underlying, fd))
1096                         return 1;
1097
1098                 return do_handshake(bev_ssl);
1099         } else {
1100                 struct bufferevent *bev = &bev_ssl->bev.bev;
1101
1102                 if (event_initialized(&bev->ev_read)) {
1103                         event_del(&bev->ev_read);
1104                         event_del(&bev->ev_write);
1105                 }
1106
1107                 event_assign(&bev->ev_read, bev->ev_base, fd,
1108                     EV_READ|EV_PERSIST|EV_FINALIZE,
1109                     be_openssl_handshakeeventcb, bev_ssl);
1110                 event_assign(&bev->ev_write, bev->ev_base, fd,
1111                     EV_WRITE|EV_PERSIST|EV_FINALIZE,
1112                     be_openssl_handshakeeventcb, bev_ssl);
1113                 if (fd >= 0)
1114                         bufferevent_enable(bev, bev->enabled);
1115                 return 0;
1116         }
1117 }
1118
1119 int
1120 bufferevent_ssl_renegotiate(struct bufferevent *bev)
1121 {
1122         struct bufferevent_openssl *bev_ssl = upcast(bev);
1123         if (!bev_ssl)
1124                 return -1;
1125         if (SSL_renegotiate(bev_ssl->ssl) < 0)
1126                 return -1;
1127         bev_ssl->state = BUFFEREVENT_SSL_CONNECTING;
1128         if (set_handshake_callbacks(bev_ssl, be_openssl_auto_fd(bev_ssl, -1)) < 0)
1129                 return -1;
1130         if (!bev_ssl->underlying)
1131                 return do_handshake(bev_ssl);
1132         return 0;
1133 }
1134
1135 static void
1136 be_openssl_outbuf_cb(struct evbuffer *buf,
1137     const struct evbuffer_cb_info *cbinfo, void *arg)
1138 {
1139         struct bufferevent_openssl *bev_ssl = arg;
1140         int r = 0;
1141         /* XXX need to hold a reference here. */
1142
1143         if (cbinfo->n_added && bev_ssl->state == BUFFEREVENT_SSL_OPEN) {
1144                 if (cbinfo->orig_size == 0)
1145                         r = bufferevent_add_event_(&bev_ssl->bev.bev.ev_write,
1146                             &bev_ssl->bev.bev.timeout_write);
1147
1148                 if (bev_ssl->underlying)
1149                         consider_writing(bev_ssl);
1150         }
1151         /* XXX Handle r < 0 */
1152         (void)r;
1153 }
1154
1155
1156 static int
1157 be_openssl_enable(struct bufferevent *bev, short events)
1158 {
1159         struct bufferevent_openssl *bev_ssl = upcast(bev);
1160         int r1 = 0, r2 = 0;
1161
1162         if (events & EV_READ)
1163                 r1 = start_reading(bev_ssl);
1164         if (events & EV_WRITE)
1165                 r2 = start_writing(bev_ssl);
1166
1167         if (bev_ssl->underlying) {
1168                 if (events & EV_READ)
1169                         BEV_RESET_GENERIC_READ_TIMEOUT(bev);
1170                 if (events & EV_WRITE)
1171                         BEV_RESET_GENERIC_WRITE_TIMEOUT(bev);
1172
1173                 if (events & EV_READ)
1174                         consider_reading(bev_ssl);
1175                 if (events & EV_WRITE)
1176                         consider_writing(bev_ssl);
1177         }
1178         return (r1 < 0 || r2 < 0) ? -1 : 0;
1179 }
1180
1181 static int
1182 be_openssl_disable(struct bufferevent *bev, short events)
1183 {
1184         struct bufferevent_openssl *bev_ssl = upcast(bev);
1185
1186         if (events & EV_READ)
1187                 stop_reading(bev_ssl);
1188         if (events & EV_WRITE)
1189                 stop_writing(bev_ssl);
1190
1191         if (bev_ssl->underlying) {
1192                 if (events & EV_READ)
1193                         BEV_DEL_GENERIC_READ_TIMEOUT(bev);
1194                 if (events & EV_WRITE)
1195                         BEV_DEL_GENERIC_WRITE_TIMEOUT(bev);
1196         }
1197         return 0;
1198 }
1199
1200 static void
1201 be_openssl_unlink(struct bufferevent *bev)
1202 {
1203         struct bufferevent_openssl *bev_ssl = upcast(bev);
1204
1205         if (bev_ssl->bev.options & BEV_OPT_CLOSE_ON_FREE) {
1206                 if (bev_ssl->underlying) {
1207                         if (BEV_UPCAST(bev_ssl->underlying)->refcnt < 2) {
1208                                 event_warnx("BEV_OPT_CLOSE_ON_FREE set on an "
1209                                     "bufferevent with too few references");
1210                         } else {
1211                                 bufferevent_free(bev_ssl->underlying);
1212                                 /* We still have a reference to it, via our
1213                                  * BIO. So we don't drop this. */
1214                                 // bev_ssl->underlying = NULL;
1215                         }
1216                 }
1217         } else {
1218                 if (bev_ssl->underlying) {
1219                         if (bev_ssl->underlying->errorcb == be_openssl_eventcb)
1220                                 bufferevent_setcb(bev_ssl->underlying,
1221                                     NULL,NULL,NULL,NULL);
1222                         bufferevent_unsuspend_read_(bev_ssl->underlying,
1223                             BEV_SUSPEND_FILT_READ);
1224                 }
1225         }
1226 }
1227
1228 static void
1229 be_openssl_destruct(struct bufferevent *bev)
1230 {
1231         struct bufferevent_openssl *bev_ssl = upcast(bev);
1232
1233         if (bev_ssl->bev.options & BEV_OPT_CLOSE_ON_FREE) {
1234                 if (! bev_ssl->underlying) {
1235                         evutil_socket_t fd = EVUTIL_INVALID_SOCKET;
1236                         BIO *bio = SSL_get_wbio(bev_ssl->ssl);
1237                         if (bio)
1238                                 fd = BIO_get_fd(bio, NULL);
1239                         if (fd >= 0)
1240                                 evutil_closesocket(fd);
1241                 }
1242                 SSL_free(bev_ssl->ssl);
1243         }
1244 }
1245
1246 static int
1247 be_openssl_adj_timeouts(struct bufferevent *bev)
1248 {
1249         struct bufferevent_openssl *bev_ssl = upcast(bev);
1250
1251         if (bev_ssl->underlying) {
1252                 return bufferevent_generic_adj_timeouts_(bev);
1253         } else {
1254                 return bufferevent_generic_adj_existing_timeouts_(bev);
1255         }
1256 }
1257
1258 static int
1259 be_openssl_flush(struct bufferevent *bufev,
1260     short iotype, enum bufferevent_flush_mode mode)
1261 {
1262         /* XXXX Implement this. */
1263         return 0;
1264 }
1265
1266 static int
1267 be_openssl_set_fd(struct bufferevent_openssl *bev_ssl,
1268     enum bufferevent_ssl_state state, evutil_socket_t fd)
1269 {
1270         bev_ssl->state = state;
1271
1272         switch (state) {
1273         case BUFFEREVENT_SSL_ACCEPTING:
1274                 if (!SSL_clear(bev_ssl->ssl))
1275                         return -1;
1276                 SSL_set_accept_state(bev_ssl->ssl);
1277                 if (set_handshake_callbacks(bev_ssl, fd) < 0)
1278                         return -1;
1279                 break;
1280         case BUFFEREVENT_SSL_CONNECTING:
1281                 if (!SSL_clear(bev_ssl->ssl))
1282                         return -1;
1283                 SSL_set_connect_state(bev_ssl->ssl);
1284                 if (set_handshake_callbacks(bev_ssl, fd) < 0)
1285                         return -1;
1286                 break;
1287         case BUFFEREVENT_SSL_OPEN:
1288                 if (set_open_callbacks(bev_ssl, fd) < 0)
1289                         return -1;
1290                 break;
1291         default:
1292                 return -1;
1293         }
1294
1295         return 0;
1296 }
1297
1298 static int
1299 be_openssl_ctrl(struct bufferevent *bev,
1300     enum bufferevent_ctrl_op op, union bufferevent_ctrl_data *data)
1301 {
1302         struct bufferevent_openssl *bev_ssl = upcast(bev);
1303         switch (op) {
1304         case BEV_CTRL_SET_FD:
1305                 if (!bev_ssl->underlying) {
1306                         BIO *bio;
1307                         bio = BIO_new_socket((int)data->fd, 0);
1308                         SSL_set_bio(bev_ssl->ssl, bio, bio);
1309                 } else {
1310                         BIO *bio;
1311                         if (!(bio = BIO_new_bufferevent(bev_ssl->underlying)))
1312                                 return -1;
1313                         SSL_set_bio(bev_ssl->ssl, bio, bio);
1314                 }
1315
1316                 return be_openssl_set_fd(bev_ssl, bev_ssl->old_state, data->fd);
1317         case BEV_CTRL_GET_FD:
1318                 if (bev_ssl->underlying) {
1319                         data->fd = event_get_fd(&bev_ssl->underlying->ev_read);
1320                 } else {
1321                         data->fd = event_get_fd(&bev->ev_read);
1322                 }
1323                 return 0;
1324         case BEV_CTRL_GET_UNDERLYING:
1325                 data->ptr = bev_ssl->underlying;
1326                 return 0;
1327         case BEV_CTRL_CANCEL_ALL:
1328         default:
1329                 return -1;
1330         }
1331 }
1332
1333 SSL *
1334 bufferevent_openssl_get_ssl(struct bufferevent *bufev)
1335 {
1336         struct bufferevent_openssl *bev_ssl = upcast(bufev);
1337         if (!bev_ssl)
1338                 return NULL;
1339         return bev_ssl->ssl;
1340 }
1341
1342 static struct bufferevent *
1343 bufferevent_openssl_new_impl(struct event_base *base,
1344     struct bufferevent *underlying,
1345     evutil_socket_t fd,
1346     SSL *ssl,
1347     enum bufferevent_ssl_state state,
1348     int options)
1349 {
1350         struct bufferevent_openssl *bev_ssl = NULL;
1351         struct bufferevent_private *bev_p = NULL;
1352         int tmp_options = options & ~BEV_OPT_THREADSAFE;
1353
1354         /* Only one can be set. */
1355         if (underlying != NULL && fd >= 0)
1356                 goto err;
1357
1358         if (!(bev_ssl = mm_calloc(1, sizeof(struct bufferevent_openssl))))
1359                 goto err;
1360
1361         bev_p = &bev_ssl->bev;
1362
1363         if (bufferevent_init_common_(bev_p, base,
1364                 &bufferevent_ops_openssl, tmp_options) < 0)
1365                 goto err;
1366
1367         /* Don't explode if we decide to realloc a chunk we're writing from in
1368          * the output buffer. */
1369         SSL_set_mode(ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
1370
1371         bev_ssl->underlying = underlying;
1372         bev_ssl->ssl = ssl;
1373
1374         bev_ssl->outbuf_cb = evbuffer_add_cb(bev_p->bev.output,
1375             be_openssl_outbuf_cb, bev_ssl);
1376
1377         if (options & BEV_OPT_THREADSAFE)
1378                 bufferevent_enable_locking_(&bev_ssl->bev.bev, NULL);
1379
1380         if (underlying) {
1381                 bufferevent_init_generic_timeout_cbs_(&bev_ssl->bev.bev);
1382                 bufferevent_incref_(underlying);
1383         }
1384
1385         bev_ssl->old_state = state;
1386         bev_ssl->last_write = -1;
1387
1388         init_bio_counts(bev_ssl);
1389
1390         fd = be_openssl_auto_fd(bev_ssl, fd);
1391         if (be_openssl_set_fd(bev_ssl, state, fd))
1392                 goto err;
1393
1394         if (underlying) {
1395                 bufferevent_setwatermark(underlying, EV_READ, 0, 0);
1396                 bufferevent_enable(underlying, EV_READ|EV_WRITE);
1397                 if (state == BUFFEREVENT_SSL_OPEN)
1398                         bufferevent_suspend_read_(underlying,
1399                             BEV_SUSPEND_FILT_READ);
1400         }
1401
1402         return &bev_ssl->bev.bev;
1403 err:
1404         if (options & BEV_OPT_CLOSE_ON_FREE)
1405                 SSL_free(ssl);
1406         if (bev_ssl) {
1407                 bev_ssl->ssl = NULL;
1408                 bufferevent_free(&bev_ssl->bev.bev);
1409         }
1410         return NULL;
1411 }
1412
1413 struct bufferevent *
1414 bufferevent_openssl_filter_new(struct event_base *base,
1415     struct bufferevent *underlying,
1416     SSL *ssl,
1417     enum bufferevent_ssl_state state,
1418     int options)
1419 {
1420         BIO *bio;
1421         struct bufferevent *bev;
1422
1423         if (!underlying)
1424                 goto err;
1425         if (!(bio = BIO_new_bufferevent(underlying)))
1426                 goto err;
1427
1428         SSL_set_bio(ssl, bio, bio);
1429
1430         bev = bufferevent_openssl_new_impl(
1431                 base, underlying, -1, ssl, state, options);
1432         return bev;
1433
1434 err:
1435         if (options & BEV_OPT_CLOSE_ON_FREE)
1436                 SSL_free(ssl);
1437         return NULL;
1438 }
1439
1440 struct bufferevent *
1441 bufferevent_openssl_socket_new(struct event_base *base,
1442     evutil_socket_t fd,
1443     SSL *ssl,
1444     enum bufferevent_ssl_state state,
1445     int options)
1446 {
1447         /* Does the SSL already have an fd? */
1448         BIO *bio = SSL_get_wbio(ssl);
1449         long have_fd = -1;
1450
1451         if (bio)
1452                 have_fd = BIO_get_fd(bio, NULL);
1453
1454         if (have_fd >= 0) {
1455                 /* The SSL is already configured with an fd. */
1456                 if (fd < 0) {
1457                         /* We should learn the fd from the SSL. */
1458                         fd = (evutil_socket_t) have_fd;
1459                 } else if (have_fd == (long)fd) {
1460                         /* We already know the fd from the SSL; do nothing */
1461                 } else {
1462                         /* We specified an fd different from that of the SSL.
1463                            This is probably an error on our part.  Fail. */
1464                         goto err;
1465                 }
1466                 BIO_set_close(bio, 0);
1467         } else {
1468                 /* The SSL isn't configured with a BIO with an fd. */
1469                 if (fd >= 0) {
1470                         /* ... and we have an fd we want to use. */
1471                         bio = BIO_new_socket((int)fd, 0);
1472                         SSL_set_bio(ssl, bio, bio);
1473                 } else {
1474                         /* Leave the fd unset. */
1475                 }
1476         }
1477
1478         return bufferevent_openssl_new_impl(
1479                 base, NULL, fd, ssl, state, options);
1480
1481 err:
1482         if (options & BEV_OPT_CLOSE_ON_FREE)
1483                 SSL_free(ssl);
1484         return NULL;
1485 }
1486
1487 int
1488 bufferevent_openssl_get_allow_dirty_shutdown(struct bufferevent *bev)
1489 {
1490         int allow_dirty_shutdown = -1;
1491         struct bufferevent_openssl *bev_ssl;
1492         BEV_LOCK(bev);
1493         bev_ssl = upcast(bev);
1494         if (bev_ssl)
1495                 allow_dirty_shutdown = bev_ssl->allow_dirty_shutdown;
1496         BEV_UNLOCK(bev);
1497         return allow_dirty_shutdown;
1498 }
1499
1500 void
1501 bufferevent_openssl_set_allow_dirty_shutdown(struct bufferevent *bev,
1502     int allow_dirty_shutdown)
1503 {
1504         struct bufferevent_openssl *bev_ssl;
1505         BEV_LOCK(bev);
1506         bev_ssl = upcast(bev);
1507         if (bev_ssl)
1508                 bev_ssl->allow_dirty_shutdown = !!allow_dirty_shutdown;
1509         BEV_UNLOCK(bev);
1510 }
1511
1512 unsigned long
1513 bufferevent_get_openssl_error(struct bufferevent *bev)
1514 {
1515         unsigned long err = 0;
1516         struct bufferevent_openssl *bev_ssl;
1517         BEV_LOCK(bev);
1518         bev_ssl = upcast(bev);
1519         if (bev_ssl && bev_ssl->n_errors) {
1520                 err = bev_ssl->errors[--bev_ssl->n_errors];
1521         }
1522         BEV_UNLOCK(bev);
1523         return err;
1524 }