OpenCoverage

tls_bio_cb.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/tls/tls_bio_cb.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: tls_bio_cb.c,v 1.19 2017/01/12 16:18:39 jsing Exp $ */-
2/*-
3 * Copyright (c) 2016 Tobias Pape <tobias@netshed.de>-
4 *-
5 * 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 * copyright notice and this permission notice appear in all copies.-
8 *-
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
16 */-
17-
18#include <fcntl.h>-
19#include <stdlib.h>-
20#include <unistd.h>-
21-
22#include <openssl/bio.h>-
23-
24#include <tls.h>-
25#include "tls_internal.h"-
26-
27static int bio_cb_write(BIO *bio, const char *buf, int num);-
28static int bio_cb_read(BIO *bio, char *buf, int size);-
29static int bio_cb_puts(BIO *bio, const char *str);-
30static long bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr);-
31-
32static BIO_METHOD bio_cb_method = {-
33 .type = BIO_TYPE_MEM,-
34 .name = "libtls_callbacks",-
35 .bwrite = bio_cb_write,-
36 .bread = bio_cb_read,-
37 .bputs = bio_cb_puts,-
38 .ctrl = bio_cb_ctrl,-
39};-
40-
41static BIO_METHOD *-
42bio_s_cb(void)-
43{-
44 return (&bio_cb_method);
executed 4 times by 1 test: return (&bio_cb_method);
Executed by:
  • tlstest
4
45}-
46-
47static int-
48bio_cb_puts(BIO *bio, const char *str)-
49{-
50 return (bio_cb_write(bio, str, strlen(str)));
never executed: return (bio_cb_write(bio, str, strlen(str)));
0
51}-
52-
53static long-
54bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr)-
55{-
56 long ret = 1;-
57-
58 switch (cmd) {-
59 case BIO_CTRL_GET_CLOSE:
never executed: case 8:
0
60 ret = (long)bio->shutdown;-
61 break;
never executed: break;
0
62 case BIO_CTRL_SET_CLOSE:
never executed: case 9:
0
63 bio->shutdown = (int)num;-
64 break;
never executed: break;
0
65 case BIO_CTRL_DUP:
never executed: case 12:
0
66 case BIO_CTRL_FLUSH:
executed 6 times by 1 test: case 11:
Executed by:
  • tlstest
6
67 break;
executed 6 times by 1 test: break;
Executed by:
  • tlstest
6
68 case BIO_CTRL_INFO:
never executed: case 3:
0
69 case BIO_CTRL_GET:
never executed: case 5:
0
70 case BIO_CTRL_SET:
never executed: case 4:
0
71 default:
executed 8 times by 1 test: default:
Executed by:
  • tlstest
8
72 ret = BIO_ctrl(bio->next_bio, cmd, num, ptr);-
73 }
executed 8 times by 1 test: end of block
Executed by:
  • tlstest
8
74-
75 return (ret);
executed 14 times by 1 test: return (ret);
Executed by:
  • tlstest
14
76}-
77-
78static int-
79bio_cb_write(BIO *bio, const char *buf, int num)-
80{-
81 struct tls *ctx = bio->ptr;-
82 int rv;-
83-
84 BIO_clear_retry_flags(bio);-
85 rv = (ctx->write_cb)(ctx, buf, num, ctx->cb_arg);-
86 if (rv == TLS_WANT_POLLIN) {
rv == -2Description
TRUEnever evaluated
FALSEevaluated 20 times by 1 test
Evaluated by:
  • tlstest
0-20
87 BIO_set_retry_read(bio);-
88 rv = -1;-
89 } else if (rv == TLS_WANT_POLLOUT) {
never executed: end of block
rv == -3Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tlstest
0-16
90 BIO_set_retry_write(bio);-
91 rv = -1;-
92 }
executed 4 times by 1 test: end of block
Executed by:
  • tlstest
4
93 return (rv);
executed 20 times by 1 test: return (rv);
Executed by:
  • tlstest
20
94}-
95-
96static int-
97bio_cb_read(BIO *bio, char *buf, int size)-
98{-
99 struct tls *ctx = bio->ptr;-
100 int rv;-
101-
102 BIO_clear_retry_flags(bio);-
103 rv = (ctx->read_cb)(ctx, buf, size, ctx->cb_arg);-
104 if (rv == TLS_WANT_POLLIN) {
rv == -2Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • tlstest
FALSEevaluated 44 times by 1 test
Evaluated by:
  • tlstest
10-44
105 BIO_set_retry_read(bio);-
106 rv = -1;-
107 } else if (rv == TLS_WANT_POLLOUT) {
executed 10 times by 1 test: end of block
Executed by:
  • tlstest
rv == -3Description
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • tlstest
0-44
108 BIO_set_retry_write(bio);-
109 rv = -1;-
110 }
never executed: end of block
0
111 return (rv);
executed 54 times by 1 test: return (rv);
Executed by:
  • tlstest
54
112}-
113-
114int-
115tls_set_cbs(struct tls *ctx, tls_read_cb read_cb, tls_write_cb write_cb,-
116 void *cb_arg)-
117{-
118 int rv = -1;-
119 BIO *bio;-
120-
121 if (read_cb == NULL || write_cb == NULL) {
read_cb == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
write_cb == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
0-4
122 tls_set_errorx(ctx, "no callbacks provided");-
123 goto err;
never executed: goto err;
0
124 }-
125-
126 ctx->read_cb = read_cb;-
127 ctx->write_cb = write_cb;-
128 ctx->cb_arg = cb_arg;-
129-
130 if ((bio = BIO_new(bio_s_cb())) == NULL) {
(bio = BIO_new...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
0-4
131 tls_set_errorx(ctx, "failed to create callback i/o");-
132 goto err;
never executed: goto err;
0
133 }-
134 bio->ptr = ctx;-
135 bio->init = 1;-
136-
137 SSL_set_bio(ctx->ssl_conn, bio, bio);-
138-
139 rv = 0;-
140-
141 err:
code before this statement executed 4 times by 1 test: err:
Executed by:
  • tlstest
4
142 return (rv);
executed 4 times by 1 test: return (rv);
Executed by:
  • tlstest
4
143}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2