OpenCoverage

bss_sock.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/bio/bss_sock.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: bss_sock.c,v 1.24 2018/05/01 13:29:10 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 * -
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 * -
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 * -
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from -
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 * -
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 * -
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <sys/socket.h>-
60-
61#include <errno.h>-
62#include <stdio.h>-
63#include <string.h>-
64#include <unistd.h>-
65-
66#include <openssl/bio.h>-
67-
68static int sock_write(BIO *h, const char *buf, int num);-
69static int sock_read(BIO *h, char *buf, int size);-
70static int sock_puts(BIO *h, const char *str);-
71static long sock_ctrl(BIO *h, int cmd, long arg1, void *arg2);-
72static int sock_new(BIO *h);-
73static int sock_free(BIO *data);-
74int BIO_sock_should_retry(int s);-
75-
76static const BIO_METHOD methods_sockp = {-
77 .type = BIO_TYPE_SOCKET,-
78 .name = "socket",-
79 .bwrite = sock_write,-
80 .bread = sock_read,-
81 .bputs = sock_puts,-
82 .ctrl = sock_ctrl,-
83 .create = sock_new,-
84 .destroy = sock_free-
85};-
86-
87const BIO_METHOD *-
88BIO_s_socket(void)-
89{-
90 return (&methods_sockp);
executed 6 times by 1 test: return (&methods_sockp);
Executed by:
  • tlstest
6
91}-
92-
93BIO *-
94BIO_new_socket(int fd, int close_flag)-
95{-
96 BIO *ret;-
97-
98 ret = BIO_new(BIO_s_socket());-
99 if (ret == NULL)
ret == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
100 return (NULL);
never executed: return ( ((void *)0) );
0
101 BIO_set_fd(ret, fd, close_flag);-
102 return (ret);
never executed: return (ret);
0
103}-
104-
105static int-
106sock_new(BIO *bi)-
107{-
108 bi->init = 0;-
109 bi->num = 0;-
110 bi->ptr = NULL;-
111 bi->flags = 0;-
112 return (1);
executed 6 times by 1 test: return (1);
Executed by:
  • tlstest
6
113}-
114-
115static int-
116sock_free(BIO *a)-
117{-
118 if (a == NULL)
a == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • tlstest
0-12
119 return (0);
never executed: return (0);
0
120 if (a->shutdown) {
a->shutdownDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
6
121 if (a->init) {
a->initDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
0-6
122 shutdown(a->num, SHUT_RDWR);-
123 close(a->num);-
124 }
never executed: end of block
0
125 a->init = 0;-
126 a->flags = 0;-
127 }
executed 6 times by 1 test: end of block
Executed by:
  • tlstest
6
128 return (1);
executed 12 times by 1 test: return (1);
Executed by:
  • tlstest
12
129}-
130-
131static int-
132sock_read(BIO *b, char *out, int outl)-
133{-
134 int ret = 0;-
135-
136 if (out != NULL) {
out != ((void *)0)Description
TRUEevaluated 46 times by 1 test
Evaluated by:
  • tlstest
FALSEnever evaluated
0-46
137 errno = 0;-
138 ret = read(b->num, out, outl);-
139 BIO_clear_retry_flags(b);-
140 if (ret <= 0) {
ret <= 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
FALSEevaluated 40 times by 1 test
Evaluated by:
  • tlstest
6-40
141 if (BIO_sock_should_retry(ret))
BIO_sock_should_retry(ret)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
FALSEnever evaluated
0-6
142 BIO_set_retry_read(b);
executed 6 times by 1 test: BIO_set_flags(b, (0x01|0x08));
Executed by:
  • tlstest
6
143 }
executed 6 times by 1 test: end of block
Executed by:
  • tlstest
6
144 }
executed 46 times by 1 test: end of block
Executed by:
  • tlstest
46
145 return (ret);
executed 46 times by 1 test: return (ret);
Executed by:
  • tlstest
46
146}-
147-
148static int-
149sock_write(BIO *b, const char *in, int inl)-
150{-
151 int ret;-
152-
153 errno = 0;-
154 ret = write(b->num, in, inl);-
155 BIO_clear_retry_flags(b);-
156 if (ret <= 0) {
ret <= 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • tlstest
0-12
157 if (BIO_sock_should_retry(ret))
BIO_sock_should_retry(ret)Description
TRUEnever evaluated
FALSEnever evaluated
0
158 BIO_set_retry_write(b);
never executed: BIO_set_flags(b, (0x02|0x08));
0
159 }
never executed: end of block
0
160 return (ret);
executed 12 times by 1 test: return (ret);
Executed by:
  • tlstest
12
161}-
162-
163static long-
164sock_ctrl(BIO *b, int cmd, long num, void *ptr)-
165{-
166 long ret = 1;-
167 int *ip;-
168-
169 switch (cmd) {-
170 case BIO_C_SET_FD:
executed 6 times by 1 test: case 104:
Executed by:
  • tlstest
6
171 sock_free(b);-
172 b->num= *((int *)ptr);-
173 b->shutdown = (int)num;-
174 b->init = 1;-
175 break;
executed 6 times by 1 test: break;
Executed by:
  • tlstest
6
176 case BIO_C_GET_FD:
executed 4 times by 1 test: case 105:
Executed by:
  • tlstest
4
177 if (b->init) {
b->initDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
FALSEnever evaluated
0-4
178 ip = (int *)ptr;-
179 if (ip != NULL)
ip != ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
0-4
180 *ip = b->num;
never executed: *ip = b->num;
0
181 ret = b->num;-
182 } else
executed 4 times by 1 test: end of block
Executed by:
  • tlstest
4
183 ret = -1;
never executed: ret = -1;
0
184 break;
executed 4 times by 1 test: break;
Executed by:
  • tlstest
4
185 case BIO_CTRL_GET_CLOSE:
never executed: case 8:
0
186 ret = b->shutdown;-
187 break;
never executed: break;
0
188 case BIO_CTRL_SET_CLOSE:
never executed: case 9:
0
189 b->shutdown = (int)num;-
190 break;
never executed: break;
0
191 case BIO_CTRL_DUP:
never executed: case 12:
0
192 case BIO_CTRL_FLUSH:
executed 6 times by 1 test: case 11:
Executed by:
  • tlstest
6
193 ret = 1;-
194 break;
executed 6 times by 1 test: break;
Executed by:
  • tlstest
6
195 default:
executed 8 times by 1 test: default:
Executed by:
  • tlstest
8
196 ret = 0;-
197 break;
executed 8 times by 1 test: break;
Executed by:
  • tlstest
8
198 }-
199 return (ret);
executed 24 times by 1 test: return (ret);
Executed by:
  • tlstest
24
200}-
201-
202static int-
203sock_puts(BIO *bp, const char *str)-
204{-
205 int n, ret;-
206-
207 n = strlen(str);-
208 ret = sock_write(bp, str, n);-
209 return (ret);
never executed: return (ret);
0
210}-
211-
212int-
213BIO_sock_should_retry(int i)-
214{-
215 int err;-
216-
217 if ((i == 0) || (i == -1)) {
(i == 0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
(i == -1)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tlstest
FALSEnever evaluated
0-6
218 err = errno;-
219 return (BIO_sock_non_fatal_error(err));
executed 6 times by 1 test: return (BIO_sock_non_fatal_error(err));
Executed by:
  • tlstest
6
220 }-
221 return (0);
never executed: return (0);
0
222}-
223-
224int-
225BIO_sock_non_fatal_error(int err)-
226{-
227 switch (err) {-
228 case ENOTCONN:
never executed: case 107 :
0
229 case EINTR:
never executed: case 4 :
0
230 case EAGAIN:
executed 6 times by 1 test: case 11 :
Executed by:
  • tlstest
6
231 case EINPROGRESS:
never executed: case 115 :
0
232 case EALREADY:
never executed: case 114 :
0
233 return (1);
executed 6 times by 1 test: return (1);
Executed by:
  • tlstest
6
234 default:
never executed: default:
0
235 break;
never executed: break;
0
236 }-
237 return (0);
never executed: return (0);
0
238}-
239-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2