summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/bio/b_dump.c171
-rw-r--r--src/lib/libcrypto/bio/b_print.c1149
-rw-r--r--src/lib/libcrypto/bio/b_sock.c1025
-rw-r--r--src/lib/libcrypto/bio/bf_buff.c629
-rw-r--r--src/lib/libcrypto/bio/bf_lbuf.c378
-rw-r--r--src/lib/libcrypto/bio/bf_nbio.c235
-rw-r--r--src/lib/libcrypto/bio/bf_null.c167
-rw-r--r--src/lib/libcrypto/bio/bio.h165
-rw-r--r--src/lib/libcrypto/bio/bio_cb.c78
-rw-r--r--src/lib/libcrypto/bio/bio_err.c155
-rw-r--r--src/lib/libcrypto/bio/bio_lib.c748
-rw-r--r--src/lib/libcrypto/bio/bss_acpt.c455
-rw-r--r--src/lib/libcrypto/bio/bss_bio.c546
-rw-r--r--src/lib/libcrypto/bio/bss_conn.c651
-rw-r--r--src/lib/libcrypto/bio/bss_dgram.c1114
-rw-r--r--src/lib/libcrypto/bio/bss_fd.c221
-rw-r--r--src/lib/libcrypto/bio/bss_file.c418
-rw-r--r--src/lib/libcrypto/bio/bss_log.c186
-rw-r--r--src/lib/libcrypto/bio/bss_mem.c264
-rw-r--r--src/lib/libcrypto/bio/bss_null.c102
-rw-r--r--src/lib/libcrypto/bio/bss_rtcp.c294
-rw-r--r--src/lib/libcrypto/bio/bss_sock.c194
-rw-r--r--src/lib/libssl/src/crypto/bio/b_dump.c171
-rw-r--r--src/lib/libssl/src/crypto/bio/b_print.c1149
-rw-r--r--src/lib/libssl/src/crypto/bio/b_sock.c1025
-rw-r--r--src/lib/libssl/src/crypto/bio/bf_buff.c629
-rw-r--r--src/lib/libssl/src/crypto/bio/bf_lbuf.c378
-rw-r--r--src/lib/libssl/src/crypto/bio/bf_nbio.c235
-rw-r--r--src/lib/libssl/src/crypto/bio/bf_null.c167
-rw-r--r--src/lib/libssl/src/crypto/bio/bio.h165
-rw-r--r--src/lib/libssl/src/crypto/bio/bio_cb.c78
-rw-r--r--src/lib/libssl/src/crypto/bio/bio_err.c155
-rw-r--r--src/lib/libssl/src/crypto/bio/bio_lib.c748
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_acpt.c455
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_bio.c546
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_conn.c651
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_dgram.c1114
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_fd.c221
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_file.c418
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_log.c186
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_mem.c264
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_null.c102
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_rtcp.c294
-rw-r--r--src/lib/libssl/src/crypto/bio/bss_sock.c194
44 files changed, 9352 insertions, 9338 deletions
diff --git a/src/lib/libcrypto/bio/b_dump.c b/src/lib/libcrypto/bio/b_dump.c
index 492ee09275..bea94969a2 100644
--- a/src/lib/libcrypto/bio/b_dump.c
+++ b/src/lib/libcrypto/bio/b_dump.c
@@ -66,122 +66,125 @@
66 66
67#define TRUNCATE 67#define TRUNCATE
68#define DUMP_WIDTH 16 68#define DUMP_WIDTH 16
69#define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) 69#define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4))
70 70
71int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), 71int
72 void *u, const char *s, int len) 72BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
73 { 73 void *u, const char *s, int len)
74{
74 return BIO_dump_indent_cb(cb, u, s, len, 0); 75 return BIO_dump_indent_cb(cb, u, s, len, 0);
75 } 76}
76 77
77int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), 78int
78 void *u, const char *s, int len, int indent) 79BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
79 { 80 void *u, const char *s, int len, int indent)
80 int ret=0; 81{
81 char buf[288+1],tmp[20],str[128+1]; 82 int ret = 0;
82 int i,j,rows,trc; 83 char buf[288 + 1], tmp[20], str[128 + 1];
84 int i, j, rows, trc;
83 unsigned char ch; 85 unsigned char ch;
84 int dump_width; 86 int dump_width;
85 87
86 trc=0; 88 trc = 0;
87 89
88#ifdef TRUNCATE 90#ifdef TRUNCATE
89 for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) 91 for (; (len > 0) && ((s[len - 1] == ' ') || (s[len - 1] == '\0')); len--)
90 trc++; 92 trc++;
91#endif 93#endif
92 94
93 if (indent < 0) 95 if (indent < 0)
94 indent = 0; 96 indent = 0;
95 if (indent) 97 if (indent) {
96 { 98 if (indent > 128)
97 if (indent > 128) indent=128; 99 indent = 128;
98 memset(str,' ',indent); 100 memset(str, ' ', indent);
99 } 101 }
100 str[indent]='\0'; 102 str[indent] = '\0';
101 103
102 dump_width=DUMP_WIDTH_LESS_INDENT(indent); 104 dump_width = DUMP_WIDTH_LESS_INDENT(indent);
103 rows=(len/dump_width); 105 rows = (len / dump_width);
104 if ((rows*dump_width)<len) 106 if ((rows * dump_width) < len)
105 rows++; 107 rows++;
106 for(i=0;i<rows;i++) 108 for (i = 0; i < rows; i++) {
107 { 109 buf[0] = '\0'; /* start with empty string */
108 buf[0]='\0'; /* start with empty string */ 110 BUF_strlcpy(buf, str, sizeof buf);
109 BUF_strlcpy(buf,str,sizeof buf); 111 (void) snprintf(tmp, sizeof tmp, "%04x - ", i*dump_width);
110 (void) snprintf(tmp,sizeof tmp,"%04x - ",i*dump_width); 112 BUF_strlcat(buf, tmp, sizeof buf);
111 BUF_strlcat(buf,tmp,sizeof buf); 113 for (j = 0; j < dump_width; j++) {
112 for(j=0;j<dump_width;j++) 114 if (((i*dump_width) + j) >= len) {
113 { 115 BUF_strlcat(buf, " ", sizeof buf);
114 if (((i*dump_width)+j)>=len) 116 } else {
115 { 117 ch = ((unsigned char)*(s + i*dump_width + j)) & 0xff;
116 BUF_strlcat(buf," ",sizeof buf); 118 (void) snprintf(tmp, sizeof tmp, "%02x%c", ch,
117 } 119 j == 7 ? '-' : ' ');
118 else 120 BUF_strlcat(buf, tmp, sizeof buf);
119 {
120 ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
121 (void) snprintf(tmp,sizeof tmp,"%02x%c",ch,
122 j==7?'-':' ');
123 BUF_strlcat(buf,tmp,sizeof buf);
124 }
125 } 121 }
126 BUF_strlcat(buf," ",sizeof buf); 122 }
127 for(j=0;j<dump_width;j++) 123 BUF_strlcat(buf, " ", sizeof buf);
128 { 124 for (j = 0; j < dump_width; j++) {
129 if (((i*dump_width)+j)>=len) 125 if (((i*dump_width) + j) >= len)
130 break; 126 break;
131 ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; 127 ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff;
132#ifndef CHARSET_EBCDIC 128#ifndef CHARSET_EBCDIC
133 (void) snprintf(tmp,sizeof tmp,"%c", 129 (void) snprintf(tmp, sizeof tmp, "%c",
134 ((ch>=' ')&&(ch<='~'))?ch:'.'); 130 ((ch >= ' ') && (ch <= '~')) ? ch : '.');
135#else 131#else
136 (void) snprintf(tmp,sizeof tmp,"%c", 132 (void) snprintf(tmp, sizeof tmp, "%c",
137 ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) 133 ((ch >= os_toascii[' ']) && (ch <= os_toascii['~']))
138 ? os_toebcdic[ch] 134 ? os_toebcdic[ch] : '.');
139 : '.');
140#endif 135#endif
141 BUF_strlcat(buf,tmp,sizeof buf); 136 BUF_strlcat(buf, tmp, sizeof buf);
142 } 137 }
143 BUF_strlcat(buf,"\n",sizeof buf); 138 BUF_strlcat(buf, "\n", sizeof buf);
144 /* if this is the last call then update the ddt_dump thing so 139 /* if this is the last call then update the ddt_dump thing so
145 * that we will move the selection point in the debug window 140 * that we will move the selection point in the debug window
146 */ 141 */
147 ret+=cb((void *)buf,strlen(buf),u); 142 ret += cb((void *)buf, strlen(buf), u);
148 } 143 }
149#ifdef TRUNCATE 144#ifdef TRUNCATE
150 if (trc > 0) 145 if (trc > 0) {
151 { 146 (void) snprintf(buf, sizeof buf, "%s%04x - <SPACES/NULS>\n",
152 (void) snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, 147 str, len + trc);
153 len+trc); 148 ret += cb((void *)buf, strlen(buf), u);
154 ret+=cb((void *)buf,strlen(buf),u);
155 }
156#endif
157 return(ret);
158 } 149 }
150#endif
151 return (ret);
152}
159 153
160#ifndef OPENSSL_NO_FP_API 154#ifndef OPENSSL_NO_FP_API
161static int write_fp(const void *data, size_t len, void *fp) 155static int
162 { 156write_fp(const void *data, size_t len, void *fp)
157{
163 return UP_fwrite(data, len, 1, fp); 158 return UP_fwrite(data, len, 1, fp);
164 } 159}
165int BIO_dump_fp(FILE *fp, const char *s, int len) 160
166 { 161int
162BIO_dump_fp(FILE *fp, const char *s, int len)
163{
167 return BIO_dump_cb(write_fp, fp, s, len); 164 return BIO_dump_cb(write_fp, fp, s, len);
168 } 165}
169int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) 166
170 { 167int
168BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent)
169{
171 return BIO_dump_indent_cb(write_fp, fp, s, len, indent); 170 return BIO_dump_indent_cb(write_fp, fp, s, len, indent);
172 } 171}
173#endif 172#endif
174 173
175static int write_bio(const void *data, size_t len, void *bp) 174static int
176 { 175write_bio(const void *data, size_t len, void *bp)
176{
177 return BIO_write((BIO *)bp, (const char *)data, len); 177 return BIO_write((BIO *)bp, (const char *)data, len);
178 } 178}
179int BIO_dump(BIO *bp, const char *s, int len) 179
180 { 180int
181BIO_dump(BIO *bp, const char *s, int len)
182{
181 return BIO_dump_cb(write_bio, bp, s, len); 183 return BIO_dump_cb(write_bio, bp, s, len);
182 } 184}
183int BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
184 {
185 return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
186 }
187 185
186int
187BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
188{
189 return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
190}
diff --git a/src/lib/libcrypto/bio/b_print.c b/src/lib/libcrypto/bio/b_print.c
index 143a7cfefa..b3b0d45ee6 100644
--- a/src/lib/libcrypto/bio/b_print.c
+++ b/src/lib/libcrypto/bio/b_print.c
@@ -125,16 +125,15 @@
125#define LLONG long 125#define LLONG long
126#endif 126#endif
127 127
128static void fmtstr (char **, char **, size_t *, size_t *, 128static void fmtstr(char **, char **, size_t *, size_t *, const char *,
129 const char *, int, int, int); 129 int, int, int);
130static void fmtint (char **, char **, size_t *, size_t *, 130static void fmtint(char **, char **, size_t *, size_t *, LLONG, int,
131 LLONG, int, int, int, int); 131 int, int, int);
132static void fmtfp (char **, char **, size_t *, size_t *, 132static void fmtfp(char **, char **, size_t *, size_t *, LDOUBLE,
133 LDOUBLE, int, int, int); 133 int, int, int);
134static void doapr_outch (char **, char **, size_t *, size_t *, int); 134static void doapr_outch(char **, char **, size_t *, size_t *, int);
135static void _dopr(char **sbuffer, char **buffer, 135static void _dopr(char **sbuffer, char **buffer, size_t *maxlen,
136 size_t *maxlen, size_t *retlen, int *truncated, 136 size_t *retlen, int *truncated, const char *format, va_list args);
137 const char *format, va_list args);
138 137
139/* format read states */ 138/* format read states */
140#define DP_S_DEFAULT 0 139#define DP_S_DEFAULT 0
@@ -166,607 +165,576 @@ static void _dopr(char **sbuffer, char **buffer,
166#define OSSL_MAX(p,q) ((p >= q) ? p : q) 165#define OSSL_MAX(p,q) ((p >= q) ? p : q)
167 166
168static void 167static void
169_dopr( 168_dopr(char **sbuffer, char **buffer, size_t *maxlen, size_t *retlen,
170 char **sbuffer, 169 int *truncated, const char *format, va_list args)
171 char **buffer,
172 size_t *maxlen,
173 size_t *retlen,
174 int *truncated,
175 const char *format,
176 va_list args)
177{ 170{
178 char ch; 171 char ch;
179 LLONG value; 172 LLONG value;
180 LDOUBLE fvalue; 173 LDOUBLE fvalue;
181 char *strvalue; 174 char *strvalue;
182 int min; 175 int min;
183 int max; 176 int max;
184 int state; 177 int state;
185 int flags; 178 int flags;
186 int cflags; 179 int cflags;
187 size_t currlen; 180 size_t currlen;
188 181
189 state = DP_S_DEFAULT; 182 state = DP_S_DEFAULT;
190 flags = currlen = cflags = min = 0; 183 flags = currlen = cflags = min = 0;
191 max = -1; 184 max = -1;
192 ch = *format++; 185 ch = *format++;
193 186
194 while (state != DP_S_DONE) { 187 while (state != DP_S_DONE) {
195 if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) 188 if (ch == '\0' || (buffer == NULL && currlen >= *maxlen))
196 state = DP_S_DONE; 189 state = DP_S_DONE;
197 190
198 switch (state) { 191 switch (state) {
199 case DP_S_DEFAULT: 192 case DP_S_DEFAULT:
200 if (ch == '%') 193 if (ch == '%')
201 state = DP_S_FLAGS; 194 state = DP_S_FLAGS;
202 else 195 else
203 doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); 196 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
204 ch = *format++; 197 ch = *format++;
205 break; 198 break;
206 case DP_S_FLAGS: 199 case DP_S_FLAGS:
207 switch (ch) { 200 switch (ch) {
208 case '-': 201 case '-':
209 flags |= DP_F_MINUS; 202 flags |= DP_F_MINUS;
210 ch = *format++; 203 ch = *format++;
211 break; 204 break;
212 case '+': 205 case '+':
213 flags |= DP_F_PLUS; 206 flags |= DP_F_PLUS;
214 ch = *format++; 207 ch = *format++;
215 break; 208 break;
216 case ' ': 209 case ' ':
217 flags |= DP_F_SPACE; 210 flags |= DP_F_SPACE;
218 ch = *format++; 211 ch = *format++;
219 break; 212 break;
220 case '#': 213 case '#':
221 flags |= DP_F_NUM; 214 flags |= DP_F_NUM;
222 ch = *format++; 215 ch = *format++;
223 break; 216 break;
224 case '0': 217 case '0':
225 flags |= DP_F_ZERO; 218 flags |= DP_F_ZERO;
226 ch = *format++; 219 ch = *format++;
227 break; 220 break;
228 default: 221 default:
229 state = DP_S_MIN; 222 state = DP_S_MIN;
230 break; 223 break;
231 } 224 }
232 break; 225 break;
233 case DP_S_MIN: 226 case DP_S_MIN:
234 if (isdigit((unsigned char)ch)) { 227 if (isdigit((unsigned char)ch)) {
235 min = 10 * min + char_to_int(ch); 228 min = 10 * min + char_to_int(ch);
236 ch = *format++; 229 ch = *format++;
237 } else if (ch == '*') { 230 } else if (ch == '*') {
238 min = va_arg(args, int); 231 min = va_arg(args, int);
239 ch = *format++; 232 ch = *format++;
240 state = DP_S_DOT; 233 state = DP_S_DOT;
241 } else 234 } else
242 state = DP_S_DOT; 235 state = DP_S_DOT;
243 break; 236 break;
244 case DP_S_DOT: 237 case DP_S_DOT:
245 if (ch == '.') { 238 if (ch == '.') {
246 state = DP_S_MAX; 239 state = DP_S_MAX;
247 ch = *format++; 240 ch = *format++;
248 } else 241 } else
249 state = DP_S_MOD; 242 state = DP_S_MOD;
250 break; 243 break;
251 case DP_S_MAX: 244 case DP_S_MAX:
252 if (isdigit((unsigned char)ch)) { 245 if (isdigit((unsigned char)ch)) {
253 if (max < 0) 246 if (max < 0)
254 max = 0; 247 max = 0;
255 max = 10 * max + char_to_int(ch); 248 max = 10 * max + char_to_int(ch);
256 ch = *format++; 249 ch = *format++;
257 } else if (ch == '*') { 250 } else if (ch == '*') {
258 max = va_arg(args, int); 251 max = va_arg(args, int);
259 ch = *format++; 252 ch = *format++;
260 state = DP_S_MOD; 253 state = DP_S_MOD;
261 } else 254 } else
262 state = DP_S_MOD; 255 state = DP_S_MOD;
263 break; 256 break;
264 case DP_S_MOD: 257 case DP_S_MOD:
265 switch (ch) { 258 switch (ch) {
266 case 'h': 259 case 'h':
267 cflags = DP_C_SHORT; 260 cflags = DP_C_SHORT;
268 ch = *format++; 261 ch = *format++;
269 break; 262 break;
270 case 'l': 263 case 'l':
271 if (*format == 'l') { 264 if (*format == 'l') {
272 cflags = DP_C_LLONG; 265 cflags = DP_C_LLONG;
273 format++; 266 format++;
274 } else 267 } else
275 cflags = DP_C_LONG; 268 cflags = DP_C_LONG;
276 ch = *format++; 269 ch = *format++;
277 break; 270 break;
278 case 'q': 271 case 'q':
279 cflags = DP_C_LLONG; 272 cflags = DP_C_LLONG;
280 ch = *format++; 273 ch = *format++;
281 break; 274 break;
282 case 'L': 275 case 'L':
283 cflags = DP_C_LDOUBLE; 276 cflags = DP_C_LDOUBLE;
284 ch = *format++; 277 ch = *format++;
285 break; 278 break;
286 default: 279 default:
287 break; 280 break;
288 } 281 }
289 state = DP_S_CONV; 282 state = DP_S_CONV;
290 break; 283 break;
291 case DP_S_CONV: 284 case DP_S_CONV:
292 switch (ch) { 285 switch (ch) {
293 case 'd': 286 case 'd':
294 case 'i': 287 case 'i':
295 switch (cflags) { 288 switch (cflags) {
296 case DP_C_SHORT: 289 case DP_C_SHORT:
297 value = (short int)va_arg(args, int); 290 value = (short int)va_arg(args, int);
298 break; 291 break;
299 case DP_C_LONG: 292 case DP_C_LONG:
300 value = va_arg(args, long int); 293 value = va_arg(args, long int);
301 break; 294 break;
302 case DP_C_LLONG: 295 case DP_C_LLONG:
303 value = va_arg(args, LLONG); 296 value = va_arg(args, LLONG);
304 break; 297 break;
305 default: 298 default:
306 value = va_arg(args, int); 299 value = va_arg(args, int);
307 break; 300 break;
308 } 301 }
309 fmtint(sbuffer, buffer, &currlen, maxlen, 302 fmtint(sbuffer, buffer, &currlen, maxlen,
310 value, 10, min, max, flags); 303 value, 10, min, max, flags);
311 break; 304 break;
312 case 'X': 305 case 'X':
313 flags |= DP_F_UP; 306 flags |= DP_F_UP;
314 /* FALLTHROUGH */ 307 /* FALLTHROUGH */
315 case 'x': 308 case 'x':
316 case 'o': 309 case 'o':
317 case 'u': 310 case 'u':
318 flags |= DP_F_UNSIGNED; 311 flags |= DP_F_UNSIGNED;
319 switch (cflags) { 312 switch (cflags) {
320 case DP_C_SHORT: 313 case DP_C_SHORT:
321 value = (unsigned short int)va_arg(args, unsigned int); 314 value = (unsigned short int)va_arg(
322 break; 315 args, unsigned int);
323 case DP_C_LONG: 316 break;
324 value = (LLONG) va_arg(args, 317 case DP_C_LONG:
325 unsigned long int); 318 value = (LLONG)va_arg(args,
326 break; 319 unsigned long int);
327 case DP_C_LLONG: 320 break;
328 value = va_arg(args, unsigned LLONG); 321 case DP_C_LLONG:
329 break; 322 value = va_arg(args, unsigned LLONG);
330 default: 323 break;
331 value = (LLONG) va_arg(args, 324 default:
332 unsigned int); 325 value = (LLONG)va_arg(args,
333 break; 326 unsigned int);
334 } 327 break;
335 fmtint(sbuffer, buffer, &currlen, maxlen, value, 328 }
336 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), 329 fmtint(sbuffer, buffer, &currlen, maxlen, value,
337 min, max, flags); 330 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
338 break; 331 min, max, flags);
339 case 'f': 332 break;
340 if (cflags == DP_C_LDOUBLE) 333 case 'f':
341 fvalue = va_arg(args, LDOUBLE); 334 if (cflags == DP_C_LDOUBLE)
342 else 335 fvalue = va_arg(args, LDOUBLE);
343 fvalue = va_arg(args, double); 336 else
344 fmtfp(sbuffer, buffer, &currlen, maxlen, 337 fvalue = va_arg(args, double);
345 fvalue, min, max, flags); 338 fmtfp(sbuffer, buffer, &currlen, maxlen,
346 break; 339 fvalue, min, max, flags);
347 case 'E': 340 break;
348 flags |= DP_F_UP; 341 case 'E':
349 case 'e': 342 flags |= DP_F_UP;
350 if (cflags == DP_C_LDOUBLE) 343 case 'e':
351 fvalue = va_arg(args, LDOUBLE); 344 if (cflags == DP_C_LDOUBLE)
352 else 345 fvalue = va_arg(args, LDOUBLE);
353 fvalue = va_arg(args, double); 346 else
354 break; 347 fvalue = va_arg(args, double);
355 case 'G': 348 break;
356 flags |= DP_F_UP; 349 case 'G':
357 case 'g': 350 flags |= DP_F_UP;
358 if (cflags == DP_C_LDOUBLE) 351 case 'g':
359 fvalue = va_arg(args, LDOUBLE); 352 if (cflags == DP_C_LDOUBLE)
360 else 353 fvalue = va_arg(args, LDOUBLE);
361 fvalue = va_arg(args, double); 354 else
362 break; 355 fvalue = va_arg(args, double);
363 case 'c': 356 break;
364 doapr_outch(sbuffer, buffer, &currlen, maxlen, 357 case 'c':
365 va_arg(args, int)); 358 doapr_outch(sbuffer, buffer, &currlen, maxlen,
366 break; 359 va_arg(args, int));
367 case 's': 360 break;
368 strvalue = va_arg(args, char *); 361 case 's':
369 if (max < 0) { 362 strvalue = va_arg(args, char *);
370 if (buffer) 363 if (max < 0) {
371 max = INT_MAX; 364 if (buffer)
372 else 365 max = INT_MAX;
373 max = *maxlen; 366 else
367 max = *maxlen;
368 }
369 fmtstr(sbuffer, buffer, &currlen, maxlen,
370 strvalue, flags, min, max);
371 break;
372 case 'p':
373 value = (long)va_arg(args, void *);
374 fmtint(sbuffer, buffer, &currlen, maxlen,
375 value, 16, min, max, flags|DP_F_NUM);
376 break;
377 case 'n': /* XXX */
378 if (cflags == DP_C_SHORT) {
379 short int *num;
380 num = va_arg(args, short int *);
381 *num = currlen;
382 } else if (cflags == DP_C_LONG) { /* XXX */
383 long int *num;
384 num = va_arg(args, long int *);
385 *num = (long int) currlen;
386 } else if (cflags == DP_C_LLONG) { /* XXX */
387 LLONG *num;
388 num = va_arg(args, LLONG *);
389 *num = (LLONG) currlen;
390 } else {
391 int *num;
392 num = va_arg(args, int *);
393 *num = currlen;
394 }
395 break;
396 case '%':
397 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
398 break;
399 case 'w':
400 /* not supported yet, treat as next char */
401 ch = *format++;
402 break;
403 default:
404 /* unknown, skip */
405 break;
406 }
407 ch = *format++;
408 state = DP_S_DEFAULT;
409 flags = cflags = min = 0;
410 max = -1;
411 break;
412 case DP_S_DONE:
413 break;
414 default:
415 break;
374 } 416 }
375 fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, 417 }
376 flags, min, max); 418 *truncated = (currlen > *maxlen - 1);
377 break; 419 if (*truncated)
378 case 'p': 420 currlen = *maxlen - 1;
379 value = (long)va_arg(args, void *); 421 doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
380 fmtint(sbuffer, buffer, &currlen, maxlen, 422 *retlen = currlen - 1;
381 value, 16, min, max, flags|DP_F_NUM); 423 return;
382 break;
383 case 'n': /* XXX */
384 if (cflags == DP_C_SHORT) {
385 short int *num;
386 num = va_arg(args, short int *);
387 *num = currlen;
388 } else if (cflags == DP_C_LONG) { /* XXX */
389 long int *num;
390 num = va_arg(args, long int *);
391 *num = (long int) currlen;
392 } else if (cflags == DP_C_LLONG) { /* XXX */
393 LLONG *num;
394 num = va_arg(args, LLONG *);
395 *num = (LLONG) currlen;
396 } else {
397 int *num;
398 num = va_arg(args, int *);
399 *num = currlen;
400 }
401 break;
402 case '%':
403 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
404 break;
405 case 'w':
406 /* not supported yet, treat as next char */
407 ch = *format++;
408 break;
409 default:
410 /* unknown, skip */
411 break;
412 }
413 ch = *format++;
414 state = DP_S_DEFAULT;
415 flags = cflags = min = 0;
416 max = -1;
417 break;
418 case DP_S_DONE:
419 break;
420 default:
421 break;
422 }
423 }
424 *truncated = (currlen > *maxlen - 1);
425 if (*truncated)
426 currlen = *maxlen - 1;
427 doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
428 *retlen = currlen - 1;
429 return;
430} 424}
431 425
432static void 426static void
433fmtstr( 427fmtstr(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
434 char **sbuffer, 428 const char *value, int flags, int min, int max)
435 char **buffer,
436 size_t *currlen,
437 size_t *maxlen,
438 const char *value,
439 int flags,
440 int min,
441 int max)
442{ 429{
443 int padlen, strln; 430 int padlen, strln;
444 int cnt = 0; 431 int cnt = 0;
445 432
446 if (value == 0) 433 if (value == 0)
447 value = "<NULL>"; 434 value = "<NULL>";
448 for (strln = 0; value[strln]; ++strln) 435 for (strln = 0; value[strln]; ++strln)
449 ; 436 ;
450 padlen = min - strln; 437 padlen = min - strln;
451 if (padlen < 0) 438 if (padlen < 0)
452 padlen = 0; 439 padlen = 0;
453 if (flags & DP_F_MINUS) 440 if (flags & DP_F_MINUS)
454 padlen = -padlen; 441 padlen = -padlen;
455 442
456 while ((padlen > 0) && (cnt < max)) { 443 while ((padlen > 0) && (cnt < max)) {
457 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 444 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
458 --padlen; 445 --padlen;
459 ++cnt; 446 ++cnt;
460 } 447 }
461 while (*value && (cnt < max)) { 448 while (*value && (cnt < max)) {
462 doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); 449 doapr_outch(sbuffer, buffer, currlen, maxlen, *value++);
463 ++cnt; 450 ++cnt;
464 } 451 }
465 while ((padlen < 0) && (cnt < max)) { 452 while ((padlen < 0) && (cnt < max)) {
466 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 453 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
467 ++padlen; 454 ++padlen;
468 ++cnt; 455 ++cnt;
469 } 456 }
470} 457}
471 458
472static void 459static void
473fmtint( 460fmtint(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
474 char **sbuffer, 461 LLONG value, int base, int min, int max, int flags)
475 char **buffer,
476 size_t *currlen,
477 size_t *maxlen,
478 LLONG value,
479 int base,
480 int min,
481 int max,
482 int flags)
483{ 462{
484 int signvalue = 0; 463 int signvalue = 0;
485 const char *prefix = ""; 464 const char *prefix = "";
486 unsigned LLONG uvalue; 465 unsigned LLONG uvalue;
487 char convert[DECIMAL_SIZE(value)+3]; 466 char convert[DECIMAL_SIZE(value) + 3];
488 int place = 0; 467 int place = 0;
489 int spadlen = 0; 468 int spadlen = 0;
490 int zpadlen = 0; 469 int zpadlen = 0;
491 int caps = 0; 470 int caps = 0;
492 471
493 if (max < 0) 472 if (max < 0)
494 max = 0; 473 max = 0;
495 uvalue = value; 474 uvalue = value;
496 if (!(flags & DP_F_UNSIGNED)) { 475 if (!(flags & DP_F_UNSIGNED)) {
497 if (value < 0) { 476 if (value < 0) {
498 signvalue = '-'; 477 signvalue = '-';
499 uvalue = -value; 478 uvalue = -value;
500 } else if (flags & DP_F_PLUS) 479 } else if (flags & DP_F_PLUS)
501 signvalue = '+'; 480 signvalue = '+';
502 else if (flags & DP_F_SPACE) 481 else if (flags & DP_F_SPACE)
503 signvalue = ' '; 482 signvalue = ' ';
504 } 483 }
505 if (flags & DP_F_NUM) { 484 if (flags & DP_F_NUM) {
506 if (base == 8) prefix = "0"; 485 if (base == 8)
507 if (base == 16) prefix = "0x"; 486 prefix = "0";
508 } 487 if (base == 16)
509 if (flags & DP_F_UP) 488 prefix = "0x";
510 caps = 1; 489 }
511 do { 490 if (flags & DP_F_UP)
512 convert[place++] = 491 caps = 1;
513 (caps ? "0123456789ABCDEF" : "0123456789abcdef") 492 do {
514 [uvalue % (unsigned) base]; 493 convert[place++] = (caps ? "0123456789ABCDEF" :
515 uvalue = (uvalue / (unsigned) base); 494 "0123456789abcdef")[uvalue % (unsigned) base];
516 } while (uvalue && (place < (int)sizeof(convert))); 495 uvalue = (uvalue / (unsigned) base);
517 if (place == sizeof(convert)) 496 } while (uvalue && (place < (int)sizeof(convert)));
518 place--; 497 if (place == sizeof(convert))
519 convert[place] = 0; 498 place--;
520 499 convert[place] = 0;
521 zpadlen = max - place; 500
522 spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix); 501 zpadlen = max - place;
523 if (zpadlen < 0) 502 spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) -
524 zpadlen = 0; 503 strlen(prefix);
525 if (spadlen < 0) 504 if (zpadlen < 0)
526 spadlen = 0; 505 zpadlen = 0;
527 if (flags & DP_F_ZERO) { 506 if (spadlen < 0)
528 zpadlen = OSSL_MAX(zpadlen, spadlen); 507 spadlen = 0;
529 spadlen = 0; 508 if (flags & DP_F_ZERO) {
530 } 509 zpadlen = OSSL_MAX(zpadlen, spadlen);
531 if (flags & DP_F_MINUS) 510 spadlen = 0;
532 spadlen = -spadlen; 511 }
533 512 if (flags & DP_F_MINUS)
534 /* spaces */ 513 spadlen = -spadlen;
535 while (spadlen > 0) { 514
536 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 515 /* spaces */
537 --spadlen; 516 while (spadlen > 0) {
538 } 517 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
539 518 --spadlen;
540 /* sign */ 519 }
541 if (signvalue) 520
542 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 521 /* sign */
543 522 if (signvalue)
544 /* prefix */ 523 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
545 while (*prefix) { 524
546 doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); 525 /* prefix */
547 prefix++; 526 while (*prefix) {
548 } 527 doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);
549 528 prefix++;
550 /* zeros */ 529 }
551 if (zpadlen > 0) { 530
552 while (zpadlen > 0) { 531 /* zeros */
553 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 532 if (zpadlen > 0) {
554 --zpadlen; 533 while (zpadlen > 0) {
555 } 534 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
556 } 535 --zpadlen;
557 /* digits */ 536 }
558 while (place > 0) 537 }
559 doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); 538 /* digits */
560 539 while (place > 0)
561 /* left justified spaces */ 540 doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]);
562 while (spadlen < 0) { 541
563 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 542 /* left justified spaces */
564 ++spadlen; 543 while (spadlen < 0) {
565 } 544 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
566 return; 545 ++spadlen;
546 }
547 return;
567} 548}
568 549
569static LDOUBLE 550static LDOUBLE
570abs_val(LDOUBLE value) 551abs_val(LDOUBLE value)
571{ 552{
572 LDOUBLE result = value; 553 LDOUBLE result = value;
573 if (value < 0) 554 if (value < 0)
574 result = -value; 555 result = -value;
575 return result; 556 return result;
576} 557}
577 558
578static LDOUBLE 559static LDOUBLE
579pow_10(int in_exp) 560pow_10(int in_exp)
580{ 561{
581 LDOUBLE result = 1; 562 LDOUBLE result = 1;
582 while (in_exp) { 563 while (in_exp) {
583 result *= 10; 564 result *= 10;
584 in_exp--; 565 in_exp--;
585 } 566 }
586 return result; 567 return result;
587} 568}
588 569
589static long 570static long
590roundv(LDOUBLE value) 571roundv(LDOUBLE value)
591{ 572{
592 long intpart; 573 long intpart;
593 intpart = (long) value; 574 intpart = (long) value;
594 value = value - intpart; 575 value = value - intpart;
595 if (value >= 0.5) 576 if (value >= 0.5)
596 intpart++; 577 intpart++;
597 return intpart; 578 return intpart;
598} 579}
599 580
600static void 581static void
601fmtfp( 582fmtfp(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
602 char **sbuffer, 583 LDOUBLE fvalue, int min, int max, int flags)
603 char **buffer,
604 size_t *currlen,
605 size_t *maxlen,
606 LDOUBLE fvalue,
607 int min,
608 int max,
609 int flags)
610{ 584{
611 int signvalue = 0; 585 int signvalue = 0;
612 LDOUBLE ufvalue; 586 LDOUBLE ufvalue;
613 char iconvert[20]; 587 char iconvert[20];
614 char fconvert[20]; 588 char fconvert[20];
615 int iplace = 0; 589 int iplace = 0;
616 int fplace = 0; 590 int fplace = 0;
617 int padlen = 0; 591 int padlen = 0;
618 int zpadlen = 0; 592 int zpadlen = 0;
619 int caps = 0; 593 int caps = 0;
620 long intpart; 594 long intpart;
621 long fracpart; 595 long fracpart;
622 long max10; 596 long max10;
623 597
624 if (max < 0) 598 if (max < 0)
625 max = 6; 599 max = 6;
626 ufvalue = abs_val(fvalue); 600 ufvalue = abs_val(fvalue);
627 if (fvalue < 0) 601 if (fvalue < 0)
628 signvalue = '-'; 602 signvalue = '-';
629 else if (flags & DP_F_PLUS) 603 else if (flags & DP_F_PLUS)
630 signvalue = '+'; 604 signvalue = '+';
631 else if (flags & DP_F_SPACE) 605 else if (flags & DP_F_SPACE)
632 signvalue = ' '; 606 signvalue = ' ';
633 607
634 intpart = (long)ufvalue; 608 intpart = (long)ufvalue;
635 609
636 /* sorry, we only support 9 digits past the decimal because of our 610 /* sorry, we only support 9 digits past the decimal because of our
637 conversion method */ 611 conversion method */
638 if (max > 9) 612 if (max > 9)
639 max = 9; 613 max = 9;
640 614
641 /* we "cheat" by converting the fractional part to integer by 615 /* we "cheat" by converting the fractional part to integer by
642 multiplying by a factor of 10 */ 616 multiplying by a factor of 10 */
643 max10 = roundv(pow_10(max)); 617 max10 = roundv(pow_10(max));
644 fracpart = roundv(pow_10(max) * (ufvalue - intpart)); 618 fracpart = roundv(pow_10(max) * (ufvalue - intpart));
645 619
646 if (fracpart >= max10) { 620 if (fracpart >= max10) {
647 intpart++; 621 intpart++;
648 fracpart -= max10; 622 fracpart -= max10;
649 } 623 }
650 624
651 /* convert integer part */ 625 /* convert integer part */
652 do { 626 do {
653 iconvert[iplace++] = 627 iconvert[iplace++] = (caps ? "0123456789ABCDEF" :
654 (caps ? "0123456789ABCDEF" 628 "0123456789abcdef")[intpart % 10];
655 : "0123456789abcdef")[intpart % 10]; 629 intpart = (intpart / 10);
656 intpart = (intpart / 10); 630 } while (intpart && (iplace < (int)sizeof(iconvert)));
657 } while (intpart && (iplace < (int)sizeof(iconvert))); 631 if (iplace == sizeof iconvert)
658 if (iplace == sizeof iconvert) 632 iplace--;
659 iplace--; 633 iconvert[iplace] = 0;
660 iconvert[iplace] = 0; 634
661 635 /* convert fractional part */
662 /* convert fractional part */ 636 do {
663 do { 637 fconvert[fplace++] = (caps ? "0123456789ABCDEF" :
664 fconvert[fplace++] = 638 "0123456789abcdef")[fracpart % 10];
665 (caps ? "0123456789ABCDEF" 639 fracpart = (fracpart / 10);
666 : "0123456789abcdef")[fracpart % 10]; 640 } while (fplace < max);
667 fracpart = (fracpart / 10); 641 if (fplace == sizeof fconvert)
668 } while (fplace < max); 642 fplace--;
669 if (fplace == sizeof fconvert) 643 fconvert[fplace] = 0;
670 fplace--; 644
671 fconvert[fplace] = 0; 645 /* -1 for decimal point, another -1 if we are printing a sign */
672 646 padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
673 /* -1 for decimal point, another -1 if we are printing a sign */ 647 zpadlen = max - fplace;
674 padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 648 if (zpadlen < 0)
675 zpadlen = max - fplace; 649 zpadlen = 0;
676 if (zpadlen < 0) 650 if (padlen < 0)
677 zpadlen = 0; 651 padlen = 0;
678 if (padlen < 0) 652 if (flags & DP_F_MINUS)
679 padlen = 0; 653 padlen = -padlen;
680 if (flags & DP_F_MINUS) 654
681 padlen = -padlen; 655 if ((flags & DP_F_ZERO) && (padlen > 0)) {
682 656 if (signvalue) {
683 if ((flags & DP_F_ZERO) && (padlen > 0)) { 657 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
684 if (signvalue) { 658 --padlen;
685 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 659 signvalue = 0;
686 --padlen; 660 }
687 signvalue = 0; 661 while (padlen > 0) {
688 } 662 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
689 while (padlen > 0) { 663 --padlen;
690 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 664 }
691 --padlen; 665 }
692 } 666 while (padlen > 0) {
693 } 667 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
694 while (padlen > 0) { 668 --padlen;
695 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 669 }
696 --padlen; 670 if (signvalue)
697 } 671 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
698 if (signvalue) 672
699 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 673 while (iplace > 0)
700 674 doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]);
701 while (iplace > 0) 675
702 doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); 676 /*
703 677 * Decimal point. This should probably use locale to find the correct
704 /* 678 * char to print out.
705 * Decimal point. This should probably use locale to find the correct 679 */
706 * char to print out. 680 if (max > 0 || (flags & DP_F_NUM)) {
707 */ 681 doapr_outch(sbuffer, buffer, currlen, maxlen, '.');
708 if (max > 0 || (flags & DP_F_NUM)) { 682
709 doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); 683 while (fplace > 0)
710 684 doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]);
711 while (fplace > 0) 685 }
712 doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); 686 while (zpadlen > 0) {
713 } 687 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
714 while (zpadlen > 0) { 688 --zpadlen;
715 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 689 }
716 --zpadlen; 690
717 } 691 while (padlen < 0) {
718 692 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
719 while (padlen < 0) { 693 ++padlen;
720 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 694 }
721 ++padlen;
722 }
723} 695}
724 696
725static void 697static void
726doapr_outch( 698doapr_outch(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
727 char **sbuffer,
728 char **buffer,
729 size_t *currlen,
730 size_t *maxlen,
731 int c) 699 int c)
732{ 700{
733 /* If we haven't at least one buffer, someone has doe a big booboo */ 701 /* If we haven't at least one buffer, someone has doe a big booboo */
734 assert(*sbuffer != NULL || buffer != NULL); 702 assert(*sbuffer != NULL || buffer != NULL);
735 703
736 if (buffer) { 704 if (buffer) {
737 while (*currlen >= *maxlen) { 705 while (*currlen >= *maxlen) {
738 if (*buffer == NULL) { 706 if (*buffer == NULL) {
739 if (*maxlen == 0) 707 if (*maxlen == 0)
740 *maxlen = 1024; 708 *maxlen = 1024;
741 *buffer = OPENSSL_malloc(*maxlen); 709 *buffer = OPENSSL_malloc(*maxlen);
742 if (*currlen > 0) { 710 if (*currlen > 0) {
743 assert(*sbuffer != NULL); 711 assert(*sbuffer != NULL);
744 memcpy(*buffer, *sbuffer, *currlen); 712 memcpy(*buffer, *sbuffer, *currlen);
713 }
714 *sbuffer = NULL;
715 } else {
716 *maxlen += 1024;
717 *buffer = OPENSSL_realloc(*buffer, *maxlen);
718 }
745 } 719 }
746 *sbuffer = NULL; 720 /* What to do if *buffer is NULL? */
747 } else { 721 assert(*sbuffer != NULL || *buffer != NULL);
748 *maxlen += 1024;
749 *buffer = OPENSSL_realloc(*buffer, *maxlen);
750 }
751 } 722 }
752 /* What to do if *buffer is NULL? */
753 assert(*sbuffer != NULL || *buffer != NULL);
754 }
755 723
756 if (*currlen < *maxlen) { 724 if (*currlen < *maxlen) {
757 if (*sbuffer) 725 if (*sbuffer)
758 (*sbuffer)[(*currlen)++] = (char)c; 726 (*sbuffer)[(*currlen)++] = (char)c;
759 else 727 else
760 (*buffer)[(*currlen)++] = (char)c; 728 (*buffer)[(*currlen)++] = (char)c;
761 } 729 }
762 730
763 return; 731 return;
764} 732}
765 733
766/***************************************************************************/ 734/***************************************************************************/
767 735
768int BIO_printf (BIO *bio, const char *format, ...) 736int BIO_printf (BIO *bio, const char *format, ...)
769 { 737{
770 va_list args; 738 va_list args;
771 int ret; 739 int ret;
772 740
@@ -775,15 +743,15 @@ int BIO_printf (BIO *bio, const char *format, ...)
775 ret = BIO_vprintf(bio, format, args); 743 ret = BIO_vprintf(bio, format, args);
776 744
777 va_end(args); 745 va_end(args);
778 return(ret); 746 return (ret);
779 } 747}
780 748
781int BIO_vprintf (BIO *bio, const char *format, va_list args) 749int BIO_vprintf (BIO *bio, const char *format, va_list args)
782 { 750{
783 int ret; 751 int ret;
784 size_t retlen; 752 size_t retlen;
785 char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable 753 char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable
786 in small-stack environments, like threads 754 in small - stack environments, like threads
787 or DOS programs. */ 755 or DOS programs. */
788 char *hugebufp = hugebuf; 756 char *hugebufp = hugebuf;
789 size_t hugebufsize = sizeof(hugebuf); 757 size_t hugebufsize = sizeof(hugebuf);
@@ -792,27 +760,25 @@ int BIO_vprintf (BIO *bio, const char *format, va_list args)
792 760
793 dynbuf = NULL; 761 dynbuf = NULL;
794 CRYPTO_push_info("doapr()"); 762 CRYPTO_push_info("doapr()");
795 _dopr(&hugebufp, &dynbuf, &hugebufsize, 763 _dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored,
796 &retlen, &ignored, format, args); 764 format, args);
797 if (dynbuf) 765 if (dynbuf) {
798 { 766 ret = BIO_write(bio, dynbuf, (int)retlen);
799 ret=BIO_write(bio, dynbuf, (int)retlen);
800 OPENSSL_free(dynbuf); 767 OPENSSL_free(dynbuf);
801 } 768 } else {
802 else 769 ret = BIO_write(bio, hugebuf, (int)retlen);
803 {
804 ret=BIO_write(bio, hugebuf, (int)retlen);
805 }
806 CRYPTO_pop_info();
807 return(ret);
808 } 770 }
771 CRYPTO_pop_info();
772 return (ret);
773}
809 774
810/* As snprintf is not available everywhere, we provide our own implementation. 775/* As snprintf is not available everywhere, we provide our own implementation.
811 * This function has nothing to do with BIOs, but it's closely related 776 * This function has nothing to do with BIOs, but it's closely related
812 * to BIO_printf, and we need *some* name prefix ... 777 * to BIO_printf, and we need *some* name prefix ...
813 * (XXX the function should be renamed, but to what?) */ 778 * (XXX the function should be renamed, but to what?) */
814int BIO_snprintf(char *buf, size_t n, const char *format, ...) 779int
815 { 780BIO_snprintf(char *buf, size_t n, const char *format, ...)
781{
816 va_list args; 782 va_list args;
817 int ret; 783 int ret;
818 784
@@ -821,11 +787,12 @@ int BIO_snprintf(char *buf, size_t n, const char *format, ...)
821 ret = BIO_vsnprintf(buf, n, format, args); 787 ret = BIO_vsnprintf(buf, n, format, args);
822 788
823 va_end(args); 789 va_end(args);
824 return(ret); 790 return (ret);
825 } 791}
826 792
827int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) 793int
828 { 794BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
795{
829 size_t retlen; 796 size_t retlen;
830 int truncated; 797 int truncated;
831 798
@@ -839,4 +806,4 @@ int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
839 return -1; 806 return -1;
840 else 807 else
841 return (retlen <= INT_MAX) ? (int)retlen : -1; 808 return (retlen <= INT_MAX) ? (int)retlen : -1;
842 } 809}
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c
index bd43307456..d739452580 100644
--- a/src/lib/libcrypto/bio/b_sock.c
+++ b/src/lib/libcrypto/bio/b_sock.c
@@ -85,7 +85,7 @@ NETDB_DEFINE_CONTEXT
85#endif 85#endif
86 86
87#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) 87#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
88static int wsa_init_done=0; 88static int wsa_init_done = 0;
89#endif 89#endif
90 90
91/* 91/*
@@ -100,36 +100,36 @@ static int wsa_init_done=0;
100#endif 100#endif
101 101
102#if 0 102#if 0
103static unsigned long BIO_ghbn_hits=0L; 103static unsigned long BIO_ghbn_hits = 0L;
104static unsigned long BIO_ghbn_miss=0L; 104static unsigned long BIO_ghbn_miss = 0L;
105 105
106#define GHBN_NUM 4 106#define GHBN_NUM 4
107static struct ghbn_cache_st 107static struct ghbn_cache_st {
108 {
109 char name[129]; 108 char name[129];
110 struct hostent *ent; 109 struct hostent *ent;
111 unsigned long order; 110 unsigned long order;
112 } ghbn_cache[GHBN_NUM]; 111} ghbn_cache[GHBN_NUM];
113#endif 112#endif
114 113
115static int get_ip(const char *str,unsigned char *ip); 114static int get_ip(const char *str, unsigned char *ip);
116#if 0 115#if 0
117static void ghbn_free(struct hostent *a); 116static void ghbn_free(struct hostent *a);
118static struct hostent *ghbn_dup(struct hostent *a); 117static struct hostent *ghbn_dup(struct hostent *a);
119#endif 118#endif
120int BIO_get_host_ip(const char *str, unsigned char *ip) 119
121 { 120int
121BIO_get_host_ip(const char *str, unsigned char *ip)
122{
122 int i; 123 int i;
123 int err = 1; 124 int err = 1;
124 int locked = 0; 125 int locked = 0;
125 struct hostent *he; 126 struct hostent *he;
126 127
127 i=get_ip(str,ip); 128 i = get_ip(str, ip);
128 if (i < 0) 129 if (i < 0) {
129 { 130 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS);
130 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
131 goto err; 131 goto err;
132 } 132 }
133 133
134 /* At this point, we have something that is most probably correct 134 /* At this point, we have something that is most probably correct
135 in some way, so let's init the socket. */ 135 in some way, so let's init the socket. */
@@ -138,172 +138,169 @@ int BIO_get_host_ip(const char *str, unsigned char *ip)
138 138
139 /* If the string actually contained an IP address, we need not do 139 /* If the string actually contained an IP address, we need not do
140 anything more */ 140 anything more */
141 if (i > 0) return(1); 141 if (i > 0)
142 return (1);
142 143
143 /* do a gethostbyname */ 144 /* do a gethostbyname */
144 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 145 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
145 locked = 1; 146 locked = 1;
146 he=BIO_gethostbyname(str); 147 he = BIO_gethostbyname(str);
147 if (he == NULL) 148 if (he == NULL) {
148 { 149 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP);
149 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
150 goto err; 150 goto err;
151 } 151 }
152 152
153 /* cast to short because of win16 winsock definition */ 153 /* cast to short because of win16 winsock definition */
154 if ((short)he->h_addrtype != AF_INET) 154 if ((short)he->h_addrtype != AF_INET) {
155 { 155 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
156 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
157 goto err; 156 goto err;
158 } 157 }
159 for (i=0; i<4; i++) 158 for (i = 0; i < 4; i++)
160 ip[i]=he->h_addr_list[0][i]; 159 ip[i] = he->h_addr_list[0][i];
161 err = 0; 160 err = 0;
162 161
163 err: 162err:
164 if (locked) 163 if (locked)
165 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 164 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
166 if (err) 165 if (err) {
167 { 166 ERR_add_error_data(2, "host=", str);
168 ERR_add_error_data(2,"host=",str);
169 return 0; 167 return 0;
170 } 168 } else
171 else
172 return 1; 169 return 1;
173 } 170}
174 171
175int BIO_get_port(const char *str, unsigned short *port_ptr) 172int
176 { 173BIO_get_port(const char *str, unsigned short *port_ptr)
174{
177 int i; 175 int i;
178 struct servent *s; 176 struct servent *s;
179 177
180 if (str == NULL) 178 if (str == NULL) {
181 { 179 BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED);
182 BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); 180 return (0);
183 return(0); 181 }
184 } 182 i = atoi(str);
185 i=atoi(str);
186 if (i != 0) 183 if (i != 0)
187 *port_ptr=(unsigned short)i; 184 *port_ptr = (unsigned short)i;
188 else 185 else {
189 {
190 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); 186 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
191 /* Note: under VMS with SOCKETSHR, it seems like the first 187 /* Note: under VMS with SOCKETSHR, it seems like the first
192 * parameter is 'char *', instead of 'const char *' 188 * parameter is 'char *', instead of 'const char *'
193 */ 189 */
194#ifndef CONST_STRICT 190#ifndef CONST_STRICT
195 s=getservbyname((char *)str,"tcp"); 191 s = getservbyname((char *)str, "tcp");
196#else 192#else
197 s=getservbyname(str,"tcp"); 193 s = getservbyname(str, "tcp");
198#endif 194#endif
199 if(s != NULL) 195 if (s != NULL)
200 *port_ptr=ntohs((unsigned short)s->s_port); 196 *port_ptr = ntohs((unsigned short)s->s_port);
201 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); 197 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
202 if(s == NULL) 198 if (s == NULL) {
203 { 199 if (strcmp(str, "http") == 0)
204 if (strcmp(str,"http") == 0) 200 *port_ptr = 80;
205 *port_ptr=80; 201 else if (strcmp(str, "telnet") == 0)
206 else if (strcmp(str,"telnet") == 0) 202 *port_ptr = 23;
207 *port_ptr=23; 203 else if (strcmp(str, "socks") == 0)
208 else if (strcmp(str,"socks") == 0) 204 *port_ptr = 1080;
209 *port_ptr=1080; 205 else if (strcmp(str, "https") == 0)
210 else if (strcmp(str,"https") == 0) 206 *port_ptr = 443;
211 *port_ptr=443; 207 else if (strcmp(str, "ssl") == 0)
212 else if (strcmp(str,"ssl") == 0) 208 *port_ptr = 443;
213 *port_ptr=443; 209 else if (strcmp(str, "ftp") == 0)
214 else if (strcmp(str,"ftp") == 0) 210 *port_ptr = 21;
215 *port_ptr=21; 211 else if (strcmp(str, "gopher") == 0)
216 else if (strcmp(str,"gopher") == 0) 212 *port_ptr = 70;
217 *port_ptr=70;
218#if 0 213#if 0
219 else if (strcmp(str,"wais") == 0) 214 else if (strcmp(str, "wais") == 0)
220 *port_ptr=21; 215 *port_ptr = 21;
221#endif 216#endif
222 else 217 else {
223 { 218 SYSerr(SYS_F_GETSERVBYNAME, errno);
224 SYSerr(SYS_F_GETSERVBYNAME,errno); 219 ERR_add_error_data(3, "service = '", str, "'");
225 ERR_add_error_data(3,"service='",str,"'"); 220 return (0);
226 return(0);
227 }
228 } 221 }
229 } 222 }
230 return(1);
231 } 223 }
224 return (1);
225}
232 226
233int BIO_sock_error(int sock) 227int
234 { 228BIO_sock_error(int sock)
235 int j,i; 229{
230 int j, i;
236 int size; 231 int size;
237 232
238#if defined(OPENSSL_SYS_BEOS_R5) 233#if defined(OPENSSL_SYS_BEOS_R5)
239 return 0; 234 return 0;
240#endif 235#endif
241 236
242 size=sizeof(int); 237 size = sizeof(int);
243 /* Note: under Windows the third parameter is of type (char *) 238 /* Note: under Windows the third parameter is of type (char *)
244 * whereas under other systems it is (void *) if you don't have 239 * whereas under other systems it is (void *) if you don't have
245 * a cast it will choke the compiler: if you do have a cast then 240 * a cast it will choke the compiler: if you do have a cast then
246 * you can either go for (char *) or (void *). 241 * you can either go for (char *) or (void *).
247 */ 242 */
248 i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); 243 i = getsockopt(sock, SOL_SOCKET, SO_ERROR,(void *)&j,(void *)&size);
249 if (i < 0) 244 if (i < 0)
250 return(1); 245 return (1);
251 else 246 else
252 return(j); 247 return (j);
253 } 248}
254 249
255#if 0 250#if 0
256long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) 251long
257 { 252BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
253{
258 int i; 254 int i;
259 char **p; 255 char **p;
260 256
261 switch (cmd) 257 switch (cmd) {
262 {
263 case BIO_GHBN_CTRL_HITS: 258 case BIO_GHBN_CTRL_HITS:
264 return(BIO_ghbn_hits); 259 return (BIO_ghbn_hits);
265 /* break; */ 260 /* break; */
266 case BIO_GHBN_CTRL_MISSES: 261 case BIO_GHBN_CTRL_MISSES:
267 return(BIO_ghbn_miss); 262 return (BIO_ghbn_miss);
268 /* break; */ 263 /* break; */
269 case BIO_GHBN_CTRL_CACHE_SIZE: 264 case BIO_GHBN_CTRL_CACHE_SIZE:
270 return(GHBN_NUM); 265 return (GHBN_NUM);
271 /* break; */ 266 /* break; */
272 case BIO_GHBN_CTRL_GET_ENTRY: 267 case BIO_GHBN_CTRL_GET_ENTRY:
273 if ((iarg >= 0) && (iarg <GHBN_NUM) && 268 if ((iarg >= 0) && (iarg < GHBN_NUM) &&
274 (ghbn_cache[iarg].order > 0)) 269 (ghbn_cache[iarg].order > 0)) {
275 { 270 p = (char **)parg;
276 p=(char **)parg; 271 if (p == NULL)
277 if (p == NULL) return(0); 272 return (0);
278 *p=ghbn_cache[iarg].name; 273 *p = ghbn_cache[iarg].name;
279 ghbn_cache[iarg].name[128]='\0'; 274 ghbn_cache[iarg].name[128] = '\0';
280 return(1); 275 return (1);
281 } 276 }
282 return(0); 277 return (0);
283 /* break; */ 278 /* break; */
284 case BIO_GHBN_CTRL_FLUSH: 279 case BIO_GHBN_CTRL_FLUSH:
285 for (i=0; i<GHBN_NUM; i++) 280 for (i = 0; i < GHBN_NUM; i++)
286 ghbn_cache[i].order=0; 281 ghbn_cache[i].order = 0;
287 break; 282 break;
288 default: 283 default:
289 return(0); 284 return (0);
290 }
291 return(1);
292 } 285 }
286 return (1);
287}
293#endif 288#endif
294 289
295#if 0 290#if 0
296static struct hostent *ghbn_dup(struct hostent *a) 291static struct hostent
297 { 292*ghbn_dup(struct hostent *a)
293{
298 struct hostent *ret; 294 struct hostent *ret;
299 int i,j; 295 int i, j;
300 296
301 MemCheck_off(); 297 MemCheck_off();
302 ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); 298 ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent));
303 if (ret == NULL) return(NULL); 299 if (ret == NULL)
304 memset(ret,0,sizeof(struct hostent)); 300 return (NULL);
301 memset(ret, 0, sizeof(struct hostent));
305 302
306 for (i=0; a->h_aliases[i] != NULL; i++) 303 for (i = 0; a->h_aliases[i] != NULL; i++)
307 ; 304 ;
308 i++; 305 i++;
309 ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); 306 ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *));
@@ -311,69 +308,66 @@ static struct hostent *ghbn_dup(struct hostent *a)
311 goto err; 308 goto err;
312 memset(ret->h_aliases, 0, i*sizeof(char *)); 309 memset(ret->h_aliases, 0, i*sizeof(char *));
313 310
314 for (i=0; a->h_addr_list[i] != NULL; i++) 311 for (i = 0; a->h_addr_list[i] != NULL; i++)
315 ; 312 ;
316 i++; 313 i++;
317 ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); 314 ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *));
318 if (ret->h_addr_list == NULL) 315 if (ret->h_addr_list == NULL)
319 goto err; 316 goto err;
320 memset(ret->h_addr_list, 0, i*sizeof(char *)); 317 memset(ret->h_addr_list, 0, i*sizeof(char *));
321 318
322 j=strlen(a->h_name)+1; 319 j = strlen(a->h_name) + 1;
323 if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; 320 if ((ret->h_name = OPENSSL_malloc(j)) == NULL) goto err;
324 memcpy((char *)ret->h_name,a->h_name,j); 321 memcpy((char *)ret->h_name, a->h_name, j);
325 for (i=0; a->h_aliases[i] != NULL; i++) 322 for (i = 0; a->h_aliases[i] != NULL; i++) {
326 { 323 j = strlen(a->h_aliases[i]) + 1;
327 j=strlen(a->h_aliases[i])+1; 324 if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL) goto err;
328 if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; 325 memcpy(ret->h_aliases[i], a->h_aliases[i], j);
329 memcpy(ret->h_aliases[i],a->h_aliases[i],j); 326 }
330 } 327 ret->h_length = a->h_length;
331 ret->h_length=a->h_length; 328 ret->h_addrtype = a->h_addrtype;
332 ret->h_addrtype=a->h_addrtype; 329 for (i = 0; a->h_addr_list[i] != NULL; i++) {
333 for (i=0; a->h_addr_list[i] != NULL; i++) 330 if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL)
334 {
335 if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL)
336 goto err; 331 goto err;
337 memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); 332 memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length);
338 } 333 }
339 if (0) 334 if (0) {
340 { 335err:
341err:
342 if (ret != NULL) 336 if (ret != NULL)
343 ghbn_free(ret); 337 ghbn_free(ret);
344 ret=NULL; 338 ret = NULL;
345 }
346 MemCheck_on();
347 return(ret);
348 } 339 }
340 MemCheck_on();
341 return (ret);
342}
349 343
350static void ghbn_free(struct hostent *a) 344static void
351 { 345ghbn_free(struct hostent *a)
346{
352 int i; 347 int i;
353 348
354 if(a == NULL) 349 if (a == NULL)
355 return; 350 return;
356 351
357 if (a->h_aliases != NULL) 352 if (a->h_aliases != NULL) {
358 { 353 for (i = 0; a->h_aliases[i] != NULL; i++)
359 for (i=0; a->h_aliases[i] != NULL; i++)
360 OPENSSL_free(a->h_aliases[i]); 354 OPENSSL_free(a->h_aliases[i]);
361 OPENSSL_free(a->h_aliases); 355 OPENSSL_free(a->h_aliases);
362 } 356 }
363 if (a->h_addr_list != NULL) 357 if (a->h_addr_list != NULL) {
364 { 358 for (i = 0; a->h_addr_list[i] != NULL; i++)
365 for (i=0; a->h_addr_list[i] != NULL; i++)
366 OPENSSL_free(a->h_addr_list[i]); 359 OPENSSL_free(a->h_addr_list[i]);
367 OPENSSL_free(a->h_addr_list); 360 OPENSSL_free(a->h_addr_list);
368 }
369 if (a->h_name != NULL) OPENSSL_free(a->h_name);
370 OPENSSL_free(a);
371 } 361 }
362 if (a->h_name != NULL)
363 OPENSSL_free(a->h_name);
364 OPENSSL_free(a);
365}
372 366
373#endif 367#endif
374 368
375struct hostent *BIO_gethostbyname(const char *name) 369struct hostent
376 { 370*BIO_gethostbyname(const char *name) {
377#if 1 371#if 1
378 /* Caching gethostbyname() results forever is wrong, 372 /* Caching gethostbyname() results forever is wrong,
379 * so we have to let the true gethostbyname() worry about this */ 373 * so we have to let the true gethostbyname() worry about this */
@@ -384,8 +378,8 @@ struct hostent *BIO_gethostbyname(const char *name)
384#endif 378#endif
385#else 379#else
386 struct hostent *ret; 380 struct hostent *ret;
387 int i,lowi=0,j; 381 int i, lowi = 0, j;
388 unsigned long low= (unsigned long)-1; 382 unsigned long low = (unsigned long) - 1;
389 383
390 384
391# if 0 385# if 0
@@ -395,42 +389,37 @@ struct hostent *BIO_gethostbyname(const char *name)
395 */ 389 */
396 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 390 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
397# endif 391# endif
398 j=strlen(name); 392 j = strlen(name);
399 if (j < 128) 393 if (j < 128) {
400 { 394 for (i = 0; i < GHBN_NUM; i++) {
401 for (i=0; i<GHBN_NUM; i++) 395 if (low > ghbn_cache[i].order) {
402 { 396 low = ghbn_cache[i].order;
403 if (low > ghbn_cache[i].order) 397 lowi = i;
404 { 398 }
405 low=ghbn_cache[i].order; 399 if (ghbn_cache[i].order > 0) {
406 lowi=i; 400 if (strncmp(name, ghbn_cache[i].name, 128) == 0)
407 }
408 if (ghbn_cache[i].order > 0)
409 {
410 if (strncmp(name,ghbn_cache[i].name,128) == 0)
411 break; 401 break;
412 }
413 } 402 }
414 } 403 }
415 else 404 } else
416 i=GHBN_NUM; 405 i = GHBN_NUM;
417 406
418 if (i == GHBN_NUM) /* no hit*/ 407 if (i == GHBN_NUM) /* no hit*/
419 { 408 {
420 BIO_ghbn_miss++; 409 BIO_ghbn_miss++;
421 /* Note: under VMS with SOCKETSHR, it seems like the first 410 /* Note: under VMS with SOCKETSHR, it seems like the first
422 * parameter is 'char *', instead of 'const char *' 411 * parameter is 'char *', instead of 'const char *'
423 */ 412 */
424# ifndef CONST_STRICT 413# ifndef CONST_STRICT
425 ret=gethostbyname((char *)name); 414 ret = gethostbyname((char *)name);
426# else 415# else
427 ret=gethostbyname(name); 416 ret = gethostbyname(name);
428# endif 417# endif
429 418
430 if (ret == NULL) 419 if (ret == NULL)
431 goto end; 420 goto end;
432 if (j > 128) /* too big to cache */ 421 if (j > 128) /* too big to cache */
433 { 422 {
434# if 0 423# if 0
435 /* If we were trying to make this function thread-safe (which 424 /* If we were trying to make this function thread-safe (which
436 * is bound to fail), we'd have to give up in this case 425 * is bound to fail), we'd have to give up in this case
@@ -438,118 +427,113 @@ struct hostent *BIO_gethostbyname(const char *name)
438 ret = NULL; 427 ret = NULL;
439# endif 428# endif
440 goto end; 429 goto end;
441 } 430 }
442 431
443 /* else add to cache */ 432 /* else add to cache */
444 if (ghbn_cache[lowi].ent != NULL) 433 if (ghbn_cache[lowi].ent != NULL)
445 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ 434 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
446 ghbn_cache[lowi].name[0] = '\0'; 435 ghbn_cache[lowi].name[0] = '\0';
447 436
448 if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) 437 if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) {
449 { 438 BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE);
450 BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE);
451 goto end; 439 goto end;
452 }
453 strncpy(ghbn_cache[lowi].name,name,128);
454 ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
455 } 440 }
456 else 441 strncpy(ghbn_cache[lowi].name, name, 128);
457 { 442 ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits;
443 } else {
458 BIO_ghbn_hits++; 444 BIO_ghbn_hits++;
459 ret= ghbn_cache[i].ent; 445 ret = ghbn_cache[i].ent;
460 ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; 446 ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits;
461 } 447 }
462end: 448end:
463# if 0 449# if 0
464 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 450 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
465# endif 451# endif
466 return(ret); 452 return (ret);
467#endif 453#endif
468 } 454}
469 455
470 456
471int BIO_sock_init(void) 457int
472 { 458BIO_sock_init(void)
459{
473#ifdef OPENSSL_SYS_WINDOWS 460#ifdef OPENSSL_SYS_WINDOWS
474 static struct WSAData wsa_state; 461 static struct WSAData wsa_state;
475 462
476 if (!wsa_init_done) 463 if (!wsa_init_done) {
477 {
478 int err; 464 int err;
479 465
480 wsa_init_done=1; 466 wsa_init_done = 1;
481 memset(&wsa_state,0,sizeof(wsa_state)); 467 memset(&wsa_state, 0, sizeof(wsa_state));
482 /* Not making wsa_state available to the rest of the 468 /* Not making wsa_state available to the rest of the
483 * code is formally wrong. But the structures we use 469 * code is formally wrong. But the structures we use
484 * are [beleived to be] invariable among Winsock DLLs, 470 * are [beleived to be] invariable among Winsock DLLs,
485 * while API availability is [expected to be] probed 471 * while API availability is [expected to be] probed
486 * at run-time with DSO_global_lookup. */ 472 * at run-time with DSO_global_lookup. */
487 if (WSAStartup(0x0202,&wsa_state)!=0) 473 if (WSAStartup(0x0202, &wsa_state) != 0) {
488 { 474 err = WSAGetLastError();
489 err=WSAGetLastError(); 475 SYSerr(SYS_F_WSASTARTUP, err);
490 SYSerr(SYS_F_WSASTARTUP,err); 476 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);
491 BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); 477 return (-1);
492 return(-1);
493 }
494 } 478 }
479 }
495#endif /* OPENSSL_SYS_WINDOWS */ 480#endif /* OPENSSL_SYS_WINDOWS */
496#ifdef WATT32 481#ifdef WATT32
497 extern int _watt_do_exit; 482 extern int _watt_do_exit;
498 _watt_do_exit = 0; /* don't make sock_init() call exit() */ 483 _watt_do_exit = 0;
484 /* don't make sock_init() call exit() */
499 if (sock_init()) 485 if (sock_init())
500 return (-1); 486 return (-1);
501#endif 487#endif
502 488
503#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 489#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
504 WORD wVerReq; 490 WORD wVerReq;
505 WSADATA wsaData; 491 WSADATA wsaData;
506 int err; 492 int err;
507 493
508 if (!wsa_init_done) 494 if (!wsa_init_done) {
509 { 495 wsa_init_done = 1;
510 wsa_init_done=1; 496 wVerReq = MAKEWORD( 2, 0 );
511 wVerReq = MAKEWORD( 2, 0 ); 497 err = WSAStartup(wVerReq, &wsaData);
512 err = WSAStartup(wVerReq,&wsaData); 498 if (err != 0) {
513 if (err != 0) 499 SYSerr(SYS_F_WSASTARTUP, err);
514 { 500 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);
515 SYSerr(SYS_F_WSASTARTUP,err); 501 return (-1);
516 BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
517 return(-1);
518 }
519 } 502 }
503 }
520#endif 504#endif
521 505
522 return(1); 506 return (1);
523 } 507}
524 508
525void BIO_sock_cleanup(void) 509void
526 { 510BIO_sock_cleanup(void)
511{
527#ifdef OPENSSL_SYS_WINDOWS 512#ifdef OPENSSL_SYS_WINDOWS
528 if (wsa_init_done) 513 if (wsa_init_done) {
529 { 514 wsa_init_done = 0;
530 wsa_init_done=0;
531#if 0 /* this call is claimed to be non-present in Winsock2 */ 515#if 0 /* this call is claimed to be non-present in Winsock2 */
532 WSACancelBlockingCall(); 516 WSACancelBlockingCall();
533#endif 517#endif
534 WSACleanup(); 518 WSACleanup();
535 } 519 }
536#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 520#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
537 if (wsa_init_done) 521 if (wsa_init_done) {
538 { 522 wsa_init_done = 0;
539 wsa_init_done=0; 523 WSACleanup();
540 WSACleanup();
541 }
542#endif
543 } 524 }
525#endif
526}
544 527
545#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 528#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000
546 529
547int BIO_socket_ioctl(int fd, long type, void *arg) 530int
548 { 531BIO_socket_ioctl(int fd, long type, void *arg)
532{
549 int i; 533 int i;
550 534
551#ifdef __DJGPP__ 535#ifdef __DJGPP__
552 i=ioctl(fd,type,(char *)arg); 536 i = ioctl(fd, type,(char *)arg);
553#else 537#else
554# if defined(OPENSSL_SYS_VMS) 538# if defined(OPENSSL_SYS_VMS)
555 /* 2011-02-18 SMS. 539 /* 2011-02-18 SMS.
@@ -574,402 +558,399 @@ int BIO_socket_ioctl(int fd, long type, void *arg)
574# define ARG arg 558# define ARG arg
575# endif /* defined(OPENSSL_SYS_VMS) [else] */ 559# endif /* defined(OPENSSL_SYS_VMS) [else] */
576 560
577 i=ioctl(fd,type,ARG); 561 i = ioctl(fd, type, ARG);
578#endif /* __DJGPP__ */ 562#endif /* __DJGPP__ */
579 if (i < 0) 563 if (i < 0)
580 SYSerr(SYS_F_IOCTLSOCKET,errno); 564 SYSerr(SYS_F_IOCTLSOCKET, errno);
581 return(i); 565 return (i);
582 } 566}
583#endif /* __VMS_VER */ 567#endif /* __VMS_VER */
584 568
585/* The reason I have implemented this instead of using sscanf is because 569/* The reason I have implemented this instead of using sscanf is because
586 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ 570 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
587static int get_ip(const char *str, unsigned char ip[4]) 571static int
588 { 572get_ip(const char *str, unsigned char ip[4])
573{
589 unsigned int tmp[4]; 574 unsigned int tmp[4];
590 int num=0,c,ok=0; 575 int num = 0, c, ok = 0;
591 576
592 tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; 577 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;
593 578
594 for (;;) 579 for (;;) {
595 {
596 c= *(str++); 580 c= *(str++);
597 if ((c >= '0') && (c <= '9')) 581 if ((c >= '0') && (c <= '9')) {
598 { 582 ok = 1;
599 ok=1; 583 tmp[num] = tmp[num]*10 + c-'0';
600 tmp[num]=tmp[num]*10+c-'0'; 584 if (tmp[num] > 255)
601 if (tmp[num] > 255) return(0); 585 return (0);
602 } 586 } else if (c == '.') {
603 else if (c == '.') 587 if (!ok)
604 { 588 return (-1);
605 if (!ok) return(-1); 589 if (num == 3)
606 if (num == 3) return(0); 590 return (0);
607 num++; 591 num++;
608 ok=0; 592 ok = 0;
609 } 593 } else if (c == '\0' && (num == 3) && ok)
610 else if (c == '\0' && (num == 3) && ok) 594 break;
611 break;
612 else 595 else
613 return(0); 596 return (0);
614 }
615 ip[0]=tmp[0];
616 ip[1]=tmp[1];
617 ip[2]=tmp[2];
618 ip[3]=tmp[3];
619 return(1);
620 } 597 }
621 598 ip[0] = tmp[0];
622int BIO_get_accept_socket(char *host, int bind_mode) 599 ip[1] = tmp[1];
623 { 600 ip[2] = tmp[2];
624 int ret=0; 601 ip[3] = tmp[3];
602 return (1);
603}
604
605int
606BIO_get_accept_socket(char *host, int bind_mode)
607{
608 int ret = 0;
625 union { 609 union {
626 struct sockaddr sa; 610 struct sockaddr sa;
627 struct sockaddr_in sa_in; 611 struct sockaddr_in sa_in;
628#if OPENSSL_USE_IPV6 612#if OPENSSL_USE_IPV6
629 struct sockaddr_in6 sa_in6; 613 struct sockaddr_in6 sa_in6;
630#endif 614#endif
631 } server,client; 615 } server, client;
632 int s=-1,cs,addrlen; 616 int s = -1, cs, addrlen;
633 unsigned char ip[4]; 617 unsigned char ip[4];
634 unsigned short port; 618 unsigned short port;
635 char *str=NULL,*e; 619 char *str = NULL, *e;
636 char *h,*p; 620 char *h, *p;
637 unsigned long l; 621 unsigned long l;
638 int err_num; 622 int err_num;
639 623
640 if (BIO_sock_init() != 1) return(-1); 624 if (BIO_sock_init() != 1)
625 return (-1);
641 626
642 if ((str=BUF_strdup(host)) == NULL) return(-1); 627 if ((str = BUF_strdup(host)) == NULL)
628 return (-1);
643 629
644 h=p=NULL; 630 h = p = NULL;
645 h=str; 631 h = str;
646 for (e=str; *e; e++) 632 for (e = str; *e; e++) {
647 { 633 if (*e == ':') {
648 if (*e == ':') 634 p = e;
649 { 635 } else if (*e == '/') {
650 p=e; 636 *e = '\0';
651 }
652 else if (*e == '/')
653 {
654 *e='\0';
655 break; 637 break;
656 }
657 } 638 }
658 if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ 639 }
659 else p=h,h=NULL; 640 if (p)
641 *p++='\0'; /* points at last ':', '::port' is special [see below] */
642 else
643 p = h, h = NULL;
660 644
661#ifdef EAI_FAMILY 645#ifdef EAI_FAMILY
662 do { 646 do {
663 static union { void *p; 647 static union {
664 int (WSAAPI *f)(const char *,const char *, 648 void *p;
665 const struct addrinfo *, 649 int (WSAAPI *f)(const char *, const char *,
666 struct addrinfo **); 650 const struct addrinfo *,
667 } p_getaddrinfo = {NULL}; 651 struct addrinfo **);
668 static union { void *p; 652 } p_getaddrinfo = {NULL};
653 static union {
654 void *p;
669 void (WSAAPI *f)(struct addrinfo *); 655 void (WSAAPI *f)(struct addrinfo *);
670 } p_freeaddrinfo = {NULL}; 656 } p_freeaddrinfo = {NULL};
671 struct addrinfo *res,hint; 657 struct addrinfo *res, hint;
672 658
673 if (p_getaddrinfo.p==NULL) 659 if (p_getaddrinfo.p == NULL) {
674 { 660 if ((p_getaddrinfo.p = DSO_global_lookup("getaddrinfo"))==NULL ||
675 if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || 661 (p_freeaddrinfo.p = DSO_global_lookup("freeaddrinfo"))==NULL)
676 (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) 662 p_getaddrinfo.p = (void*) - 1;
677 p_getaddrinfo.p=(void*)-1; 663 }
678 } 664 if (p_getaddrinfo.p == (void *) - 1) break;
679 if (p_getaddrinfo.p==(void *)-1) break; 665
680 666 /* '::port' enforces IPv6 wildcard listener. Some OSes,
681 /* '::port' enforces IPv6 wildcard listener. Some OSes, 667 * e.g. Solaris, default to IPv6 without any hint. Also
682 * e.g. Solaris, default to IPv6 without any hint. Also 668 * note that commonly IPv6 wildchard socket can service
683 * note that commonly IPv6 wildchard socket can service 669 * IPv4 connections just as well... */
684 * IPv4 connections just as well... */ 670 memset(&hint, 0, sizeof(hint));
685 memset(&hint,0,sizeof(hint)); 671 hint.ai_flags = AI_PASSIVE;
686 hint.ai_flags = AI_PASSIVE; 672 if (h) {
687 if (h) 673 if (strchr(h, ':')) {
688 { 674 if (h[1] == '\0')
689 if (strchr(h,':')) 675 h = NULL;
690 {
691 if (h[1]=='\0') h=NULL;
692#if OPENSSL_USE_IPV6 676#if OPENSSL_USE_IPV6
693 hint.ai_family = AF_INET6; 677 hint.ai_family = AF_INET6;
694#else 678#else
695 h=NULL; 679 h = NULL;
696#endif 680#endif
697 } 681 } else if (h[0] == '*' && h[1] == '\0') {
698 else if (h[0]=='*' && h[1]=='\0') 682 hint.ai_family = AF_INET;
699 { 683 h = NULL;
700 hint.ai_family = AF_INET;
701 h=NULL;
702 } 684 }
703 } 685 }
704 686
705 if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; 687 if ((*p_getaddrinfo.f)(h, p, &hint, &res))
688 break;
706 689
707 addrlen = res->ai_addrlen<=sizeof(server) ? 690 addrlen = res->ai_addrlen <= sizeof(server) ?
708 res->ai_addrlen : 691 res->ai_addrlen : sizeof(server);
709 sizeof(server); 692 memcpy(&server, res->ai_addr, addrlen);
710 memcpy(&server, res->ai_addr, addrlen);
711 693
712 (*p_freeaddrinfo.f)(res); 694 (*p_freeaddrinfo.f)(res);
713 goto again; 695 goto again;
714 } while (0); 696 } while (0);
715#endif 697#endif
716 698
717 if (!BIO_get_port(p,&port)) goto err; 699 if (!BIO_get_port(p, &port))
700 goto err;
718 701
719 memset((char *)&server,0,sizeof(server)); 702 memset((char *)&server, 0, sizeof(server));
720 server.sa_in.sin_family=AF_INET; 703 server.sa_in.sin_family = AF_INET;
721 server.sa_in.sin_port=htons(port); 704 server.sa_in.sin_port = htons(port);
722 addrlen = sizeof(server.sa_in); 705 addrlen = sizeof(server.sa_in);
723 706
724 if (h == NULL || strcmp(h,"*") == 0) 707 if (h == NULL || strcmp(h, "*") == 0)
725 server.sa_in.sin_addr.s_addr=INADDR_ANY; 708 server.sa_in.sin_addr.s_addr = INADDR_ANY;
726 else 709 else {
727 { 710 if (!BIO_get_host_ip(h, &(ip[0])))
728 if (!BIO_get_host_ip(h,&(ip[0]))) goto err; 711 goto err;
729 l=(unsigned long) 712 l = (unsigned long)
730 ((unsigned long)ip[0]<<24L)| 713 ((unsigned long)ip[0]<<24L)|
731 ((unsigned long)ip[1]<<16L)| 714 ((unsigned long)ip[1]<<16L)|
732 ((unsigned long)ip[2]<< 8L)| 715 ((unsigned long)ip[2]<< 8L)|
733 ((unsigned long)ip[3]); 716 ((unsigned long)ip[3]);
734 server.sa_in.sin_addr.s_addr=htonl(l); 717 server.sa_in.sin_addr.s_addr = htonl(l);
735 } 718 }
736 719
737again: 720again:
738 s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); 721 s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
739 if (s == -1) 722 if (s == -1) {
740 { 723 SYSerr(SYS_F_SOCKET, errno);
741 SYSerr(SYS_F_SOCKET,errno); 724 ERR_add_error_data(3, "port = '", host, "'");
742 ERR_add_error_data(3,"port='",host,"'"); 725 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET);
743 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
744 goto err; 726 goto err;
745 } 727 }
746 728
747#ifdef SO_REUSEADDR 729#ifdef SO_REUSEADDR
748 if (bind_mode == BIO_BIND_REUSEADDR) 730 if (bind_mode == BIO_BIND_REUSEADDR) {
749 { 731 int i = 1;
750 int i=1;
751 732
752 ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); 733 ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(char *)&i, sizeof(i));
753 bind_mode=BIO_BIND_NORMAL; 734 bind_mode = BIO_BIND_NORMAL;
754 } 735 }
755#endif 736#endif
756 if (bind(s,&server.sa,addrlen) == -1) 737 if (bind(s, &server.sa, addrlen) == -1) {
757 {
758#ifdef SO_REUSEADDR 738#ifdef SO_REUSEADDR
759 err_num=errno; 739 err_num = errno;
760 if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && 740 if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
761#ifdef OPENSSL_SYS_WINDOWS 741#ifdef OPENSSL_SYS_WINDOWS
762 /* Some versions of Windows define EADDRINUSE to 742 /* Some versions of Windows define EADDRINUSE to
763 * a dummy value. 743 * a dummy value.
764 */ 744 */
765 (err_num == WSAEADDRINUSE)) 745 (err_num == WSAEADDRINUSE))
766#else 746#else
767 (err_num == EADDRINUSE)) 747 (err_num == EADDRINUSE))
768#endif 748#endif
769 { 749 {
770 client = server; 750 client = server;
771 if (h == NULL || strcmp(h,"*") == 0) 751 if (h == NULL || strcmp(h, "*") == 0) {
772 {
773#if OPENSSL_USE_IPV6 752#if OPENSSL_USE_IPV6
774 if (client.sa.sa_family == AF_INET6) 753 if (client.sa.sa_family == AF_INET6) {
775 { 754 memset(&client.sa_in6.sin6_addr, 0, sizeof(client.sa_in6.sin6_addr));
776 memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); 755 client.sa_in6.sin6_addr.s6_addr[15] = 1;
777 client.sa_in6.sin6_addr.s6_addr[15]=1; 756 } else
778 } 757#endif
779 else 758 if (client.sa.sa_family == AF_INET) {
780#endif 759 client.sa_in.sin_addr.s_addr = htonl(0x7F000001);
781 if (client.sa.sa_family == AF_INET) 760 } else
782 { 761 goto err;
783 client.sa_in.sin_addr.s_addr=htonl(0x7F000001); 762 }
784 } 763 cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
785 else goto err; 764 if (cs != -1) {
786 }
787 cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
788 if (cs != -1)
789 {
790 int ii; 765 int ii;
791 ii=connect(cs,&client.sa,addrlen); 766 ii = connect(cs, &client.sa, addrlen);
792 close(cs); 767 close(cs);
793 if (ii == -1) 768 if (ii == -1) {
794 { 769 bind_mode = BIO_BIND_REUSEADDR;
795 bind_mode=BIO_BIND_REUSEADDR;
796 close(s); 770 close(s);
797 goto again; 771 goto again;
798 }
799 /* else error */
800 } 772 }
801 /* else error */ 773 /* else error */
802 } 774 }
775 /* else error */
776 }
803#endif 777#endif
804 SYSerr(SYS_F_BIND,err_num); 778 SYSerr(SYS_F_BIND, err_num);
805 ERR_add_error_data(3,"port='",host,"'"); 779 ERR_add_error_data(3, "port = '", host, "'");
806 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); 780 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_BIND_SOCKET);
807 goto err; 781 goto err;
808 } 782 }
809 if (listen(s,MAX_LISTEN) == -1) 783 if (listen(s, MAX_LISTEN) == -1) {
810 { 784 SYSerr(SYS_F_BIND, errno);
811 SYSerr(SYS_F_BIND,errno); 785 ERR_add_error_data(3, "port = '", host, "'");
812 ERR_add_error_data(3,"port='",host,"'"); 786 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_LISTEN_SOCKET);
813 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET);
814 goto err; 787 goto err;
815 } 788 }
816 ret=1; 789 ret = 1;
817err: 790err:
818 if (str != NULL) OPENSSL_free(str); 791 if (str != NULL)
819 if ((ret == 0) && (s != -1)) 792 OPENSSL_free(str);
820 { 793 if ((ret == 0) && (s != -1)) {
821 close(s); 794 close(s);
822 s= -1; 795 s = -1;
823 }
824 return(s);
825 } 796 }
797 return (s);
798}
826 799
827int BIO_accept(int sock, char **addr) 800int
828 { 801BIO_accept(int sock, char **addr)
829 int ret=-1; 802{
803 int ret = -1;
830 unsigned long l; 804 unsigned long l;
831 unsigned short port; 805 unsigned short port;
832 char *p; 806 char *p;
833 807
834 struct { 808 struct {
835 /* 809 /*
836 * As for following union. Trouble is that there are platforms 810 * As for following union. Trouble is that there are platforms
837 * that have socklen_t and there are platforms that don't, on 811 * that have socklen_t and there are platforms that don't, on
838 * some platforms socklen_t is int and on some size_t. So what 812 * some platforms socklen_t is int and on some size_t. So what
839 * one can do? One can cook #ifdef spaghetti, which is nothing 813 * one can do? One can cook #ifdef spaghetti, which is nothing
840 * but masochistic. Or one can do union between int and size_t. 814 * but masochistic. Or one can do union between int and size_t.
841 * One naturally does it primarily for 64-bit platforms where 815 * One naturally does it primarily for 64-bit platforms where
842 * sizeof(int) != sizeof(size_t). But would it work? Note that 816 * sizeof(int) != sizeof(size_t). But would it work? Note that
843 * if size_t member is initialized to 0, then later int member 817 * if size_t member is initialized to 0, then later int member
844 * assignment naturally does the job on little-endian platforms 818 * assignment naturally does the job on little-endian platforms
845 * regardless accept's expectations! What about big-endians? 819 * regardless accept's expectations! What about big-endians?
846 * If accept expects int*, then it works, and if size_t*, then 820 * If accept expects int*, then it works, and if size_t*, then
847 * length value would appear as unreasonably large. But this 821 * length value would appear as unreasonably large. But this
848 * won't prevent it from filling in the address structure. The 822 * won't prevent it from filling in the address structure. The
849 * trouble of course would be if accept returns more data than 823 * trouble of course would be if accept returns more data than
850 * actual buffer can accomodate and overwrite stack... That's 824 * actual buffer can accomodate and overwrite stack... That's
851 * where early OPENSSL_assert comes into picture. Besides, the 825 * where early OPENSSL_assert comes into picture. Besides, the
852 * only 64-bit big-endian platform found so far that expects 826 * only 64-bit big-endian platform found so far that expects
853 * size_t* is HP-UX, where stack grows towards higher address. 827 * size_t* is HP-UX, where stack grows towards higher address.
854 * <appro> 828 * <appro>
855 */ 829 */
856 union { size_t s; int i; } len; 830 union {
857 union { 831 size_t s;
858 struct sockaddr sa; 832 int i;
859 struct sockaddr_in sa_in; 833 } len;
834 union {
835 struct sockaddr sa;
836 struct sockaddr_in sa_in;
860#if OPENSSL_USE_IPV6 837#if OPENSSL_USE_IPV6
861 struct sockaddr_in6 sa_in6; 838 struct sockaddr_in6 sa_in6;
862#endif 839#endif
863 } from; 840 } from;
864 } sa; 841 } sa;
865 842
866 sa.len.s=0; 843 sa.len.s = 0;
867 sa.len.i=sizeof(sa.from); 844 sa.len.i = sizeof(sa.from);
868 memset(&sa.from,0,sizeof(sa.from)); 845 memset(&sa.from, 0, sizeof(sa.from));
869 ret=accept(sock,&sa.from.sa,(void *)&sa.len); 846 ret = accept(sock, &sa.from.sa,(void *)&sa.len);
870 if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) 847 if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) {
871 { 848 OPENSSL_assert(sa.len.s <= sizeof(sa.from));
872 OPENSSL_assert(sa.len.s<=sizeof(sa.from));
873 sa.len.i = (int)sa.len.s; 849 sa.len.i = (int)sa.len.s;
874 /* use sa.len.i from this point */ 850 /* use sa.len.i from this point */
875 } 851 }
876 if (ret == -1) 852 if (ret == -1) {
877 { 853 if (BIO_sock_should_retry(ret)) return -2;
878 if(BIO_sock_should_retry(ret)) return -2; 854 SYSerr(SYS_F_ACCEPT, errno);
879 SYSerr(SYS_F_ACCEPT,errno); 855 BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR);
880 BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR);
881 goto end; 856 goto end;
882 } 857 }
883 858
884 if (addr == NULL) goto end; 859 if (addr == NULL)
860 goto end;
885 861
886#ifdef EAI_FAMILY 862#ifdef EAI_FAMILY
887 do { 863 do {
888 char h[NI_MAXHOST],s[NI_MAXSERV]; 864 char h[NI_MAXHOST], s[NI_MAXSERV];
889 size_t nl; 865 size_t nl;
890 static union { void *p; 866 static union {
891 int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, 867 void *p;
892 char *,size_t,char *,size_t,int); 868 int (WSAAPI *f)(const struct sockaddr *,
893 } p_getnameinfo = {NULL}; 869 size_t/*socklen_t*/, char *, size_t,
894 /* 2nd argument to getnameinfo is specified to 870 char *, size_t, int);
895 * be socklen_t. Unfortunately there is a number 871 } p_getnameinfo = {NULL};
896 * of environments where socklen_t is not defined. 872 /* 2nd argument to getnameinfo is specified to
897 * As it's passed by value, it's safe to pass it 873 * be socklen_t. Unfortunately there is a number
898 * as size_t... <appro> */ 874 * of environments where socklen_t is not defined.
899 875 * As it's passed by value, it's safe to pass it
900 if (p_getnameinfo.p==NULL) 876 * as size_t... <appro> */
901 { 877
902 if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) 878 if (p_getnameinfo.p == NULL) {
903 p_getnameinfo.p=(void*)-1; 879 if ((p_getnameinfo.p = DSO_global_lookup("getnameinfo")) == NULL)
880 p_getnameinfo.p = (void*) - 1;
881 }
882 if (p_getnameinfo.p == (void *) - 1)
883 break;
884
885 if ((*p_getnameinfo.f)(&sa.from.sa, sa.len.i, h, sizeof(h),
886 s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV))
887 break;
888 nl = strlen(h) + strlen(s) + 2;
889 p = *addr;
890 if (p) {
891 *p = '\0';
892 p = OPENSSL_realloc(p, nl);
893 } else {
894 p = OPENSSL_malloc(nl);
895 }
896 if (p == NULL) {
897 BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE);
898 goto end;
904 } 899 }
905 if (p_getnameinfo.p==(void *)-1) break; 900 *addr = p;
906 901 (void) snprintf(*addr, nl, "%s:%s", h, s);
907 if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s),
908 NI_NUMERICHOST|NI_NUMERICSERV)) break;
909 nl = strlen(h)+strlen(s)+2;
910 p = *addr;
911 if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); }
912 else { p = OPENSSL_malloc(nl); }
913 if (p==NULL)
914 {
915 BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
916 goto end; 902 goto end;
917 } 903 } while (0);
918 *addr = p; 904#endif
919 (void) snprintf(*addr,nl,"%s:%s",h,s); 905 if (sa.from.sa.sa_family != AF_INET)
920 goto end; 906 goto end;
921 } while(0); 907 l = ntohl(sa.from.sa_in.sin_addr.s_addr);
922#endif 908 port = ntohs(sa.from.sa_in.sin_port);
923 if (sa.from.sa.sa_family != AF_INET) goto end; 909 if (*addr == NULL) {
924 l=ntohl(sa.from.sa_in.sin_addr.s_addr); 910 if ((p = OPENSSL_malloc(24)) == NULL) {
925 port=ntohs(sa.from.sa_in.sin_port); 911 BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE);
926 if (*addr == NULL)
927 {
928 if ((p=OPENSSL_malloc(24)) == NULL)
929 {
930 BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
931 goto end; 912 goto end;
932 }
933 *addr=p;
934 } 913 }
935 (void) snprintf(*addr,24,"%d.%d.%d.%d:%d", 914 *addr = p;
936 (unsigned char)(l>>24L)&0xff,
937 (unsigned char)(l>>16L)&0xff,
938 (unsigned char)(l>> 8L)&0xff,
939 (unsigned char)(l )&0xff,
940 port);
941end:
942 return(ret);
943 } 915 }
916 (void) snprintf(*addr, 24, "%d.%d.%d.%d:%d",
917 (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff,
918 (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port);
944 919
945int BIO_set_tcp_ndelay(int s, int on) 920end:
946 { 921 return (ret);
947 int ret=0; 922}
923
924int
925BIO_set_tcp_ndelay(int s, int on)
926{
927 int ret = 0;
948#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) 928#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
949 int opt; 929 int opt;
950 930
951#ifdef SOL_TCP 931#ifdef SOL_TCP
952 opt=SOL_TCP; 932 opt = SOL_TCP;
953#else 933#else
954#ifdef IPPROTO_TCP 934#ifdef IPPROTO_TCP
955 opt=IPPROTO_TCP; 935 opt = IPPROTO_TCP;
956#endif 936#endif
957#endif 937#endif
958 938
959 ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); 939 ret = setsockopt(s, opt, TCP_NODELAY,(char *)&on, sizeof(on));
960#endif 940#endif
961 return(ret == 0); 941 return (ret == 0);
962 } 942}
963 943
964int BIO_socket_nbio(int s, int mode) 944int
965 { 945BIO_socket_nbio(int s, int mode)
966 int ret= -1; 946{
947 int ret = -1;
967 int l; 948 int l;
968 949
969 l=mode; 950 l = mode;
970#ifdef FIONBIO 951#ifdef FIONBIO
971 ret=BIO_socket_ioctl(s,FIONBIO,&l); 952 ret = BIO_socket_ioctl(s, FIONBIO, &l);
972#endif 953#endif
973 return(ret == 0); 954 return (ret == 0);
974 } 955}
975#endif 956#endif
diff --git a/src/lib/libcrypto/bio/bf_buff.c b/src/lib/libcrypto/bio/bf_buff.c
index 4b5a132d8a..9518cf977e 100644
--- a/src/lib/libcrypto/bio/bf_buff.c
+++ b/src/lib/libcrypto/bio/bf_buff.c
@@ -61,7 +61,7 @@
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include <openssl/bio.h> 62#include <openssl/bio.h>
63 63
64static int buffer_write(BIO *h, const char *buf,int num); 64static int buffer_write(BIO *h, const char *buf, int num);
65static int buffer_read(BIO *h, char *buf, int size); 65static int buffer_read(BIO *h, char *buf, int size);
66static int buffer_puts(BIO *h, const char *str); 66static int buffer_puts(BIO *h, const char *str);
67static int buffer_gets(BIO *h, char *str, int size); 67static int buffer_gets(BIO *h, char *str, int size);
@@ -71,8 +71,7 @@ static int buffer_free(BIO *data);
71static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); 71static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
72#define DEFAULT_BUFFER_SIZE 4096 72#define DEFAULT_BUFFER_SIZE 4096
73 73
74static BIO_METHOD methods_buffer= 74static BIO_METHOD methods_buffer = {
75 {
76 BIO_TYPE_BUFFER, 75 BIO_TYPE_BUFFER,
77 "buffer", 76 "buffer",
78 buffer_write, 77 buffer_write,
@@ -83,430 +82,444 @@ static BIO_METHOD methods_buffer=
83 buffer_new, 82 buffer_new,
84 buffer_free, 83 buffer_free,
85 buffer_callback_ctrl, 84 buffer_callback_ctrl,
86 }; 85};
87 86
88BIO_METHOD *BIO_f_buffer(void) 87BIO_METHOD
89 { 88*BIO_f_buffer(void)
90 return(&methods_buffer); 89{
91 } 90 return (&methods_buffer);
91}
92 92
93static int buffer_new(BIO *bi) 93static int
94 { 94buffer_new(BIO *bi)
95{
95 BIO_F_BUFFER_CTX *ctx; 96 BIO_F_BUFFER_CTX *ctx;
96 97
97 ctx=(BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); 98 ctx = (BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX));
98 if (ctx == NULL) return(0); 99 if (ctx == NULL)
99 ctx->ibuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); 100 return (0);
100 if (ctx->ibuf == NULL) { OPENSSL_free(ctx); return(0); } 101 ctx->ibuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE);
101 ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); 102 if (ctx->ibuf == NULL) {
102 if (ctx->obuf == NULL) { OPENSSL_free(ctx->ibuf); OPENSSL_free(ctx); return(0); } 103 OPENSSL_free(ctx);
103 ctx->ibuf_size=DEFAULT_BUFFER_SIZE; 104 return (0);
104 ctx->obuf_size=DEFAULT_BUFFER_SIZE;
105 ctx->ibuf_len=0;
106 ctx->ibuf_off=0;
107 ctx->obuf_len=0;
108 ctx->obuf_off=0;
109
110 bi->init=1;
111 bi->ptr=(char *)ctx;
112 bi->flags=0;
113 return(1);
114 } 105 }
115 106 ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE);
116static int buffer_free(BIO *a) 107 if (ctx->obuf == NULL) {
117 { 108 OPENSSL_free(ctx->ibuf);
109 OPENSSL_free(ctx);
110 return (0);
111 }
112 ctx->ibuf_size = DEFAULT_BUFFER_SIZE;
113 ctx->obuf_size = DEFAULT_BUFFER_SIZE;
114 ctx->ibuf_len = 0;
115 ctx->ibuf_off = 0;
116 ctx->obuf_len = 0;
117 ctx->obuf_off = 0;
118
119 bi->init = 1;
120 bi->ptr = (char *)ctx;
121 bi->flags = 0;
122 return (1);
123}
124
125static int
126buffer_free(BIO *a)
127{
118 BIO_F_BUFFER_CTX *b; 128 BIO_F_BUFFER_CTX *b;
119 129
120 if (a == NULL) return(0); 130 if (a == NULL)
121 b=(BIO_F_BUFFER_CTX *)a->ptr; 131 return (0);
122 if (b->ibuf != NULL) OPENSSL_free(b->ibuf); 132 b = (BIO_F_BUFFER_CTX *)a->ptr;
123 if (b->obuf != NULL) OPENSSL_free(b->obuf); 133 if (b->ibuf != NULL)
134 OPENSSL_free(b->ibuf);
135 if (b->obuf != NULL)
136 OPENSSL_free(b->obuf);
124 OPENSSL_free(a->ptr); 137 OPENSSL_free(a->ptr);
125 a->ptr=NULL; 138 a->ptr = NULL;
126 a->init=0; 139 a->init = 0;
127 a->flags=0; 140 a->flags = 0;
128 return(1); 141 return (1);
129 } 142}
130 143
131static int buffer_read(BIO *b, char *out, int outl) 144static int
132 { 145buffer_read(BIO *b, char *out, int outl)
133 int i,num=0; 146{
147 int i, num = 0;
134 BIO_F_BUFFER_CTX *ctx; 148 BIO_F_BUFFER_CTX *ctx;
135 149
136 if (out == NULL) return(0); 150 if (out == NULL)
137 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 151 return (0);
152 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
138 153
139 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 154 if ((ctx == NULL) || (b->next_bio == NULL))
140 num=0; 155 return (0);
156 num = 0;
141 BIO_clear_retry_flags(b); 157 BIO_clear_retry_flags(b);
142 158
143start: 159start:
144 i=ctx->ibuf_len; 160 i = ctx->ibuf_len;
145 /* If there is stuff left over, grab it */ 161 /* If there is stuff left over, grab it */
146 if (i != 0) 162 if (i != 0) {
147 { 163 if (i > outl)
148 if (i > outl) i=outl; 164 i = outl;
149 memcpy(out,&(ctx->ibuf[ctx->ibuf_off]),i); 165 memcpy(out, &(ctx->ibuf[ctx->ibuf_off]), i);
150 ctx->ibuf_off+=i; 166 ctx->ibuf_off += i;
151 ctx->ibuf_len-=i; 167 ctx->ibuf_len -= i;
152 num+=i; 168 num += i;
153 if (outl == i) return(num); 169 if (outl == i)
154 outl-=i; 170 return (num);
155 out+=i; 171 outl -= i;
156 } 172 out += i;
173 }
157 174
158 /* We may have done a partial read. try to do more. 175 /* We may have done a partial read. try to do more.
159 * We have nothing in the buffer. 176 * We have nothing in the buffer.
160 * If we get an error and have read some data, just return it 177 * If we get an error and have read some data, just return it
161 * and let them retry to get the error again. 178 * and let them retry to get the error again.
162 * copy direct to parent address space */ 179 * copy direct to parent address space */
163 if (outl > ctx->ibuf_size) 180 if (outl > ctx->ibuf_size) {
164 { 181 for (;;) {
165 for (;;) 182 i = BIO_read(b->next_bio, out, outl);
166 { 183 if (i <= 0) {
167 i=BIO_read(b->next_bio,out,outl);
168 if (i <= 0)
169 {
170 BIO_copy_next_retry(b); 184 BIO_copy_next_retry(b);
171 if (i < 0) return((num > 0)?num:i); 185 if (i < 0)
172 if (i == 0) return(num); 186 return ((num > 0) ? num : i);
173 } 187 if (i == 0)
174 num+=i; 188 return (num);
175 if (outl == i) return(num);
176 out+=i;
177 outl-=i;
178 } 189 }
190 num += i;
191 if (outl == i)
192 return (num);
193 out += i;
194 outl -= i;
179 } 195 }
196 }
180 /* else */ 197 /* else */
181 198
182 /* we are going to be doing some buffering */ 199 /* we are going to be doing some buffering */
183 i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); 200 i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size);
184 if (i <= 0) 201 if (i <= 0) {
185 {
186 BIO_copy_next_retry(b); 202 BIO_copy_next_retry(b);
187 if (i < 0) return((num > 0)?num:i); 203 if (i < 0)
188 if (i == 0) return(num); 204 return ((num > 0) ? num : i);
189 } 205 if (i == 0)
190 ctx->ibuf_off=0; 206 return (num);
191 ctx->ibuf_len=i; 207 }
208 ctx->ibuf_off = 0;
209 ctx->ibuf_len = i;
192 210
193 /* Lets re-read using ourselves :-) */ 211 /* Lets re-read using ourselves :-) */
194 goto start; 212 goto start;
195 } 213}
196 214
197static int buffer_write(BIO *b, const char *in, int inl) 215static int
198 { 216buffer_write(BIO *b, const char *in, int inl)
199 int i,num=0; 217{
218 int i, num = 0;
200 BIO_F_BUFFER_CTX *ctx; 219 BIO_F_BUFFER_CTX *ctx;
201 220
202 if ((in == NULL) || (inl <= 0)) return(0); 221 if ((in == NULL) || (inl <= 0))
203 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 222 return (0);
204 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 223 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
224 if ((ctx == NULL) || (b->next_bio == NULL))
225 return (0);
205 226
206 BIO_clear_retry_flags(b); 227 BIO_clear_retry_flags(b);
207start: 228start:
208 i=ctx->obuf_size-(ctx->obuf_len+ctx->obuf_off); 229 i = ctx->obuf_size - (ctx->obuf_len + ctx->obuf_off);
209 /* add to buffer and return */ 230 /* add to buffer and return */
210 if (i >= inl) 231 if (i >= inl) {
211 { 232 memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, inl);
212 memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl); 233 ctx->obuf_len += inl;
213 ctx->obuf_len+=inl; 234 return (num + inl);
214 return(num+inl); 235 }
215 }
216 /* else */ 236 /* else */
217 /* stuff already in buffer, so add to it first, then flush */ 237 /* stuff already in buffer, so add to it first, then flush */
218 if (ctx->obuf_len != 0) 238 if (ctx->obuf_len != 0) {
219 {
220 if (i > 0) /* lets fill it up if we can */ 239 if (i > 0) /* lets fill it up if we can */
221 { 240 {
222 memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i); 241 memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, i);
223 in+=i; 242 in += i;
224 inl-=i; 243 inl -= i;
225 num+=i; 244 num += i;
226 ctx->obuf_len+=i; 245 ctx->obuf_len += i;
227 } 246 }
228 /* we now have a full buffer needing flushing */ 247 /* we now have a full buffer needing flushing */
229 for (;;) 248 for (;;) {
230 { 249 i = BIO_write(b->next_bio, &(ctx->obuf[ctx->obuf_off]),
231 i=BIO_write(b->next_bio,&(ctx->obuf[ctx->obuf_off]), 250 ctx->obuf_len);
232 ctx->obuf_len); 251 if (i <= 0) {
233 if (i <= 0)
234 {
235 BIO_copy_next_retry(b); 252 BIO_copy_next_retry(b);
236 253
237 if (i < 0) return((num > 0)?num:i); 254 if (i < 0)
238 if (i == 0) return(num); 255 return ((num > 0) ? num : i);
239 } 256 if (i == 0)
240 ctx->obuf_off+=i; 257 return (num);
241 ctx->obuf_len-=i;
242 if (ctx->obuf_len == 0) break;
243 } 258 }
259 ctx->obuf_off += i;
260 ctx->obuf_len -= i;
261 if (ctx->obuf_len == 0)
262 break;
244 } 263 }
264 }
245 /* we only get here if the buffer has been flushed and we 265 /* we only get here if the buffer has been flushed and we
246 * still have stuff to write */ 266 * still have stuff to write */
247 ctx->obuf_off=0; 267 ctx->obuf_off = 0;
248 268
249 /* we now have inl bytes to write */ 269 /* we now have inl bytes to write */
250 while (inl >= ctx->obuf_size) 270 while (inl >= ctx->obuf_size) {
251 { 271 i = BIO_write(b->next_bio, in, inl);
252 i=BIO_write(b->next_bio,in,inl); 272 if (i <= 0) {
253 if (i <= 0)
254 {
255 BIO_copy_next_retry(b); 273 BIO_copy_next_retry(b);
256 if (i < 0) return((num > 0)?num:i); 274 if (i < 0)
257 if (i == 0) return(num); 275 return ((num > 0) ? num : i);
258 } 276 if (i == 0)
259 num+=i; 277 return (num);
260 in+=i;
261 inl-=i;
262 if (inl == 0) return(num);
263 } 278 }
279 num += i;
280 in += i;
281 inl -= i;
282 if (inl == 0)
283 return (num);
284 }
264 285
265 /* copy the rest into the buffer since we have only a small 286 /* copy the rest into the buffer since we have only a small
266 * amount left */ 287 * amount left */
267 goto start; 288 goto start;
268 } 289}
269 290
270static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) 291static long
271 { 292buffer_ctrl(BIO *b, int cmd, long num, void *ptr)
293{
272 BIO *dbio; 294 BIO *dbio;
273 BIO_F_BUFFER_CTX *ctx; 295 BIO_F_BUFFER_CTX *ctx;
274 long ret=1; 296 long ret = 1;
275 char *p1,*p2; 297 char *p1, *p2;
276 int r,i,*ip; 298 int r, i, *ip;
277 int ibs,obs; 299 int ibs, obs;
278 300
279 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 301 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
280 302
281 switch (cmd) 303 switch (cmd) {
282 {
283 case BIO_CTRL_RESET: 304 case BIO_CTRL_RESET:
284 ctx->ibuf_off=0; 305 ctx->ibuf_off = 0;
285 ctx->ibuf_len=0; 306 ctx->ibuf_len = 0;
286 ctx->obuf_off=0; 307 ctx->obuf_off = 0;
287 ctx->obuf_len=0; 308 ctx->obuf_len = 0;
288 if (b->next_bio == NULL) return(0); 309 if (b->next_bio == NULL)
289 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 310 return (0);
311 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
290 break; 312 break;
291 case BIO_CTRL_INFO: 313 case BIO_CTRL_INFO:
292 ret=(long)ctx->obuf_len; 314 ret = (long)ctx->obuf_len;
293 break; 315 break;
294 case BIO_C_GET_BUFF_NUM_LINES: 316 case BIO_C_GET_BUFF_NUM_LINES:
295 ret=0; 317 ret = 0;
296 p1=ctx->ibuf; 318 p1 = ctx->ibuf;
297 for (i=0; i<ctx->ibuf_len; i++) 319 for (i = 0; i < ctx->ibuf_len; i++) {
298 { 320 if (p1[ctx->ibuf_off + i] == '\n')
299 if (p1[ctx->ibuf_off + i] == '\n') ret++; 321 ret++;
300 } 322 }
301 break; 323 break;
302 case BIO_CTRL_WPENDING: 324 case BIO_CTRL_WPENDING:
303 ret=(long)ctx->obuf_len; 325 ret = (long)ctx->obuf_len;
304 if (ret == 0) 326 if (ret == 0) {
305 { 327 if (b->next_bio == NULL)
306 if (b->next_bio == NULL) return(0); 328 return (0);
307 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 329 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
308 } 330 }
309 break; 331 break;
310 case BIO_CTRL_PENDING: 332 case BIO_CTRL_PENDING:
311 ret=(long)ctx->ibuf_len; 333 ret = (long)ctx->ibuf_len;
312 if (ret == 0) 334 if (ret == 0) {
313 { 335 if (b->next_bio == NULL)
314 if (b->next_bio == NULL) return(0); 336 return (0);
315 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 337 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
316 } 338 }
317 break; 339 break;
318 case BIO_C_SET_BUFF_READ_DATA: 340 case BIO_C_SET_BUFF_READ_DATA:
319 if (num > ctx->ibuf_size) 341 if (num > ctx->ibuf_size) {
320 { 342 p1 = OPENSSL_malloc((int)num);
321 p1=OPENSSL_malloc((int)num); 343 if (p1 == NULL)
322 if (p1 == NULL) goto malloc_error; 344 goto malloc_error;
323 if (ctx->ibuf != NULL) OPENSSL_free(ctx->ibuf); 345 if (ctx->ibuf != NULL)
324 ctx->ibuf=p1; 346 OPENSSL_free(ctx->ibuf);
325 } 347 ctx->ibuf = p1;
326 ctx->ibuf_off=0; 348 }
327 ctx->ibuf_len=(int)num; 349 ctx->ibuf_off = 0;
328 memcpy(ctx->ibuf,ptr,(int)num); 350 ctx->ibuf_len = (int)num;
329 ret=1; 351 memcpy(ctx->ibuf, ptr,(int)num);
352 ret = 1;
330 break; 353 break;
331 case BIO_C_SET_BUFF_SIZE: 354 case BIO_C_SET_BUFF_SIZE:
332 if (ptr != NULL) 355 if (ptr != NULL) {
333 { 356 ip = (int *)ptr;
334 ip=(int *)ptr; 357 if (*ip == 0) {
335 if (*ip == 0) 358 ibs = (int)num;
336 { 359 obs = ctx->obuf_size;
337 ibs=(int)num;
338 obs=ctx->obuf_size;
339 }
340 else /* if (*ip == 1) */
341 {
342 ibs=ctx->ibuf_size;
343 obs=(int)num;
344 }
345 }
346 else
347 {
348 ibs=(int)num;
349 obs=(int)num;
350 } 360 }
351 p1=ctx->ibuf; 361 else /* if (*ip == 1) */
352 p2=ctx->obuf;
353 if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size))
354 { 362 {
355 p1=(char *)OPENSSL_malloc((int)num); 363 ibs = ctx->ibuf_size;
356 if (p1 == NULL) goto malloc_error; 364 obs = (int)num;
357 } 365 }
358 if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) 366 } else {
359 { 367 ibs = (int)num;
360 p2=(char *)OPENSSL_malloc((int)num); 368 obs = (int)num;
361 if (p2 == NULL) 369 }
362 { 370 p1 = ctx->ibuf;
363 if (p1 != ctx->ibuf) OPENSSL_free(p1); 371 p2 = ctx->obuf;
372 if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) {
373 p1 = (char *)OPENSSL_malloc((int)num);
374 if (p1 == NULL)
375 goto malloc_error;
376 }
377 if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) {
378 p2 = (char *)OPENSSL_malloc((int)num);
379 if (p2 == NULL) {
380 if (p1 != ctx->ibuf)
381 OPENSSL_free(p1);
364 goto malloc_error; 382 goto malloc_error;
365 }
366 } 383 }
367 if (ctx->ibuf != p1) 384 }
368 { 385 if (ctx->ibuf != p1) {
369 OPENSSL_free(ctx->ibuf); 386 OPENSSL_free(ctx->ibuf);
370 ctx->ibuf=p1; 387 ctx->ibuf = p1;
371 ctx->ibuf_off=0; 388 ctx->ibuf_off = 0;
372 ctx->ibuf_len=0; 389 ctx->ibuf_len = 0;
373 ctx->ibuf_size=ibs; 390 ctx->ibuf_size = ibs;
374 } 391 }
375 if (ctx->obuf != p2) 392 if (ctx->obuf != p2) {
376 {
377 OPENSSL_free(ctx->obuf); 393 OPENSSL_free(ctx->obuf);
378 ctx->obuf=p2; 394 ctx->obuf = p2;
379 ctx->obuf_off=0; 395 ctx->obuf_off = 0;
380 ctx->obuf_len=0; 396 ctx->obuf_len = 0;
381 ctx->obuf_size=obs; 397 ctx->obuf_size = obs;
382 } 398 }
383 break; 399 break;
384 case BIO_C_DO_STATE_MACHINE: 400 case BIO_C_DO_STATE_MACHINE:
385 if (b->next_bio == NULL) return(0); 401 if (b->next_bio == NULL)
402 return (0);
386 BIO_clear_retry_flags(b); 403 BIO_clear_retry_flags(b);
387 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 404 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
388 BIO_copy_next_retry(b); 405 BIO_copy_next_retry(b);
389 break; 406 break;
390 407
391 case BIO_CTRL_FLUSH: 408 case BIO_CTRL_FLUSH:
392 if (b->next_bio == NULL) return(0); 409 if (b->next_bio == NULL)
393 if (ctx->obuf_len <= 0) 410 return (0);
394 { 411 if (ctx->obuf_len <= 0) {
395 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 412 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
396 break; 413 break;
397 } 414 }
398 415
399 for (;;) 416 for (;;) {
400 {
401 BIO_clear_retry_flags(b); 417 BIO_clear_retry_flags(b);
402 if (ctx->obuf_len > 0) 418 if (ctx->obuf_len > 0) {
403 { 419 r = BIO_write(b->next_bio,
404 r=BIO_write(b->next_bio, 420 &(ctx->obuf[ctx->obuf_off]),
405 &(ctx->obuf[ctx->obuf_off]), 421 ctx->obuf_len);
406 ctx->obuf_len);
407#if 0 422#if 0
408fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r); 423 fprintf(stderr, "FLUSH [%3d] %3d -> %3d\n", ctx->obuf_off, ctx->obuf_len, r);
409#endif 424#endif
410 BIO_copy_next_retry(b); 425 BIO_copy_next_retry(b);
411 if (r <= 0) return((long)r); 426 if (r <= 0)
412 ctx->obuf_off+=r; 427 return ((long)r);
413 ctx->obuf_len-=r; 428 ctx->obuf_off += r;
414 } 429 ctx->obuf_len -= r;
415 else 430 } else {
416 { 431 ctx->obuf_len = 0;
417 ctx->obuf_len=0; 432 ctx->obuf_off = 0;
418 ctx->obuf_off=0; 433 ret = 1;
419 ret=1;
420 break; 434 break;
421 }
422 } 435 }
423 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 436 }
437 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
424 break; 438 break;
425 case BIO_CTRL_DUP: 439 case BIO_CTRL_DUP:
426 dbio=(BIO *)ptr; 440 dbio = (BIO *)ptr;
427 if ( !BIO_set_read_buffer_size(dbio,ctx->ibuf_size) || 441 if (!BIO_set_read_buffer_size(dbio, ctx->ibuf_size) ||
428 !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) 442 !BIO_set_write_buffer_size(dbio, ctx->obuf_size))
429 ret=0; 443 ret = 0;
430 break; 444 break;
431 default: 445 default:
432 if (b->next_bio == NULL) return(0); 446 if (b->next_bio == NULL)
433 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 447 return (0);
448 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
434 break; 449 break;
435 }
436 return(ret);
437malloc_error:
438 BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE);
439 return(0);
440 } 450 }
441 451 return (ret);
442static long buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 452malloc_error:
443 { 453 BIOerr(BIO_F_BUFFER_CTRL, ERR_R_MALLOC_FAILURE);
444 long ret=1; 454 return (0);
445 455}
446 if (b->next_bio == NULL) return(0); 456
447 switch (cmd) 457static long
448 { 458buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
459{
460 long ret = 1;
461
462 if (b->next_bio == NULL)
463 return (0);
464 switch (cmd) {
449 default: 465 default:
450 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 466 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
451 break; 467 break;
452 }
453 return(ret);
454 } 468 }
469 return (ret);
470}
455 471
456static int buffer_gets(BIO *b, char *buf, int size) 472static int
457 { 473buffer_gets(BIO *b, char *buf, int size)
474{
458 BIO_F_BUFFER_CTX *ctx; 475 BIO_F_BUFFER_CTX *ctx;
459 int num=0,i,flag; 476 int num = 0, i, flag;
460 char *p; 477 char *p;
461 478
462 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 479 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
463 size--; /* reserve space for a '\0' */ 480 size--; /* reserve space for a '\0' */
464 BIO_clear_retry_flags(b); 481 BIO_clear_retry_flags(b);
465 482
466 for (;;) 483 for (;;) {
467 { 484 if (ctx->ibuf_len > 0) {
468 if (ctx->ibuf_len > 0) 485 p = &(ctx->ibuf[ctx->ibuf_off]);
469 { 486 flag = 0;
470 p= &(ctx->ibuf[ctx->ibuf_off]); 487 for (i = 0; (i < ctx->ibuf_len) && (i < size); i++) {
471 flag=0; 488 *(buf++) = p[i];
472 for (i=0; (i<ctx->ibuf_len) && (i<size); i++) 489 if (p[i] == '\n') {
473 { 490 flag = 1;
474 *(buf++)=p[i];
475 if (p[i] == '\n')
476 {
477 flag=1;
478 i++; 491 i++;
479 break; 492 break;
480 }
481 }
482 num+=i;
483 size-=i;
484 ctx->ibuf_len-=i;
485 ctx->ibuf_off+=i;
486 if (flag || size == 0)
487 {
488 *buf='\0';
489 return(num);
490 } 493 }
491 } 494 }
495 num += i;
496 size -= i;
497 ctx->ibuf_len -= i;
498 ctx->ibuf_off += i;
499 if (flag || size == 0) {
500 *buf = '\0';
501 return (num);
502 }
503 }
492 else /* read another chunk */ 504 else /* read another chunk */
493 { 505 {
494 i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); 506 i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size);
495 if (i <= 0) 507 if (i <= 0) {
496 {
497 BIO_copy_next_retry(b); 508 BIO_copy_next_retry(b);
498 *buf='\0'; 509 *buf = '\0';
499 if (i < 0) return((num > 0)?num:i); 510 if (i < 0)
500 if (i == 0) return(num); 511 return ((num > 0) ? num : i);
501 } 512 if (i == 0)
502 ctx->ibuf_len=i; 513 return (num);
503 ctx->ibuf_off=0;
504 } 514 }
515 ctx->ibuf_len = i;
516 ctx->ibuf_off = 0;
505 } 517 }
506 } 518 }
519}
507 520
508static int buffer_puts(BIO *b, const char *str) 521static int
509 { 522buffer_puts(BIO *b, const char *str)
510 return(buffer_write(b,str,strlen(str))); 523{
511 } 524 return (buffer_write(b, str, strlen(str)));
512 525}
diff --git a/src/lib/libcrypto/bio/bf_lbuf.c b/src/lib/libcrypto/bio/bf_lbuf.c
index ec0f7eb0b7..838839f1bf 100644
--- a/src/lib/libcrypto/bio/bf_lbuf.c
+++ b/src/lib/libcrypto/bio/bf_lbuf.c
@@ -62,7 +62,7 @@
62#include <openssl/bio.h> 62#include <openssl/bio.h>
63#include <openssl/evp.h> 63#include <openssl/evp.h>
64 64
65static int linebuffer_write(BIO *h, const char *buf,int num); 65static int linebuffer_write(BIO *h, const char *buf, int num);
66static int linebuffer_read(BIO *h, char *buf, int size); 66static int linebuffer_read(BIO *h, char *buf, int size);
67static int linebuffer_puts(BIO *h, const char *str); 67static int linebuffer_puts(BIO *h, const char *str);
68static int linebuffer_gets(BIO *h, char *str, int size); 68static int linebuffer_gets(BIO *h, char *str, int size);
@@ -76,8 +76,7 @@ static long linebuffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
76 76
77/* #define DEBUG */ 77/* #define DEBUG */
78 78
79static BIO_METHOD methods_linebuffer= 79static BIO_METHOD methods_linebuffer = {
80 {
81 BIO_TYPE_LINEBUFFER, 80 BIO_TYPE_LINEBUFFER,
82 "linebuffer", 81 "linebuffer",
83 linebuffer_write, 82 linebuffer_write,
@@ -88,310 +87,313 @@ static BIO_METHOD methods_linebuffer=
88 linebuffer_new, 87 linebuffer_new,
89 linebuffer_free, 88 linebuffer_free,
90 linebuffer_callback_ctrl, 89 linebuffer_callback_ctrl,
91 }; 90};
92 91
93BIO_METHOD *BIO_f_linebuffer(void) 92BIO_METHOD
94 { 93*BIO_f_linebuffer(void)
95 return(&methods_linebuffer); 94{
96 } 95 return (&methods_linebuffer);
96}
97 97
98typedef struct bio_linebuffer_ctx_struct 98typedef struct bio_linebuffer_ctx_struct {
99 {
100 char *obuf; /* the output char array */ 99 char *obuf; /* the output char array */
101 int obuf_size; /* how big is the output buffer */ 100 int obuf_size; /* how big is the output buffer */
102 int obuf_len; /* how many bytes are in it */ 101 int obuf_len; /* how many bytes are in it */
103 } BIO_LINEBUFFER_CTX; 102} BIO_LINEBUFFER_CTX;
104 103
105static int linebuffer_new(BIO *bi) 104static int
106 { 105linebuffer_new(BIO *bi)
106{
107 BIO_LINEBUFFER_CTX *ctx; 107 BIO_LINEBUFFER_CTX *ctx;
108 108
109 ctx=(BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); 109 ctx = (BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX));
110 if (ctx == NULL) return(0); 110 if (ctx == NULL)
111 ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); 111 return (0);
112 if (ctx->obuf == NULL) { OPENSSL_free(ctx); return(0); } 112 ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE);
113 ctx->obuf_size=DEFAULT_LINEBUFFER_SIZE; 113 if (ctx->obuf == NULL) {
114 ctx->obuf_len=0; 114 OPENSSL_free(ctx);
115 115 return (0);
116 bi->init=1;
117 bi->ptr=(char *)ctx;
118 bi->flags=0;
119 return(1);
120 } 116 }
117 ctx->obuf_size = DEFAULT_LINEBUFFER_SIZE;
118 ctx->obuf_len = 0;
119
120 bi->init = 1;
121 bi->ptr = (char *)ctx;
122 bi->flags = 0;
123 return (1);
124}
121 125
122static int linebuffer_free(BIO *a) 126static int
123 { 127linebuffer_free(BIO *a)
128{
124 BIO_LINEBUFFER_CTX *b; 129 BIO_LINEBUFFER_CTX *b;
125 130
126 if (a == NULL) return(0); 131 if (a == NULL)
127 b=(BIO_LINEBUFFER_CTX *)a->ptr; 132 return (0);
128 if (b->obuf != NULL) OPENSSL_free(b->obuf); 133 b = (BIO_LINEBUFFER_CTX *)a->ptr;
134 if (b->obuf != NULL)
135 OPENSSL_free(b->obuf);
129 OPENSSL_free(a->ptr); 136 OPENSSL_free(a->ptr);
130 a->ptr=NULL; 137 a->ptr = NULL;
131 a->init=0; 138 a->init = 0;
132 a->flags=0; 139 a->flags = 0;
133 return(1); 140 return (1);
134 } 141}
135 142
136static int linebuffer_read(BIO *b, char *out, int outl) 143static int
137 { 144linebuffer_read(BIO *b, char *out, int outl)
138 int ret=0; 145{
139 146 int ret = 0;
140 if (out == NULL) return(0); 147
141 if (b->next_bio == NULL) return(0); 148 if (out == NULL)
142 ret=BIO_read(b->next_bio,out,outl); 149 return (0);
150 if (b->next_bio == NULL)
151 return (0);
152 ret = BIO_read(b->next_bio, out, outl);
143 BIO_clear_retry_flags(b); 153 BIO_clear_retry_flags(b);
144 BIO_copy_next_retry(b); 154 BIO_copy_next_retry(b);
145 return(ret); 155 return (ret);
146 } 156}
147 157
148static int linebuffer_write(BIO *b, const char *in, int inl) 158static int
149 { 159linebuffer_write(BIO *b, const char *in, int inl)
150 int i,num=0,foundnl; 160{
161 int i, num = 0, foundnl;
151 BIO_LINEBUFFER_CTX *ctx; 162 BIO_LINEBUFFER_CTX *ctx;
152 163
153 if ((in == NULL) || (inl <= 0)) return(0); 164 if ((in == NULL) || (inl <= 0))
154 ctx=(BIO_LINEBUFFER_CTX *)b->ptr; 165 return (0);
155 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 166 ctx = (BIO_LINEBUFFER_CTX *)b->ptr;
167 if ((ctx == NULL) || (b->next_bio == NULL))
168 return (0);
156 169
157 BIO_clear_retry_flags(b); 170 BIO_clear_retry_flags(b);
158 171
159 do 172 do {
160 {
161 const char *p; 173 const char *p;
162 174
163 for(p = in; p < in + inl && *p != '\n'; p++) 175 for (p = in; p < in + inl && *p != '\n'; p++)
164 ; 176 ;
165 if (*p == '\n') 177 if (*p == '\n') {
166 {
167 p++; 178 p++;
168 foundnl = 1; 179 foundnl = 1;
169 } 180 } else
170 else
171 foundnl = 0; 181 foundnl = 0;
172 182
173 /* If a NL was found and we already have text in the save 183 /* If a NL was found and we already have text in the save
174 buffer, concatenate them and write */ 184 buffer, concatenate them and write */
175 while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) 185 while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) &&
176 && ctx->obuf_len > 0) 186 ctx->obuf_len > 0) {
177 {
178 int orig_olen = ctx->obuf_len; 187 int orig_olen = ctx->obuf_len;
179 188
180 i = ctx->obuf_size - ctx->obuf_len; 189 i = ctx->obuf_size - ctx->obuf_len;
181 if (p - in > 0) 190 if (p - in > 0) {
182 { 191 if (i >= p - in) {
183 if (i >= p - in)
184 {
185 memcpy(&(ctx->obuf[ctx->obuf_len]), 192 memcpy(&(ctx->obuf[ctx->obuf_len]),
186 in,p - in); 193 in, p - in);
187 ctx->obuf_len += p - in; 194 ctx->obuf_len += p - in;
188 inl -= p - in; 195 inl -= p - in;
189 num += p - in; 196 num += p - in;
190 in = p; 197 in = p;
191 } 198 } else {
192 else
193 {
194 memcpy(&(ctx->obuf[ctx->obuf_len]), 199 memcpy(&(ctx->obuf[ctx->obuf_len]),
195 in,i); 200 in, i);
196 ctx->obuf_len += i; 201 ctx->obuf_len += i;
197 inl -= i; 202 inl -= i;
198 in += i; 203 in += i;
199 num += i; 204 num += i;
200 }
201 } 205 }
206 }
202 207
203#if 0 208#if 0
204BIO_write(b->next_bio, "<*<", 3); 209 BIO_write(b->next_bio, "<*<", 3);
205#endif 210#endif
206 i=BIO_write(b->next_bio, 211 i = BIO_write(b->next_bio, ctx->obuf, ctx->obuf_len);
207 ctx->obuf, ctx->obuf_len); 212 if (i <= 0) {
208 if (i <= 0)
209 {
210 ctx->obuf_len = orig_olen; 213 ctx->obuf_len = orig_olen;
211 BIO_copy_next_retry(b); 214 BIO_copy_next_retry(b);
212
213#if 0 215#if 0
214BIO_write(b->next_bio, ">*>", 3); 216 BIO_write(b->next_bio, ">*>", 3);
215#endif 217#endif
216 if (i < 0) return((num > 0)?num:i); 218 if (i < 0)
217 if (i == 0) return(num); 219 return ((num > 0) ? num : i);
218 } 220 if (i == 0)
221 return (num);
222 }
219#if 0 223#if 0
220BIO_write(b->next_bio, ">*>", 3); 224 BIO_write(b->next_bio, ">*>", 3);
221#endif 225#endif
222 if (i < ctx->obuf_len) 226 if (i < ctx->obuf_len)
223 memmove(ctx->obuf, ctx->obuf + i, 227 memmove(ctx->obuf, ctx->obuf + i,
224 ctx->obuf_len - i); 228 ctx->obuf_len - i);
225 ctx->obuf_len-=i; 229 ctx->obuf_len -= i;
226 } 230 }
227 231
228 /* Now that the save buffer is emptied, let's write the input 232 /* Now that the save buffer is emptied, let's write the input
229 buffer if a NL was found and there is anything to write. */ 233 buffer if a NL was found and there is anything to write. */
230 if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) 234 if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) {
231 {
232#if 0 235#if 0
233BIO_write(b->next_bio, "<*<", 3); 236 BIO_write(b->next_bio, "<*<", 3);
234#endif 237#endif
235 i=BIO_write(b->next_bio,in,p - in); 238 i = BIO_write(b->next_bio, in, p - in);
236 if (i <= 0) 239 if (i <= 0) {
237 {
238 BIO_copy_next_retry(b); 240 BIO_copy_next_retry(b);
239#if 0 241#if 0
240BIO_write(b->next_bio, ">*>", 3); 242 BIO_write(b->next_bio, ">*>", 3);
241#endif 243#endif
242 if (i < 0) return((num > 0)?num:i); 244 if (i < 0)
243 if (i == 0) return(num); 245 return ((num > 0) ? num : i);
244 } 246 if (i == 0)
247 return (num);
248 }
245#if 0 249#if 0
246BIO_write(b->next_bio, ">*>", 3); 250 BIO_write(b->next_bio, ">*>", 3);
247#endif 251#endif
248 num+=i; 252 num += i;
249 in+=i; 253 in += i;
250 inl-=i; 254 inl -= i;
251 }
252 } 255 }
253 while(foundnl && inl > 0); 256 } while (foundnl && inl > 0);
254 /* We've written as much as we can. The rest of the input buffer, if 257 /* We've written as much as we can. The rest of the input buffer, if
255 any, is text that doesn't and with a NL and therefore needs to be 258 any, is text that doesn't and with a NL and therefore needs to be
256 saved for the next trip. */ 259 saved for the next trip. */
257 if (inl > 0) 260 if (inl > 0) {
258 {
259 memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); 261 memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl);
260 ctx->obuf_len += inl; 262 ctx->obuf_len += inl;
261 num += inl; 263 num += inl;
262 }
263 return num;
264 } 264 }
265 return num;
266}
265 267
266static long linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) 268static long
267 { 269linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr)
270{
268 BIO *dbio; 271 BIO *dbio;
269 BIO_LINEBUFFER_CTX *ctx; 272 BIO_LINEBUFFER_CTX *ctx;
270 long ret=1; 273 long ret = 1;
271 char *p; 274 char *p;
272 int r; 275 int r;
273 int obs; 276 int obs;
274 277
275 ctx=(BIO_LINEBUFFER_CTX *)b->ptr; 278 ctx = (BIO_LINEBUFFER_CTX *)b->ptr;
276 279
277 switch (cmd) 280 switch (cmd) {
278 {
279 case BIO_CTRL_RESET: 281 case BIO_CTRL_RESET:
280 ctx->obuf_len=0; 282 ctx->obuf_len = 0;
281 if (b->next_bio == NULL) return(0); 283 if (b->next_bio == NULL)
282 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 284 return (0);
285 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
283 break; 286 break;
284 case BIO_CTRL_INFO: 287 case BIO_CTRL_INFO:
285 ret=(long)ctx->obuf_len; 288 ret = (long)ctx->obuf_len;
286 break; 289 break;
287 case BIO_CTRL_WPENDING: 290 case BIO_CTRL_WPENDING:
288 ret=(long)ctx->obuf_len; 291 ret = (long)ctx->obuf_len;
289 if (ret == 0) 292 if (ret == 0) {
290 { 293 if (b->next_bio == NULL)
291 if (b->next_bio == NULL) return(0); 294 return (0);
292 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 295 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
293 } 296 }
294 break; 297 break;
295 case BIO_C_SET_BUFF_SIZE: 298 case BIO_C_SET_BUFF_SIZE:
296 obs=(int)num; 299 obs = (int)num;
297 p=ctx->obuf; 300 p = ctx->obuf;
298 if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) 301 if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) {
299 { 302 p = (char *)OPENSSL_malloc((int)num);
300 p=(char *)OPENSSL_malloc((int)num);
301 if (p == NULL) 303 if (p == NULL)
302 goto malloc_error; 304 goto malloc_error;
303 } 305 }
304 if (ctx->obuf != p) 306 if (ctx->obuf != p) {
305 { 307 if (ctx->obuf_len > obs) {
306 if (ctx->obuf_len > obs)
307 {
308 ctx->obuf_len = obs; 308 ctx->obuf_len = obs;
309 } 309 }
310 memcpy(p, ctx->obuf, ctx->obuf_len); 310 memcpy(p, ctx->obuf, ctx->obuf_len);
311 OPENSSL_free(ctx->obuf); 311 OPENSSL_free(ctx->obuf);
312 ctx->obuf=p; 312 ctx->obuf = p;
313 ctx->obuf_size=obs; 313 ctx->obuf_size = obs;
314 } 314 }
315 break; 315 break;
316 case BIO_C_DO_STATE_MACHINE: 316 case BIO_C_DO_STATE_MACHINE:
317 if (b->next_bio == NULL) return(0); 317 if (b->next_bio == NULL)
318 return (0);
318 BIO_clear_retry_flags(b); 319 BIO_clear_retry_flags(b);
319 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 320 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
320 BIO_copy_next_retry(b); 321 BIO_copy_next_retry(b);
321 break; 322 break;
322 323
323 case BIO_CTRL_FLUSH: 324 case BIO_CTRL_FLUSH:
324 if (b->next_bio == NULL) return(0); 325 if (b->next_bio == NULL)
325 if (ctx->obuf_len <= 0) 326 return (0);
326 { 327 if (ctx->obuf_len <= 0) {
327 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 328 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
328 break; 329 break;
329 } 330 }
330 331
331 for (;;) 332 for (;;) {
332 {
333 BIO_clear_retry_flags(b); 333 BIO_clear_retry_flags(b);
334 if (ctx->obuf_len > 0) 334 if (ctx->obuf_len > 0) {
335 { 335 r = BIO_write(b->next_bio,
336 r=BIO_write(b->next_bio, 336 ctx->obuf, ctx->obuf_len);
337 ctx->obuf, ctx->obuf_len);
338#if 0 337#if 0
339fprintf(stderr,"FLUSH %3d -> %3d\n",ctx->obuf_len,r); 338 fprintf(stderr, "FLUSH %3d -> %3d\n", ctx->obuf_len, r);
340#endif 339#endif
341 BIO_copy_next_retry(b); 340 BIO_copy_next_retry(b);
342 if (r <= 0) return((long)r); 341 if (r <= 0)
342 return ((long)r);
343 if (r < ctx->obuf_len) 343 if (r < ctx->obuf_len)
344 memmove(ctx->obuf, ctx->obuf + r, 344 memmove(ctx->obuf, ctx->obuf + r,
345 ctx->obuf_len - r); 345 ctx->obuf_len - r);
346 ctx->obuf_len-=r; 346 ctx->obuf_len -= r;
347 } 347 } else {
348 else 348 ctx->obuf_len = 0;
349 { 349 ret = 1;
350 ctx->obuf_len=0;
351 ret=1;
352 break; 350 break;
353 }
354 } 351 }
355 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 352 }
353 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
356 break; 354 break;
357 case BIO_CTRL_DUP: 355 case BIO_CTRL_DUP:
358 dbio=(BIO *)ptr; 356 dbio = (BIO *)ptr;
359 if ( !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) 357 if (!BIO_set_write_buffer_size(dbio, ctx->obuf_size))
360 ret=0; 358 ret = 0;
361 break; 359 break;
362 default: 360 default:
363 if (b->next_bio == NULL) return(0); 361 if (b->next_bio == NULL)
364 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 362 return (0);
363 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
365 break; 364 break;
366 }
367 return(ret);
368malloc_error:
369 BIOerr(BIO_F_LINEBUFFER_CTRL,ERR_R_MALLOC_FAILURE);
370 return(0);
371 } 365 }
366 return (ret);
367malloc_error:
368 BIOerr(BIO_F_LINEBUFFER_CTRL, ERR_R_MALLOC_FAILURE);
369 return (0);
370}
372 371
373static long linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 372static long
374 { 373linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
375 long ret=1; 374{
375 long ret = 1;
376 376
377 if (b->next_bio == NULL) return(0); 377 if (b->next_bio == NULL)
378 switch (cmd) 378 return (0);
379 { 379 switch (cmd) {
380 default: 380 default:
381 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 381 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
382 break; 382 break;
383 }
384 return(ret);
385 } 383 }
384 return (ret);
385}
386 386
387static int linebuffer_gets(BIO *b, char *buf, int size) 387static int
388 { 388linebuffer_gets(BIO *b, char *buf, int size)
389 if (b->next_bio == NULL) return(0); 389{
390 return(BIO_gets(b->next_bio,buf,size)); 390 if (b->next_bio == NULL)
391 } 391 return (0);
392 392 return (BIO_gets(b->next_bio, buf, size));
393static int linebuffer_puts(BIO *b, const char *str) 393}
394 {
395 return(linebuffer_write(b,str,strlen(str)));
396 }
397 394
395static int
396linebuffer_puts(BIO *b, const char *str)
397{
398 return (linebuffer_write(b, str, strlen(str)));
399}
diff --git a/src/lib/libcrypto/bio/bf_nbio.c b/src/lib/libcrypto/bio/bf_nbio.c
index 028616c064..76f8f31950 100644
--- a/src/lib/libcrypto/bio/bf_nbio.c
+++ b/src/lib/libcrypto/bio/bf_nbio.c
@@ -65,23 +65,22 @@
65/* BIO_put and BIO_get both add to the digest, 65/* BIO_put and BIO_get both add to the digest,
66 * BIO_gets returns the digest */ 66 * BIO_gets returns the digest */
67 67
68static int nbiof_write(BIO *h,const char *buf,int num); 68static int nbiof_write(BIO *h, const char *buf, int num);
69static int nbiof_read(BIO *h,char *buf,int size); 69static int nbiof_read(BIO *h, char *buf, int size);
70static int nbiof_puts(BIO *h,const char *str); 70static int nbiof_puts(BIO *h, const char *str);
71static int nbiof_gets(BIO *h,char *str,int size); 71static int nbiof_gets(BIO *h, char *str, int size);
72static long nbiof_ctrl(BIO *h,int cmd,long arg1,void *arg2); 72static long nbiof_ctrl(BIO *h, int cmd, long arg1, void *arg2);
73static int nbiof_new(BIO *h); 73static int nbiof_new(BIO *h);
74static int nbiof_free(BIO *data); 74static int nbiof_free(BIO *data);
75static long nbiof_callback_ctrl(BIO *h,int cmd,bio_info_cb *fp); 75static long nbiof_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
76typedef struct nbio_test_st 76
77 { 77typedef struct nbio_test_st {
78 /* only set if we sent a 'should retry' error */ 78 /* only set if we sent a 'should retry' error */
79 int lrn; 79 int lrn;
80 int lwn; 80 int lwn;
81 } NBIO_TEST; 81} NBIO_TEST;
82 82
83static BIO_METHOD methods_nbiof= 83static BIO_METHOD methods_nbiof = {
84 {
85 BIO_TYPE_NBIO_TEST, 84 BIO_TYPE_NBIO_TEST,
86 "non-blocking IO test filter", 85 "non-blocking IO test filter",
87 nbiof_write, 86 nbiof_write,
@@ -92,162 +91,170 @@ static BIO_METHOD methods_nbiof=
92 nbiof_new, 91 nbiof_new,
93 nbiof_free, 92 nbiof_free,
94 nbiof_callback_ctrl, 93 nbiof_callback_ctrl,
95 }; 94};
96 95
97BIO_METHOD *BIO_f_nbio_test(void) 96BIO_METHOD
98 { 97*BIO_f_nbio_test(void)
99 return(&methods_nbiof); 98{
100 } 99 return (&methods_nbiof);
100}
101 101
102static int nbiof_new(BIO *bi) 102static int
103 { 103nbiof_new(BIO *bi)
104{
104 NBIO_TEST *nt; 105 NBIO_TEST *nt;
105 106
106 if (!(nt=(NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) return(0); 107 if (!(nt = (NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST))))
107 nt->lrn= -1; 108 return (0);
108 nt->lwn= -1; 109 nt->lrn = -1;
109 bi->ptr=(char *)nt; 110 nt->lwn = -1;
110 bi->init=1; 111 bi->ptr = (char *)nt;
111 bi->flags=0; 112 bi->init = 1;
112 return(1); 113 bi->flags = 0;
113 } 114 return (1);
115}
114 116
115static int nbiof_free(BIO *a) 117static int
116 { 118nbiof_free(BIO *a)
117 if (a == NULL) return(0); 119{
120 if (a == NULL)
121 return (0);
118 if (a->ptr != NULL) 122 if (a->ptr != NULL)
119 OPENSSL_free(a->ptr); 123 OPENSSL_free(a->ptr);
120 a->ptr=NULL; 124 a->ptr = NULL;
121 a->init=0; 125 a->init = 0;
122 a->flags=0; 126 a->flags = 0;
123 return(1); 127 return (1);
124 } 128}
125 129
126static int nbiof_read(BIO *b, char *out, int outl) 130static int
127 { 131nbiof_read(BIO *b, char *out, int outl)
128 int ret=0; 132{
133 int ret = 0;
129#if 1 134#if 1
130 int num; 135 int num;
131 unsigned char n; 136 unsigned char n;
132#endif 137#endif
133 138
134 if (out == NULL) return(0); 139 if (out == NULL)
135 if (b->next_bio == NULL) return(0); 140 return (0);
141 if (b->next_bio == NULL)
142 return (0);
136 143
137 BIO_clear_retry_flags(b); 144 BIO_clear_retry_flags(b);
138#if 1 145#if 1
139 RAND_pseudo_bytes(&n,1); 146 RAND_pseudo_bytes(&n, 1);
140 num=(n&0x07); 147 num = (n & 0x07);
141 148
142 if (outl > num) outl=num; 149 if (outl > num)
150 outl = num;
143 151
144 if (num == 0) 152 if (num == 0) {
145 { 153 ret = -1;
146 ret= -1;
147 BIO_set_retry_read(b); 154 BIO_set_retry_read(b);
148 } 155 } else
149 else
150#endif 156#endif
151 { 157 {
152 ret=BIO_read(b->next_bio,out,outl); 158 ret = BIO_read(b->next_bio, out, outl);
153 if (ret < 0) 159 if (ret < 0)
154 BIO_copy_next_retry(b); 160 BIO_copy_next_retry(b);
155 }
156 return(ret);
157 } 161 }
162 return (ret);
163}
158 164
159static int nbiof_write(BIO *b, const char *in, int inl) 165static int
160 { 166nbiof_write(BIO *b, const char *in, int inl)
167{
161 NBIO_TEST *nt; 168 NBIO_TEST *nt;
162 int ret=0; 169 int ret = 0;
163 int num; 170 int num;
164 unsigned char n; 171 unsigned char n;
165 172
166 if ((in == NULL) || (inl <= 0)) return(0); 173 if ((in == NULL) || (inl <= 0))
167 if (b->next_bio == NULL) return(0); 174 return (0);
168 nt=(NBIO_TEST *)b->ptr; 175 if (b->next_bio == NULL)
176 return (0);
177 nt = (NBIO_TEST *)b->ptr;
169 178
170 BIO_clear_retry_flags(b); 179 BIO_clear_retry_flags(b);
171 180
172#if 1 181#if 1
173 if (nt->lwn > 0) 182 if (nt->lwn > 0) {
174 { 183 num = nt->lwn;
175 num=nt->lwn; 184 nt->lwn = 0;
176 nt->lwn=0; 185 } else {
177 } 186 RAND_pseudo_bytes(&n, 1);
178 else 187 num = (n&7);
179 { 188 }
180 RAND_pseudo_bytes(&n,1);
181 num=(n&7);
182 }
183 189
184 if (inl > num) inl=num; 190 if (inl > num)
191 inl = num;
185 192
186 if (num == 0) 193 if (num == 0) {
187 { 194 ret = -1;
188 ret= -1;
189 BIO_set_retry_write(b); 195 BIO_set_retry_write(b);
190 } 196 } else
191 else
192#endif 197#endif
193 { 198 {
194 ret=BIO_write(b->next_bio,in,inl); 199 ret = BIO_write(b->next_bio, in, inl);
195 if (ret < 0) 200 if (ret < 0) {
196 {
197 BIO_copy_next_retry(b); 201 BIO_copy_next_retry(b);
198 nt->lwn=inl; 202 nt->lwn = inl;
199 }
200 } 203 }
201 return(ret);
202 } 204 }
205 return (ret);
206}
203 207
204static long nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) 208static long
205 { 209nbiof_ctrl(BIO *b, int cmd, long num, void *ptr)
210{
206 long ret; 211 long ret;
207 212
208 if (b->next_bio == NULL) return(0); 213 if (b->next_bio == NULL)
209 switch (cmd) 214 return (0);
210 { 215 switch (cmd) {
211 case BIO_C_DO_STATE_MACHINE: 216 case BIO_C_DO_STATE_MACHINE:
212 BIO_clear_retry_flags(b); 217 BIO_clear_retry_flags(b);
213 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 218 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
214 BIO_copy_next_retry(b); 219 BIO_copy_next_retry(b);
215 break; 220 break;
216 case BIO_CTRL_DUP: 221 case BIO_CTRL_DUP:
217 ret=0L; 222 ret = 0L;
218 break; 223 break;
219 default: 224 default:
220 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 225 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
221 break; 226 break;
222 }
223 return(ret);
224 } 227 }
228 return (ret);
229}
225 230
226static long nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 231static long
227 { 232nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
228 long ret=1; 233{
234 long ret = 1;
229 235
230 if (b->next_bio == NULL) return(0); 236 if (b->next_bio == NULL)
231 switch (cmd) 237 return (0);
232 { 238 switch (cmd) {
233 default: 239 default:
234 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 240 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
235 break; 241 break;
236 }
237 return(ret);
238 }
239
240static int nbiof_gets(BIO *bp, char *buf, int size)
241 {
242 if (bp->next_bio == NULL) return(0);
243 return(BIO_gets(bp->next_bio,buf,size));
244 }
245
246
247static int nbiof_puts(BIO *bp, const char *str)
248 {
249 if (bp->next_bio == NULL) return(0);
250 return(BIO_puts(bp->next_bio,str));
251 } 242 }
243 return (ret);
244}
252 245
246static int
247nbiof_gets(BIO *bp, char *buf, int size)
248{
249 if (bp->next_bio == NULL)
250 return (0);
251 return (BIO_gets(bp->next_bio, buf, size));
252}
253 253
254static int
255nbiof_puts(BIO *bp, const char *str)
256{
257 if (bp->next_bio == NULL)
258 return (0);
259 return (BIO_puts(bp->next_bio, str));
260}
diff --git a/src/lib/libcrypto/bio/bf_null.c b/src/lib/libcrypto/bio/bf_null.c
index c1bf39a904..354731c0c7 100644
--- a/src/lib/libcrypto/bio/bf_null.c
+++ b/src/lib/libcrypto/bio/bf_null.c
@@ -72,8 +72,8 @@ static long nullf_ctrl(BIO *h, int cmd, long arg1, void *arg2);
72static int nullf_new(BIO *h); 72static int nullf_new(BIO *h);
73static int nullf_free(BIO *data); 73static int nullf_free(BIO *data);
74static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); 74static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
75static BIO_METHOD methods_nullf= 75
76 { 76static BIO_METHOD methods_nullf = {
77 BIO_TYPE_NULL_FILTER, 77 BIO_TYPE_NULL_FILTER,
78 "NULL filter", 78 "NULL filter",
79 nullf_write, 79 nullf_write,
@@ -84,100 +84,113 @@ static BIO_METHOD methods_nullf=
84 nullf_new, 84 nullf_new,
85 nullf_free, 85 nullf_free,
86 nullf_callback_ctrl, 86 nullf_callback_ctrl,
87 }; 87};
88 88
89BIO_METHOD *BIO_f_null(void) 89BIO_METHOD
90 { 90*BIO_f_null(void)
91 return(&methods_nullf); 91{
92 } 92 return (&methods_nullf);
93 93}
94static int nullf_new(BIO *bi) 94
95 { 95static int
96 bi->init=1; 96nullf_new(BIO *bi)
97 bi->ptr=NULL; 97{
98 bi->flags=0; 98 bi->init = 1;
99 return(1); 99 bi->ptr = NULL;
100 } 100 bi->flags = 0;
101 101 return (1);
102static int nullf_free(BIO *a) 102}
103 { 103
104 if (a == NULL) return(0); 104static int
105nullf_free(BIO *a)
106{
107 if (a == NULL)
108 return (0);
105/* a->ptr=NULL; 109/* a->ptr=NULL;
106 a->init=0; 110 a->init=0;
107 a->flags=0;*/ 111 a->flags=0;*/
108 return(1); 112 return (1);
109 } 113}
110 114
111static int nullf_read(BIO *b, char *out, int outl) 115static int
112 { 116nullf_read(BIO *b, char *out, int outl)
113 int ret=0; 117{
114 118 int ret = 0;
115 if (out == NULL) return(0); 119
116 if (b->next_bio == NULL) return(0); 120 if (out == NULL)
117 ret=BIO_read(b->next_bio,out,outl); 121 return (0);
122 if (b->next_bio == NULL)
123 return (0);
124 ret = BIO_read(b->next_bio, out, outl);
118 BIO_clear_retry_flags(b); 125 BIO_clear_retry_flags(b);
119 BIO_copy_next_retry(b); 126 BIO_copy_next_retry(b);
120 return(ret); 127 return (ret);
121 } 128}
122 129
123static int nullf_write(BIO *b, const char *in, int inl) 130static int
124 { 131nullf_write(BIO *b, const char *in, int inl)
125 int ret=0; 132{
126 133 int ret = 0;
127 if ((in == NULL) || (inl <= 0)) return(0); 134
128 if (b->next_bio == NULL) return(0); 135 if ((in == NULL) || (inl <= 0))
129 ret=BIO_write(b->next_bio,in,inl); 136 return (0);
137 if (b->next_bio == NULL)
138 return (0);
139 ret = BIO_write(b->next_bio, in, inl);
130 BIO_clear_retry_flags(b); 140 BIO_clear_retry_flags(b);
131 BIO_copy_next_retry(b); 141 BIO_copy_next_retry(b);
132 return(ret); 142 return (ret);
133 } 143}
134 144
135static long nullf_ctrl(BIO *b, int cmd, long num, void *ptr) 145static long
136 { 146nullf_ctrl(BIO *b, int cmd, long num, void *ptr)
147{
137 long ret; 148 long ret;
138 149
139 if (b->next_bio == NULL) return(0); 150 if (b->next_bio == NULL)
140 switch(cmd) 151 return (0);
141 { 152 switch (cmd) {
142 case BIO_C_DO_STATE_MACHINE: 153 case BIO_C_DO_STATE_MACHINE:
143 BIO_clear_retry_flags(b); 154 BIO_clear_retry_flags(b);
144 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 155 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
145 BIO_copy_next_retry(b); 156 BIO_copy_next_retry(b);
146 break; 157 break;
147 case BIO_CTRL_DUP: 158 case BIO_CTRL_DUP:
148 ret=0L; 159 ret = 0L;
149 break; 160 break;
150 default: 161 default:
151 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 162 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
152 }
153 return(ret);
154 } 163 }
164 return (ret);
165}
155 166
156static long nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 167static long
157 { 168nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
158 long ret=1; 169{
170 long ret = 1;
159 171
160 if (b->next_bio == NULL) return(0); 172 if (b->next_bio == NULL)
161 switch (cmd) 173 return (0);
162 { 174 switch (cmd) {
163 default: 175 default:
164 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 176 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
165 break; 177 break;
166 }
167 return(ret);
168 } 178 }
169 179 return (ret);
170static int nullf_gets(BIO *bp, char *buf, int size) 180}
171 { 181
172 if (bp->next_bio == NULL) return(0); 182static int
173 return(BIO_gets(bp->next_bio,buf,size)); 183nullf_gets(BIO *bp, char *buf, int size)
174 } 184{
175 185 if (bp->next_bio == NULL)
176 186 return (0);
177static int nullf_puts(BIO *bp, const char *str) 187 return (BIO_gets(bp->next_bio, buf, size));
178 { 188}
179 if (bp->next_bio == NULL) return(0); 189
180 return(BIO_puts(bp->next_bio,str)); 190static int
181 } 191nullf_puts(BIO *bp, const char *str)
182 192{
183 193 if (bp->next_bio == NULL)
194 return (0);
195 return (BIO_puts(bp->next_bio, str));
196}
diff --git a/src/lib/libcrypto/bio/bio.h b/src/lib/libcrypto/bio/bio.h
index 05699ab212..4f1d02ada5 100644
--- a/src/lib/libcrypto/bio/bio.h
+++ b/src/lib/libcrypto/bio/bio.h
@@ -151,7 +151,7 @@ extern "C" {
151 151
152#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ 152#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */
153#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ 153#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */
154 154
155/* #ifdef IP_MTU_DISCOVER */ 155/* #ifdef IP_MTU_DISCOVER */
156#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ 156#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */
157/* #endif */ 157/* #endif */
@@ -282,9 +282,10 @@ void BIO_clear_flags(BIO *b, int flags);
282#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) 282#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN))
283#define BIO_cb_post(a) ((a)&BIO_CB_RETURN) 283#define BIO_cb_post(a) ((a)&BIO_CB_RETURN)
284 284
285long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long); 285long (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *,
286void BIO_set_callback(BIO *b, 286 int, long, long);
287 long (*callback)(struct bio_st *,int,const char *,int, long,long)); 287void BIO_set_callback(BIO *b,
288 long (*callback)(struct bio_st *, int, const char *, int, long, long));
288char *BIO_get_callback_arg(const BIO *b); 289char *BIO_get_callback_arg(const BIO *b);
289void BIO_set_callback_arg(BIO *b, char *arg); 290void BIO_set_callback_arg(BIO *b, char *arg);
290 291
@@ -293,8 +294,7 @@ int BIO_method_type(const BIO *b);
293 294
294typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); 295typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long);
295 296
296typedef struct bio_method_st 297typedef struct bio_method_st {
297 {
298 int type; 298 int type;
299 const char *name; 299 const char *name;
300 int (*bwrite)(BIO *, const char *, int); 300 int (*bwrite)(BIO *, const char *, int);
@@ -304,14 +304,13 @@ typedef struct bio_method_st
304 long (*ctrl)(BIO *, int, long, void *); 304 long (*ctrl)(BIO *, int, long, void *);
305 int (*create)(BIO *); 305 int (*create)(BIO *);
306 int (*destroy)(BIO *); 306 int (*destroy)(BIO *);
307 long (*callback_ctrl)(BIO *, int, bio_info_cb *); 307 long (*callback_ctrl)(BIO *, int, bio_info_cb *);
308 } BIO_METHOD; 308} BIO_METHOD;
309 309
310struct bio_st 310struct bio_st {
311 {
312 BIO_METHOD *method; 311 BIO_METHOD *method;
313 /* bio, mode, argp, argi, argl, ret */ 312 /* bio, mode, argp, argi, argl, ret */
314 long (*callback)(struct bio_st *,int,const char *,int, long,long); 313 long (*callback)(struct bio_st *, int, const char *, int, long, long);
315 char *cb_arg; /* first argument for the callback */ 314 char *cb_arg; /* first argument for the callback */
316 315
317 int init; 316 int init;
@@ -327,12 +326,11 @@ struct bio_st
327 unsigned long num_write; 326 unsigned long num_write;
328 327
329 CRYPTO_EX_DATA ex_data; 328 CRYPTO_EX_DATA ex_data;
330 }; 329};
331 330
332DECLARE_STACK_OF(BIO) 331DECLARE_STACK_OF(BIO)
333 332
334typedef struct bio_f_buffer_ctx_struct 333typedef struct bio_f_buffer_ctx_struct {
335 {
336 /* Buffers are setup like this: 334 /* Buffers are setup like this:
337 * 335 *
338 * <---------------------- size -----------------------> 336 * <---------------------- size ----------------------->
@@ -346,30 +344,28 @@ typedef struct bio_f_buffer_ctx_struct
346 int ibuf_size; /* how big is the input buffer */ 344 int ibuf_size; /* how big is the input buffer */
347 int obuf_size; /* how big is the output buffer */ 345 int obuf_size; /* how big is the output buffer */
348 346
349 char *ibuf; /* the char array */ 347 char *ibuf; /* the char array */
350 int ibuf_len; /* how many bytes are in it */ 348 int ibuf_len; /* how many bytes are in it */
351 int ibuf_off; /* write/read offset */ 349 int ibuf_off; /* write/read offset */
352 350
353 char *obuf; /* the char array */ 351 char *obuf; /* the char array */
354 int obuf_len; /* how many bytes are in it */ 352 int obuf_len; /* how many bytes are in it */
355 int obuf_off; /* write/read offset */ 353 int obuf_off; /* write/read offset */
356 } BIO_F_BUFFER_CTX; 354} BIO_F_BUFFER_CTX;
357 355
358/* Prefix and suffix callback in ASN1 BIO */ 356/* Prefix and suffix callback in ASN1 BIO */
359typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); 357typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg);
360 358
361#ifndef OPENSSL_NO_SCTP 359#ifndef OPENSSL_NO_SCTP
362/* SCTP parameter structs */ 360/* SCTP parameter structs */
363struct bio_dgram_sctp_sndinfo 361struct bio_dgram_sctp_sndinfo {
364 {
365 uint16_t snd_sid; 362 uint16_t snd_sid;
366 uint16_t snd_flags; 363 uint16_t snd_flags;
367 uint32_t snd_ppid; 364 uint32_t snd_ppid;
368 uint32_t snd_context; 365 uint32_t snd_context;
369 }; 366};
370 367
371struct bio_dgram_sctp_rcvinfo 368struct bio_dgram_sctp_rcvinfo {
372 {
373 uint16_t rcv_sid; 369 uint16_t rcv_sid;
374 uint16_t rcv_ssn; 370 uint16_t rcv_ssn;
375 uint16_t rcv_flags; 371 uint16_t rcv_flags;
@@ -377,13 +373,12 @@ struct bio_dgram_sctp_rcvinfo
377 uint32_t rcv_tsn; 373 uint32_t rcv_tsn;
378 uint32_t rcv_cumtsn; 374 uint32_t rcv_cumtsn;
379 uint32_t rcv_context; 375 uint32_t rcv_context;
380 }; 376};
381 377
382struct bio_dgram_sctp_prinfo 378struct bio_dgram_sctp_prinfo {
383 {
384 uint16_t pr_policy; 379 uint16_t pr_policy;
385 uint32_t pr_value; 380 uint32_t pr_value;
386 }; 381};
387#endif 382#endif
388 383
389/* connect BIO stuff */ 384/* connect BIO stuff */
@@ -519,7 +514,7 @@ struct bio_dgram_sctp_prinfo
519/* If you are wondering why this isn't defined, its because CONST_STRICT is 514/* If you are wondering why this isn't defined, its because CONST_STRICT is
520 * purely a compile-time kludge to allow const to be checked. 515 * purely a compile-time kludge to allow const to be checked.
521 */ 516 */
522int BIO_read_filename(BIO *b,const char *name); 517int BIO_read_filename(BIO *b, const char *name);
523#else 518#else
524#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ 519#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
525 BIO_CLOSE|BIO_FP_READ,(char *)name) 520 BIO_CLOSE|BIO_FP_READ,(char *)name)
@@ -611,22 +606,27 @@ int BIO_ctrl_reset_read_request(BIO *b);
611/* These two aren't currently implemented */ 606/* These two aren't currently implemented */
612/* int BIO_get_ex_num(BIO *bio); */ 607/* int BIO_get_ex_num(BIO *bio); */
613/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ 608/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */
614int BIO_set_ex_data(BIO *bio,int idx,void *data); 609int BIO_set_ex_data(BIO *bio, int idx, void *data);
615void *BIO_get_ex_data(BIO *bio,int idx); 610void *BIO_get_ex_data(BIO *bio, int idx);
616int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 611int
617 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); 612BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
613CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
618unsigned long BIO_number_read(BIO *bio); 614unsigned long BIO_number_read(BIO *bio);
619unsigned long BIO_number_written(BIO *bio); 615unsigned long BIO_number_written(BIO *bio);
620 616
621/* For BIO_f_asn1() */ 617/* For BIO_f_asn1() */
622int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, 618int
623 asn1_ps_func *prefix_free); 619BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix,
624int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, 620asn1_ps_func *prefix_free);
625 asn1_ps_func **pprefix_free); 621int
626int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, 622BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix,
627 asn1_ps_func *suffix_free); 623asn1_ps_func **pprefix_free);
628int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, 624int
629 asn1_ps_func **psuffix_free); 625BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix,
626asn1_ps_func *suffix_free);
627int
628BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix,
629asn1_ps_func **psuffix_free);
630 630
631# ifndef OPENSSL_NO_FP_API 631# ifndef OPENSSL_NO_FP_API
632BIO_METHOD *BIO_s_file(void ); 632BIO_METHOD *BIO_s_file(void );
@@ -635,22 +635,23 @@ BIO *BIO_new_fp(FILE *stream, int close_flag);
635# define BIO_s_file_internal BIO_s_file 635# define BIO_s_file_internal BIO_s_file
636# endif 636# endif
637BIO * BIO_new(BIO_METHOD *type); 637BIO * BIO_new(BIO_METHOD *type);
638int BIO_set(BIO *a,BIO_METHOD *type); 638int BIO_set(BIO *a, BIO_METHOD *type);
639int BIO_free(BIO *a); 639int BIO_free(BIO *a);
640void BIO_vfree(BIO *a); 640void BIO_vfree(BIO *a);
641int BIO_read(BIO *b, void *data, int len); 641int BIO_read(BIO *b, void *data, int len);
642int BIO_gets(BIO *bp,char *buf, int size); 642int BIO_gets(BIO *bp, char *buf, int size);
643int BIO_write(BIO *b, const void *data, int len); 643int BIO_write(BIO *b, const void *data, int len);
644int BIO_puts(BIO *bp,const char *buf); 644int BIO_puts(BIO *bp, const char *buf);
645int BIO_indent(BIO *b,int indent,int max); 645int BIO_indent(BIO *b, int indent, int max);
646long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); 646long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg);
647long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); 647long BIO_callback_ctrl(BIO *b, int cmd,
648char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); 648 void (*fp)(struct bio_st *, int, const char *, int, long, long));
649long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); 649char * BIO_ptr_ctrl(BIO *bp, int cmd, long larg);
650BIO * BIO_push(BIO *b,BIO *append); 650long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg);
651BIO * BIO_push(BIO *b, BIO *append);
651BIO * BIO_pop(BIO *b); 652BIO * BIO_pop(BIO *b);
652void BIO_free_all(BIO *a); 653void BIO_free_all(BIO *a);
653BIO * BIO_find_type(BIO *b,int bio_type); 654BIO * BIO_find_type(BIO *b, int bio_type);
654BIO * BIO_next(BIO *b); 655BIO * BIO_next(BIO *b);
655BIO * BIO_get_retry_BIO(BIO *bio, int *reason); 656BIO * BIO_get_retry_BIO(BIO *bio, int *reason);
656int BIO_get_retry_reason(BIO *bio); 657int BIO_get_retry_reason(BIO *bio);
@@ -661,8 +662,8 @@ int BIO_nread(BIO *bio, char **buf, int num);
661int BIO_nwrite0(BIO *bio, char **buf); 662int BIO_nwrite0(BIO *bio, char **buf);
662int BIO_nwrite(BIO *bio, char **buf, int num); 663int BIO_nwrite(BIO *bio, char **buf, int num);
663 664
664long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, 665long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi,
665 long argl,long ret); 666 long argl, long ret);
666 667
667BIO_METHOD *BIO_s_mem(void); 668BIO_METHOD *BIO_s_mem(void);
668BIO *BIO_new_mem_buf(void *buf, int len); 669BIO *BIO_new_mem_buf(void *buf, int len);
@@ -696,12 +697,14 @@ int BIO_dgram_non_fatal_error(int error);
696 697
697int BIO_fd_should_retry(int i); 698int BIO_fd_should_retry(int i);
698int BIO_fd_non_fatal_error(int error); 699int BIO_fd_non_fatal_error(int error);
699int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), 700int
700 void *u, const char *s, int len); 701BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
701int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), 702void *u, const char *s, int len);
702 void *u, const char *s, int len, int indent); 703int
703int BIO_dump(BIO *b,const char *bytes,int len); 704BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
704int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); 705void *u, const char *s, int len, int indent);
706int BIO_dump(BIO *b, const char *bytes, int len);
707int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent);
705#ifndef OPENSSL_NO_FP_API 708#ifndef OPENSSL_NO_FP_API
706int BIO_dump_fp(FILE *fp, const char *s, int len); 709int BIO_dump_fp(FILE *fp, const char *s, int len);
707int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); 710int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent);
@@ -717,23 +720,24 @@ struct hostent *BIO_gethostbyname(const char *name);
717 */ 720 */
718int BIO_sock_error(int sock); 721int BIO_sock_error(int sock);
719int BIO_socket_ioctl(int fd, long type, void *arg); 722int BIO_socket_ioctl(int fd, long type, void *arg);
720int BIO_socket_nbio(int fd,int mode); 723int BIO_socket_nbio(int fd, int mode);
721int BIO_get_port(const char *str, unsigned short *port_ptr); 724int BIO_get_port(const char *str, unsigned short *port_ptr);
722int BIO_get_host_ip(const char *str, unsigned char *ip); 725int BIO_get_host_ip(const char *str, unsigned char *ip);
723int BIO_get_accept_socket(char *host_port,int mode); 726int BIO_get_accept_socket(char *host_port, int mode);
724int BIO_accept(int sock,char **ip_port); 727int BIO_accept(int sock, char **ip_port);
725int BIO_sock_init(void ); 728int BIO_sock_init(void );
726void BIO_sock_cleanup(void); 729void BIO_sock_cleanup(void);
727int BIO_set_tcp_ndelay(int sock,int turn_on); 730int BIO_set_tcp_ndelay(int sock, int turn_on);
728 731
729BIO *BIO_new_socket(int sock, int close_flag); 732BIO *BIO_new_socket(int sock, int close_flag);
730BIO *BIO_new_dgram(int fd, int close_flag); 733BIO *BIO_new_dgram(int fd, int close_flag);
731#ifndef OPENSSL_NO_SCTP 734#ifndef OPENSSL_NO_SCTP
732BIO *BIO_new_dgram_sctp(int fd, int close_flag); 735BIO *BIO_new_dgram_sctp(int fd, int close_flag);
733int BIO_dgram_is_sctp(BIO *bio); 736int BIO_dgram_is_sctp(BIO *bio);
734int BIO_dgram_sctp_notification_cb(BIO *b, 737int
735 void (*handle_notifications)(BIO *bio, void *context, void *buf), 738BIO_dgram_sctp_notification_cb(BIO *b,
736 void *context); 739 void (*handle_notifications)(BIO *bio, void *context, void *buf),
740void *context);
737int BIO_dgram_sctp_wait_for_dry(BIO *b); 741int BIO_dgram_sctp_wait_for_dry(BIO *b);
738int BIO_dgram_sctp_msg_waiting(BIO *b); 742int BIO_dgram_sctp_msg_waiting(BIO *b);
739#endif 743#endif
@@ -741,8 +745,9 @@ BIO *BIO_new_fd(int fd, int close_flag);
741BIO *BIO_new_connect(char *host_port); 745BIO *BIO_new_connect(char *host_port);
742BIO *BIO_new_accept(char *host_port); 746BIO *BIO_new_accept(char *host_port);
743 747
744int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, 748int
745 BIO **bio2, size_t writebuf2); 749BIO_new_bio_pair(BIO **bio1, size_t writebuf1,
750BIO **bio2, size_t writebuf2);
746/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. 751/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints.
747 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. 752 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL.
748 * Size 0 uses default value. 753 * Size 0 uses default value.
@@ -757,14 +762,18 @@ void BIO_copy_next_retry(BIO *b);
757#else 762#else
758# define __bio_h__attr__(x) 763# define __bio_h__attr__(x)
759#endif 764#endif
760int BIO_printf(BIO *bio, const char *format, ...) 765int
761 __bio_h__attr__((__format__(__printf__,2,3))); 766BIO_printf(BIO *bio, const char *format, ...)
762int BIO_vprintf(BIO *bio, const char *format, va_list args) 767__bio_h__attr__((__format__(__printf__, 2, 3)));
763 __bio_h__attr__((__format__(__printf__,2,0))); 768int
764int BIO_snprintf(char *buf, size_t n, const char *format, ...) 769BIO_vprintf(BIO *bio, const char *format, va_list args)
765 __bio_h__attr__((__format__(__printf__,3,4))); 770__bio_h__attr__((__format__(__printf__, 2, 0)));
766int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) 771int
767 __bio_h__attr__((__format__(__printf__,3,0))); 772BIO_snprintf(char *buf, size_t n, const char *format, ...)
773__bio_h__attr__((__format__(__printf__, 3, 4)));
774int
775BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
776__bio_h__attr__((__format__(__printf__, 3, 0)));
768#undef __bio_h__attr__ 777#undef __bio_h__attr__
769 778
770/* BEGIN ERROR CODES */ 779/* BEGIN ERROR CODES */
diff --git a/src/lib/libcrypto/bio/bio_cb.c b/src/lib/libcrypto/bio/bio_cb.c
index 78c8974ab4..3e110f3751 100644
--- a/src/lib/libcrypto/bio/bio_cb.c
+++ b/src/lib/libcrypto/bio/bio_cb.c
@@ -63,81 +63,85 @@
63#include <openssl/bio.h> 63#include <openssl/bio.h>
64#include <openssl/err.h> 64#include <openssl/err.h>
65 65
66long BIO_debug_callback(BIO *bio, int cmd, const char *argp, 66long
67 int argi, long argl, long ret) 67BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, long argl,
68 { 68 long ret)
69{
69 BIO *b; 70 BIO *b;
70 char buf[256]; 71 char buf[256];
71 char *p; 72 char *p;
72 long r=1; 73 long r = 1;
73 size_t p_maxlen; 74 size_t p_maxlen;
74 75
75 if (BIO_CB_RETURN & cmd) 76 if (BIO_CB_RETURN & cmd)
76 r=ret; 77 r = ret;
77 78
78 (void) snprintf(buf,sizeof buf,"BIO[%08lX]:",(unsigned long)bio); 79 (void) snprintf(buf, sizeof buf, "BIO[%08lX]:", (unsigned long)bio);
79 p= &(buf[14]); 80 p = &(buf[14]);
80 p_maxlen = sizeof buf - 14; 81 p_maxlen = sizeof buf - 14;
81 switch (cmd) 82 switch (cmd) {
82 {
83 case BIO_CB_FREE: 83 case BIO_CB_FREE:
84 (void) snprintf(p,p_maxlen,"Free - %s\n",bio->method->name); 84 (void) snprintf(p, p_maxlen, "Free - %s\n", bio->method->name);
85 break; 85 break;
86 case BIO_CB_READ: 86 case BIO_CB_READ:
87 if (bio->method->type & BIO_TYPE_DESCRIPTOR) 87 if (bio->method->type & BIO_TYPE_DESCRIPTOR)
88 (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s fd=%d\n", 88 (void) snprintf(p, p_maxlen,
89 bio->num,(unsigned long)argi, 89 "read(%d,%lu) - %s fd=%d\n",
90 bio->method->name,bio->num); 90 bio->num,(unsigned long)argi,
91 bio->method->name, bio->num);
91 else 92 else
92 (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s\n", 93 (void) snprintf(p, p_maxlen, "read(%d,%lu) - %s\n",
93 bio->num,(unsigned long)argi, 94 bio->num, (unsigned long)argi, bio->method->name);
94 bio->method->name);
95 break; 95 break;
96 case BIO_CB_WRITE: 96 case BIO_CB_WRITE:
97 if (bio->method->type & BIO_TYPE_DESCRIPTOR) 97 if (bio->method->type & BIO_TYPE_DESCRIPTOR)
98 (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s fd=%d\n", 98 (void) snprintf(p, p_maxlen,
99 bio->num,(unsigned long)argi, 99 "write(%d,%lu) - %s fd=%d\n",
100 bio->method->name,bio->num); 100 bio->num, (unsigned long)argi,
101 bio->method->name, bio->num);
101 else 102 else
102 (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s\n", 103 (void) snprintf(p, p_maxlen, "write(%d,%lu) - %s\n",
103 bio->num,(unsigned long)argi, 104 bio->num, (unsigned long)argi, bio->method->name);
104 bio->method->name);
105 break; 105 break;
106 case BIO_CB_PUTS: 106 case BIO_CB_PUTS:
107 (void) snprintf(p,p_maxlen,"puts() - %s\n",bio->method->name); 107 (void) snprintf(p, p_maxlen,
108 "puts() - %s\n", bio->method->name);
108 break; 109 break;
109 case BIO_CB_GETS: 110 case BIO_CB_GETS:
110 (void) snprintf(p,p_maxlen,"gets(%lu) - %s\n",(unsigned long)argi,bio->method->name); 111 (void) snprintf(p, p_maxlen, "gets(%lu) - %s\n",
112 (unsigned long)argi, bio->method->name);
111 break; 113 break;
112 case BIO_CB_CTRL: 114 case BIO_CB_CTRL:
113 (void) snprintf(p,p_maxlen,"ctrl(%lu) - %s\n",(unsigned long)argi,bio->method->name); 115 (void) snprintf(p, p_maxlen, "ctrl(%lu) - %s\n",
116 (unsigned long)argi, bio->method->name);
114 break; 117 break;
115 case BIO_CB_RETURN|BIO_CB_READ: 118 case BIO_CB_RETURN|BIO_CB_READ:
116 (void) snprintf(p,p_maxlen,"read return %ld\n",ret); 119 (void) snprintf(p, p_maxlen, "read return %ld\n", ret);
117 break; 120 break;
118 case BIO_CB_RETURN|BIO_CB_WRITE: 121 case BIO_CB_RETURN|BIO_CB_WRITE:
119 (void) snprintf(p,p_maxlen,"write return %ld\n",ret); 122 (void) snprintf(p, p_maxlen, "write return %ld\n", ret);
120 break; 123 break;
121 case BIO_CB_RETURN|BIO_CB_GETS: 124 case BIO_CB_RETURN|BIO_CB_GETS:
122 (void) snprintf(p,p_maxlen,"gets return %ld\n",ret); 125 (void) snprintf(p, p_maxlen, "gets return %ld\n", ret);
123 break; 126 break;
124 case BIO_CB_RETURN|BIO_CB_PUTS: 127 case BIO_CB_RETURN|BIO_CB_PUTS:
125 (void) snprintf(p,p_maxlen,"puts return %ld\n",ret); 128 (void) snprintf(p, p_maxlen, "puts return %ld\n", ret);
126 break; 129 break;
127 case BIO_CB_RETURN|BIO_CB_CTRL: 130 case BIO_CB_RETURN|BIO_CB_CTRL:
128 (void) snprintf(p,p_maxlen,"ctrl return %ld\n",ret); 131 (void) snprintf(p, p_maxlen, "ctrl return %ld\n", ret);
129 break; 132 break;
130 default: 133 default:
131 (void) snprintf(p,p_maxlen,"bio callback - unknown type (%d)\n",cmd); 134 (void) snprintf(p, p_maxlen,
135 "bio callback - unknown type (%d)\n", cmd);
132 break; 136 break;
133 } 137 }
134 138
135 b=(BIO *)bio->cb_arg; 139 b = (BIO *)bio->cb_arg;
136 if (b != NULL) 140 if (b != NULL)
137 BIO_write(b,buf,strlen(buf)); 141 BIO_write(b, buf, strlen(buf));
138#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) 142#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)
139 else 143 else
140 fputs(buf,stderr); 144 fputs(buf, stderr);
141#endif 145#endif
142 return(r); 146 return (r);
143 } 147}
diff --git a/src/lib/libcrypto/bio/bio_err.c b/src/lib/libcrypto/bio/bio_err.c
index 0dbfbd80d3..86e9a3082b 100644
--- a/src/lib/libcrypto/bio/bio_err.c
+++ b/src/lib/libcrypto/bio/bio_err.c
@@ -68,88 +68,85 @@
68#define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) 68#define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0)
69#define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) 69#define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason)
70 70
71static ERR_STRING_DATA BIO_str_functs[]= 71static ERR_STRING_DATA BIO_str_functs[]= {
72 { 72 {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"},
73{ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, 73 {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"},
74{ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, 74 {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"},
75{ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, 75 {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"},
76{ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, 76 {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"},
77{ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, 77 {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"},
78{ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, 78 {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"},
79{ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, 79 {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"},
80{ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, 80 {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"},
81{ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, 81 {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"},
82{ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, 82 {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"},
83{ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, 83 {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"},
84{ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, 84 {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"},
85{ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, 85 {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"},
86{ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, 86 {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"},
87{ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, 87 {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"},
88{ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, 88 {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"},
89{ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, 89 {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"},
90{ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, 90 {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"},
91{ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, 91 {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"},
92{ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, 92 {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"},
93{ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, 93 {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"},
94{ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, 94 {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"},
95{ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, 95 {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"},
96{ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, 96 {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"},
97{ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, 97 {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"},
98{ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, 98 {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"},
99{ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, 99 {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"},
100{ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, 100 {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"},
101{ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, 101 {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"},
102{ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, 102 {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"},
103{ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, 103 {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"},
104{ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, 104 {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"},
105{ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, 105 {0, NULL}
106{0,NULL} 106};
107 };
108 107
109static ERR_STRING_DATA BIO_str_reasons[]= 108static ERR_STRING_DATA BIO_str_reasons[]= {
110 { 109 {ERR_REASON(BIO_R_ACCEPT_ERROR) , "accept error"},
111{ERR_REASON(BIO_R_ACCEPT_ERROR) ,"accept error"}, 110 {ERR_REASON(BIO_R_BAD_FOPEN_MODE) , "bad fopen mode"},
112{ERR_REASON(BIO_R_BAD_FOPEN_MODE) ,"bad fopen mode"}, 111 {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) , "bad hostname lookup"},
113{ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) ,"bad hostname lookup"}, 112 {ERR_REASON(BIO_R_BROKEN_PIPE) , "broken pipe"},
114{ERR_REASON(BIO_R_BROKEN_PIPE) ,"broken pipe"}, 113 {ERR_REASON(BIO_R_CONNECT_ERROR) , "connect error"},
115{ERR_REASON(BIO_R_CONNECT_ERROR) ,"connect error"}, 114 {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) , "EOF on memory BIO"},
116{ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) ,"EOF on memory BIO"}, 115 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) , "error setting nbio"},
117{ERR_REASON(BIO_R_ERROR_SETTING_NBIO) ,"error setting nbio"}, 116 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET), "error setting nbio on accepted socket"},
118{ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET),"error setting nbio on accepted socket"}, 117 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET), "error setting nbio on accept socket"},
119{ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET),"error setting nbio on accept socket"}, 118 {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET), "gethostbyname addr is not af inet"},
120{ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET),"gethostbyname addr is not af inet"}, 119 {ERR_REASON(BIO_R_INVALID_ARGUMENT) , "invalid argument"},
121{ERR_REASON(BIO_R_INVALID_ARGUMENT) ,"invalid argument"}, 120 {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) , "invalid ip address"},
122{ERR_REASON(BIO_R_INVALID_IP_ADDRESS) ,"invalid ip address"}, 121 {ERR_REASON(BIO_R_IN_USE) , "in use"},
123{ERR_REASON(BIO_R_IN_USE) ,"in use"}, 122 {ERR_REASON(BIO_R_KEEPALIVE) , "keepalive"},
124{ERR_REASON(BIO_R_KEEPALIVE) ,"keepalive"}, 123 {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) , "nbio connect error"},
125{ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) ,"nbio connect error"}, 124 {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED), "no accept port specified"},
126{ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED),"no accept port specified"}, 125 {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) , "no hostname specified"},
127{ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) ,"no hostname specified"}, 126 {ERR_REASON(BIO_R_NO_PORT_DEFINED) , "no port defined"},
128{ERR_REASON(BIO_R_NO_PORT_DEFINED) ,"no port defined"}, 127 {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) , "no port specified"},
129{ERR_REASON(BIO_R_NO_PORT_SPECIFIED) ,"no port specified"}, 128 {ERR_REASON(BIO_R_NO_SUCH_FILE) , "no such file"},
130{ERR_REASON(BIO_R_NO_SUCH_FILE) ,"no such file"}, 129 {ERR_REASON(BIO_R_NULL_PARAMETER) , "null parameter"},
131{ERR_REASON(BIO_R_NULL_PARAMETER) ,"null parameter"}, 130 {ERR_REASON(BIO_R_TAG_MISMATCH) , "tag mismatch"},
132{ERR_REASON(BIO_R_TAG_MISMATCH) ,"tag mismatch"}, 131 {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) , "unable to bind socket"},
133{ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) ,"unable to bind socket"}, 132 {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET), "unable to create socket"},
134{ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET),"unable to create socket"}, 133 {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET), "unable to listen socket"},
135{ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET),"unable to listen socket"}, 134 {ERR_REASON(BIO_R_UNINITIALIZED) , "uninitialized"},
136{ERR_REASON(BIO_R_UNINITIALIZED) ,"uninitialized"}, 135 {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) , "unsupported method"},
137{ERR_REASON(BIO_R_UNSUPPORTED_METHOD) ,"unsupported method"}, 136 {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO), "write to read only BIO"},
138{ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO),"write to read only BIO"}, 137 {ERR_REASON(BIO_R_WSASTARTUP) , "WSAStartup"},
139{ERR_REASON(BIO_R_WSASTARTUP) ,"WSAStartup"}, 138 {0, NULL}
140{0,NULL} 139};
141 };
142 140
143#endif 141#endif
144 142
145void ERR_load_BIO_strings(void) 143void
146 { 144ERR_load_BIO_strings(void)
145{
147#ifndef OPENSSL_NO_ERR 146#ifndef OPENSSL_NO_ERR
148 147 if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) {
149 if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) 148 ERR_load_strings(0, BIO_str_functs);
150 { 149 ERR_load_strings(0, BIO_str_reasons);
151 ERR_load_strings(0,BIO_str_functs);
152 ERR_load_strings(0,BIO_str_reasons);
153 }
154#endif
155 } 150 }
151#endif
152}
diff --git a/src/lib/libcrypto/bio/bio_lib.c b/src/lib/libcrypto/bio/bio_lib.c
index 9c9646afa8..9e8fb7913a 100644
--- a/src/lib/libcrypto/bio/bio_lib.c
+++ b/src/lib/libcrypto/bio/bio_lib.c
@@ -63,539 +63,571 @@
63#include <openssl/bio.h> 63#include <openssl/bio.h>
64#include <openssl/stack.h> 64#include <openssl/stack.h>
65 65
66BIO *BIO_new(BIO_METHOD *method) 66BIO
67 { 67*BIO_new(BIO_METHOD *method)
68 BIO *ret=NULL; 68{
69 69 BIO *ret = NULL;
70 ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); 70
71 if (ret == NULL) 71 ret = (BIO *)OPENSSL_malloc(sizeof(BIO));
72 { 72 if (ret == NULL) {
73 BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); 73 BIOerr(BIO_F_BIO_NEW, ERR_R_MALLOC_FAILURE);
74 return(NULL); 74 return (NULL);
75 } 75 }
76 if (!BIO_set(ret,method)) 76 if (!BIO_set(ret, method)) {
77 {
78 OPENSSL_free(ret); 77 OPENSSL_free(ret);
79 ret=NULL; 78 ret = NULL;
80 }
81 return(ret);
82 } 79 }
80 return (ret);
81}
83 82
84int BIO_set(BIO *bio, BIO_METHOD *method) 83int
85 { 84BIO_set(BIO *bio, BIO_METHOD *method)
86 bio->method=method; 85{
87 bio->callback=NULL; 86 bio->method = method;
88 bio->cb_arg=NULL; 87 bio->callback = NULL;
89 bio->init=0; 88 bio->cb_arg = NULL;
90 bio->shutdown=1; 89 bio->init = 0;
91 bio->flags=0; 90 bio->shutdown = 1;
92 bio->retry_reason=0; 91 bio->flags = 0;
93 bio->num=0; 92 bio->retry_reason = 0;
94 bio->ptr=NULL; 93 bio->num = 0;
95 bio->prev_bio=NULL; 94 bio->ptr = NULL;
96 bio->next_bio=NULL; 95 bio->prev_bio = NULL;
97 bio->references=1; 96 bio->next_bio = NULL;
98 bio->num_read=0L; 97 bio->references = 1;
99 bio->num_write=0L; 98 bio->num_read = 0L;
99 bio->num_write = 0L;
100 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); 100 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
101 if (method->create != NULL) 101 if (method->create != NULL)
102 if (!method->create(bio)) 102 if (!method->create(bio)) {
103 {
104 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, 103 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio,
105 &bio->ex_data); 104 &bio->ex_data);
106 return(0); 105 return (0);
107 } 106 }
108 return(1); 107 return (1);
109 } 108}
110 109
111int BIO_free(BIO *a) 110int
112 { 111BIO_free(BIO *a)
112{
113 int i; 113 int i;
114 114
115 if (a == NULL) return(0); 115 if (a == NULL)
116 return (0);
116 117
117 i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); 118 i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO);
118#ifdef REF_PRINT 119#ifdef REF_PRINT
119 REF_PRINT("BIO",a); 120 REF_PRINT("BIO", a);
120#endif 121#endif
121 if (i > 0) return(1); 122 if (i > 0)
123 return (1);
122#ifdef REF_CHECK 124#ifdef REF_CHECK
123 if (i < 0) 125 if (i < 0) {
124 { 126 fprintf(stderr, "BIO_free, bad reference count\n");
125 fprintf(stderr,"BIO_free, bad reference count\n");
126 abort(); 127 abort();
127 } 128 }
128#endif 129#endif
129 if ((a->callback != NULL) && 130 if ((a->callback != NULL) &&
130 ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) 131 ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0))
131 return(i); 132 return (i);
132 133
133 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); 134 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data);
134 135
135 if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); 136 if ((a->method == NULL) || (a->method->destroy == NULL))
137 return (1);
136 a->method->destroy(a); 138 a->method->destroy(a);
137 OPENSSL_free(a); 139 OPENSSL_free(a);
138 return(1); 140 return (1);
139 } 141}
140 142
141void BIO_vfree(BIO *a) 143void
142 { BIO_free(a); } 144BIO_vfree(BIO *a)
145{
146 BIO_free(a);
147}
143 148
144void BIO_clear_flags(BIO *b, int flags) 149void
145 { 150BIO_clear_flags(BIO *b, int flags)
151{
146 b->flags &= ~flags; 152 b->flags &= ~flags;
147 } 153}
148 154
149int BIO_test_flags(const BIO *b, int flags) 155int
150 { 156BIO_test_flags(const BIO *b, int flags)
157{
151 return (b->flags & flags); 158 return (b->flags & flags);
152 } 159}
153 160
154void BIO_set_flags(BIO *b, int flags) 161void
155 { 162BIO_set_flags(BIO *b, int flags)
163{
156 b->flags |= flags; 164 b->flags |= flags;
157 } 165}
158 166
159long (*BIO_get_callback(const BIO *b))(struct bio_st *,int,const char *,int, long,long) 167long
160 { 168(*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, int,
169 long, long)
170{
161 return b->callback; 171 return b->callback;
162 } 172}
163 173
164void BIO_set_callback(BIO *b, long (*cb)(struct bio_st *,int,const char *,int, long,long)) 174void
165 { 175BIO_set_callback(BIO *b, long (*cb)(struct bio_st *, int, const char *, int,
176 long, long))
177{
166 b->callback = cb; 178 b->callback = cb;
167 } 179}
168 180
169void BIO_set_callback_arg(BIO *b, char *arg) 181void
170 { 182BIO_set_callback_arg(BIO *b, char *arg)
183{
171 b->cb_arg = arg; 184 b->cb_arg = arg;
172 } 185}
173 186
174char * BIO_get_callback_arg(const BIO *b) 187char *
175 { 188BIO_get_callback_arg(const BIO *b)
189{
176 return b->cb_arg; 190 return b->cb_arg;
177 } 191}
178 192
179const char * BIO_method_name(const BIO *b) 193const char *
180 { 194BIO_method_name(const BIO *b)
195{
181 return b->method->name; 196 return b->method->name;
182 } 197}
183 198
184int BIO_method_type(const BIO *b) 199int
185 { 200BIO_method_type(const BIO *b)
201{
186 return b->method->type; 202 return b->method->type;
187 } 203}
188
189 204
190int BIO_read(BIO *b, void *out, int outl) 205int
191 { 206BIO_read(BIO *b, void *out, int outl)
207{
192 int i; 208 int i;
193 long (*cb)(BIO *,int,const char *,int,long,long); 209 long (*cb)(BIO *, int, const char *, int, long, long);
194 210
195 if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) 211 if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) {
196 { 212 BIOerr(BIO_F_BIO_READ, BIO_R_UNSUPPORTED_METHOD);
197 BIOerr(BIO_F_BIO_READ,BIO_R_UNSUPPORTED_METHOD); 213 return (-2);
198 return(-2); 214 }
199 }
200 215
201 cb=b->callback; 216 cb = b->callback;
202 if ((cb != NULL) && 217 if ((cb != NULL) &&
203 ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) 218 ((i = (int)cb(b, BIO_CB_READ, out, outl, 0L, 1L)) <= 0))
204 return(i); 219 return (i);
205 220
206 if (!b->init) 221 if (!b->init) {
207 { 222 BIOerr(BIO_F_BIO_READ, BIO_R_UNINITIALIZED);
208 BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); 223 return (-2);
209 return(-2); 224 }
210 }
211 225
212 i=b->method->bread(b,out,outl); 226 i = b->method->bread(b, out, outl);
213 227
214 if (i > 0) b->num_read+=(unsigned long)i; 228 if (i > 0)
229 b->num_read += (unsigned long)i;
215 230
216 if (cb != NULL) 231 if (cb != NULL)
217 i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, 232 i = (int)cb(b, BIO_CB_READ|BIO_CB_RETURN, out, outl,
218 0L,(long)i); 233 0L, (long)i);
219 return(i); 234 return (i);
220 } 235}
221 236
222int BIO_write(BIO *b, const void *in, int inl) 237int
223 { 238BIO_write(BIO *b, const void *in, int inl)
239{
224 int i; 240 int i;
225 long (*cb)(BIO *,int,const char *,int,long,long); 241 long (*cb)(BIO *, int, const char *, int, long, long);
226 242
227 if (b == NULL) 243 if (b == NULL)
228 return(0); 244 return (0);
229 245
230 cb=b->callback; 246 cb = b->callback;
231 if ((b->method == NULL) || (b->method->bwrite == NULL)) 247 if ((b->method == NULL) || (b->method->bwrite == NULL)) {
232 { 248 BIOerr(BIO_F_BIO_WRITE, BIO_R_UNSUPPORTED_METHOD);
233 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); 249 return (-2);
234 return(-2); 250 }
235 }
236 251
237 if ((cb != NULL) && 252 if ((cb != NULL) &&
238 ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) 253 ((i = (int)cb(b, BIO_CB_WRITE, in, inl, 0L, 1L)) <= 0))
239 return(i); 254 return (i);
240 255
241 if (!b->init) 256 if (!b->init) {
242 { 257 BIOerr(BIO_F_BIO_WRITE, BIO_R_UNINITIALIZED);
243 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); 258 return (-2);
244 return(-2); 259 }
245 }
246 260
247 i=b->method->bwrite(b,in,inl); 261 i = b->method->bwrite(b, in, inl);
248 262
249 if (i > 0) b->num_write+=(unsigned long)i; 263 if (i > 0)
264 b->num_write += (unsigned long)i;
250 265
251 if (cb != NULL) 266 if (cb != NULL)
252 i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, 267 i = (int)cb(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl,
253 0L,(long)i); 268 0L, (long)i);
254 return(i); 269 return (i);
255 } 270}
256 271
257int BIO_puts(BIO *b, const char *in) 272int
258 { 273BIO_puts(BIO *b, const char *in)
274{
259 int i; 275 int i;
260 long (*cb)(BIO *,int,const char *,int,long,long); 276 long (*cb)(BIO *, int, const char *, int, long, long);
261 277
262 if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) 278 if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) {
263 { 279 BIOerr(BIO_F_BIO_PUTS, BIO_R_UNSUPPORTED_METHOD);
264 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNSUPPORTED_METHOD); 280 return (-2);
265 return(-2); 281 }
266 }
267 282
268 cb=b->callback; 283 cb = b->callback;
269 284
270 if ((cb != NULL) && 285 if ((cb != NULL) &&
271 ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) 286 ((i = (int)cb(b, BIO_CB_PUTS, in, 0, 0L, 1L)) <= 0))
272 return(i); 287 return (i);
273 288
274 if (!b->init) 289 if (!b->init) {
275 { 290 BIOerr(BIO_F_BIO_PUTS, BIO_R_UNINITIALIZED);
276 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); 291 return (-2);
277 return(-2); 292 }
278 }
279 293
280 i=b->method->bputs(b,in); 294 i = b->method->bputs(b, in);
281 295
282 if (i > 0) b->num_write+=(unsigned long)i; 296 if (i > 0)
297 b->num_write += (unsigned long)i;
283 298
284 if (cb != NULL) 299 if (cb != NULL)
285 i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, 300 i = (int)cb(b, BIO_CB_PUTS|BIO_CB_RETURN, in, 0, 0L, (long)i);
286 0L,(long)i); 301 return (i);
287 return(i); 302}
288 }
289 303
290int BIO_gets(BIO *b, char *in, int inl) 304int
291 { 305BIO_gets(BIO *b, char *in, int inl)
306{
292 int i; 307 int i;
293 long (*cb)(BIO *,int,const char *,int,long,long); 308 long (*cb)(BIO *, int, const char *, int, long, long);
294 309
295 if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) 310 if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) {
296 { 311 BIOerr(BIO_F_BIO_GETS, BIO_R_UNSUPPORTED_METHOD);
297 BIOerr(BIO_F_BIO_GETS,BIO_R_UNSUPPORTED_METHOD); 312 return (-2);
298 return(-2); 313 }
299 }
300 314
301 cb=b->callback; 315 cb = b->callback;
302 316
303 if ((cb != NULL) && 317 if ((cb != NULL) &&
304 ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) 318 ((i = (int)cb(b, BIO_CB_GETS, in, inl, 0L, 1L)) <= 0))
305 return(i); 319 return (i);
306 320
307 if (!b->init) 321 if (!b->init) {
308 { 322 BIOerr(BIO_F_BIO_GETS, BIO_R_UNINITIALIZED);
309 BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); 323 return (-2);
310 return(-2); 324 }
311 }
312 325
313 i=b->method->bgets(b,in,inl); 326 i = b->method->bgets(b, in, inl);
314 327
315 if (cb != NULL) 328 if (cb != NULL)
316 i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, 329 i = (int)cb(b, BIO_CB_GETS|BIO_CB_RETURN, in, inl, 0L, (long)i);
317 0L,(long)i); 330 return (i);
318 return(i); 331}
319 }
320 332
321int BIO_indent(BIO *b,int indent,int max) 333int
322 { 334BIO_indent(BIO *b, int indent, int max)
323 if(indent < 0) 335{
324 indent=0; 336 if (indent < 0)
325 if(indent > max) 337 indent = 0;
326 indent=max; 338 if (indent > max)
327 while(indent--) 339 indent = max;
328 if(BIO_puts(b," ") != 1) 340 while (indent--)
329 return 0; 341 if (BIO_puts(b, " ") != 1)
342 return 0;
330 return 1; 343 return 1;
331 } 344}
332 345
333long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) 346long
334 { 347BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg)
348{
335 int i; 349 int i;
336 350
337 i=iarg; 351 i = iarg;
338 return(BIO_ctrl(b,cmd,larg,(char *)&i)); 352 return (BIO_ctrl(b, cmd, larg,(char *)&i));
339 } 353}
340 354
341char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) 355char
342 { 356*BIO_ptr_ctrl(BIO *b, int cmd, long larg)
343 char *p=NULL; 357{
358 char *p = NULL;
344 359
345 if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) 360 if (BIO_ctrl(b, cmd, larg,(char *)&p) <= 0)
346 return(NULL); 361 return (NULL);
347 else 362 else
348 return(p); 363 return (p);
349 } 364}
350 365
351long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) 366long
352 { 367BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
368{
353 long ret; 369 long ret;
354 long (*cb)(BIO *,int,const char *,int,long,long); 370 long (*cb)(BIO *, int, const char *, int, long, long);
355 371
356 if (b == NULL) return(0); 372 if (b == NULL)
373 return (0);
357 374
358 if ((b->method == NULL) || (b->method->ctrl == NULL)) 375 if ((b->method == NULL) || (b->method->ctrl == NULL)) {
359 { 376 BIOerr(BIO_F_BIO_CTRL, BIO_R_UNSUPPORTED_METHOD);
360 BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); 377 return (-2);
361 return(-2); 378 }
362 }
363 379
364 cb=b->callback; 380 cb = b->callback;
365 381
366 if ((cb != NULL) && 382 if ((cb != NULL) &&
367 ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) 383 ((ret = cb(b, BIO_CB_CTRL, parg, cmd, larg, 1L)) <= 0))
368 return(ret); 384 return (ret);
369 385
370 ret=b->method->ctrl(b,cmd,larg,parg); 386 ret = b->method->ctrl(b, cmd, larg, parg);
371 387
372 if (cb != NULL) 388 if (cb != NULL)
373 ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, 389 ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN, parg, cmd, larg, ret);
374 larg,ret); 390 return (ret);
375 return(ret); 391}
376 }
377 392
378long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) 393long
379 { 394BIO_callback_ctrl(BIO *b, int cmd,
395 void (*fp)(struct bio_st *, int, const char *, int, long, long))
396{
380 long ret; 397 long ret;
381 long (*cb)(BIO *,int,const char *,int,long,long); 398 long (*cb)(BIO *, int, const char *, int, long, long);
382 399
383 if (b == NULL) return(0); 400 if (b == NULL)
401 return (0);
384 402
385 if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) 403 if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) {
386 { 404 BIOerr(BIO_F_BIO_CALLBACK_CTRL, BIO_R_UNSUPPORTED_METHOD);
387 BIOerr(BIO_F_BIO_CALLBACK_CTRL,BIO_R_UNSUPPORTED_METHOD); 405 return (-2);
388 return(-2); 406 }
389 }
390 407
391 cb=b->callback; 408 cb = b->callback;
392 409
393 if ((cb != NULL) && 410 if ((cb != NULL) &&
394 ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) 411 ((ret = cb(b, BIO_CB_CTRL,(void *)&fp, cmd, 0, 1L)) <= 0))
395 return(ret); 412 return (ret);
396 413
397 ret=b->method->callback_ctrl(b,cmd,fp); 414 ret = b->method->callback_ctrl(b, cmd, fp);
398 415
399 if (cb != NULL) 416 if (cb != NULL)
400 ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, 417 ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp, cmd, 0, ret);
401 0,ret); 418 return (ret);
402 return(ret); 419}
403 }
404 420
405/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros 421/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
406 * do; but those macros have inappropriate return type, and for interfacing 422 * do; but those macros have inappropriate return type, and for interfacing
407 * from other programming languages, C macros aren't much of a help anyway. */ 423 * from other programming languages, C macros aren't much of a help anyway. */
408size_t BIO_ctrl_pending(BIO *bio) 424size_t
409 { 425BIO_ctrl_pending(BIO *bio)
426{
410 return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); 427 return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL);
411 } 428}
412 429
413size_t BIO_ctrl_wpending(BIO *bio) 430size_t
414 { 431BIO_ctrl_wpending(BIO *bio)
432{
415 return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); 433 return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL);
416 } 434}
417 435
418 436
419/* put the 'bio' on the end of b's list of operators */ 437/* put the 'bio' on the end of b's list of operators */
420BIO *BIO_push(BIO *b, BIO *bio) 438BIO
421 { 439*BIO_push(BIO *b, BIO *bio)
440{
422 BIO *lb; 441 BIO *lb;
423 442
424 if (b == NULL) return(bio); 443 if (b == NULL)
425 lb=b; 444 return (bio);
445 lb = b;
426 while (lb->next_bio != NULL) 446 while (lb->next_bio != NULL)
427 lb=lb->next_bio; 447 lb = lb->next_bio;
428 lb->next_bio=bio; 448 lb->next_bio = bio;
429 if (bio != NULL) 449 if (bio != NULL)
430 bio->prev_bio=lb; 450 bio->prev_bio = lb;
431 /* called to do internal processing */ 451 /* called to do internal processing */
432 BIO_ctrl(b,BIO_CTRL_PUSH,0,lb); 452 BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb);
433 return(b); 453 return (b);
434 } 454}
435 455
436/* Remove the first and return the rest */ 456/* Remove the first and return the rest */
437BIO *BIO_pop(BIO *b) 457BIO
438 { 458*BIO_pop(BIO *b)
459{
439 BIO *ret; 460 BIO *ret;
440 461
441 if (b == NULL) return(NULL); 462 if (b == NULL)
442 ret=b->next_bio; 463 return (NULL);
464 ret = b->next_bio;
443 465
444 BIO_ctrl(b,BIO_CTRL_POP,0,b); 466 BIO_ctrl(b, BIO_CTRL_POP, 0, b);
445 467
446 if (b->prev_bio != NULL) 468 if (b->prev_bio != NULL)
447 b->prev_bio->next_bio=b->next_bio; 469 b->prev_bio->next_bio = b->next_bio;
448 if (b->next_bio != NULL) 470 if (b->next_bio != NULL)
449 b->next_bio->prev_bio=b->prev_bio; 471 b->next_bio->prev_bio = b->prev_bio;
450 472
451 b->next_bio=NULL; 473 b->next_bio = NULL;
452 b->prev_bio=NULL; 474 b->prev_bio = NULL;
453 return(ret); 475 return (ret);
454 } 476}
455 477
456BIO *BIO_get_retry_BIO(BIO *bio, int *reason) 478BIO
457 { 479*BIO_get_retry_BIO(BIO *bio, int *reason)
458 BIO *b,*last; 480{
481 BIO *b, *last;
459 482
460 b=last=bio; 483 b = last = bio;
461 for (;;) 484 for (;;) {
462 {
463 if (!BIO_should_retry(b)) break; 485 if (!BIO_should_retry(b)) break;
464 last=b; 486 last = b;
465 b=b->next_bio; 487 b = b->next_bio;
466 if (b == NULL) break; 488 if (b == NULL)
467 } 489 break;
468 if (reason != NULL) *reason=last->retry_reason; 490 }
469 return(last); 491 if (reason != NULL)
470 } 492 *reason = last->retry_reason;
493 return (last);
494}
471 495
472int BIO_get_retry_reason(BIO *bio) 496int
473 { 497BIO_get_retry_reason(BIO *bio)
474 return(bio->retry_reason); 498{
475 } 499 return (bio->retry_reason);
500}
476 501
477BIO *BIO_find_type(BIO *bio, int type) 502BIO
478 { 503*BIO_find_type(BIO *bio, int type)
479 int mt,mask; 504{
480 505 int mt, mask;
481 if(!bio) return NULL; 506
482 mask=type&0xff; 507 if (!bio)
483 do { 508 return NULL;
484 if (bio->method != NULL) 509 mask = type & 0xff;
485 { 510 do {
486 mt=bio->method->type; 511 if (bio->method != NULL) {
487 512 mt = bio->method->type;
488 if (!mask) 513 if (!mask) {
489 { 514 if (mt & type)
490 if (mt & type) return(bio); 515 return (bio);
491 } 516 } else if (mt == type)
492 else if (mt == type) 517 return (bio);
493 return(bio); 518 }
494 } 519 bio = bio->next_bio;
495 bio=bio->next_bio; 520 } while (bio != NULL);
496 } while (bio != NULL); 521 return (NULL);
497 return(NULL); 522}
498 }
499 523
500BIO *BIO_next(BIO *b) 524BIO
501 { 525*BIO_next(BIO *b)
502 if(!b) return NULL; 526{
527 if (!b)
528 return NULL;
503 return b->next_bio; 529 return b->next_bio;
504 } 530}
505 531
506void BIO_free_all(BIO *bio) 532void
507 { 533BIO_free_all(BIO *bio)
534{
508 BIO *b; 535 BIO *b;
509 int ref; 536 int ref;
510 537
511 while (bio != NULL) 538 while (bio != NULL) {
512 { 539 b = bio;
513 b=bio; 540 ref = b->references;
514 ref=b->references; 541 bio = bio->next_bio;
515 bio=bio->next_bio;
516 BIO_free(b); 542 BIO_free(b);
517 /* Since ref count > 1, don't free anyone else. */ 543 /* Since ref count > 1, don't free anyone else. */
518 if (ref > 1) break; 544 if (ref > 1)
519 } 545 break;
520 } 546 }
547}
521 548
522BIO *BIO_dup_chain(BIO *in) 549BIO
523 { 550*BIO_dup_chain(BIO *in)
524 BIO *ret=NULL,*eoc=NULL,*bio,*new_bio; 551{
552 BIO *ret = NULL, *eoc = NULL, *bio, *new_bio;
525 553
526 for (bio=in; bio != NULL; bio=bio->next_bio) 554 for (bio = in; bio != NULL; bio = bio->next_bio) {
527 { 555 if ((new_bio = BIO_new(bio->method)) == NULL) goto err;
528 if ((new_bio=BIO_new(bio->method)) == NULL) goto err; 556 new_bio->callback = bio->callback;
529 new_bio->callback=bio->callback; 557 new_bio->cb_arg = bio->cb_arg;
530 new_bio->cb_arg=bio->cb_arg; 558 new_bio->init = bio->init;
531 new_bio->init=bio->init; 559 new_bio->shutdown = bio->shutdown;
532 new_bio->shutdown=bio->shutdown; 560 new_bio->flags = bio->flags;
533 new_bio->flags=bio->flags;
534 561
535 /* This will let SSL_s_sock() work with stdin/stdout */ 562 /* This will let SSL_s_sock() work with stdin/stdout */
536 new_bio->num=bio->num; 563 new_bio->num = bio->num;
537 564
538 if (!BIO_dup_state(bio,(char *)new_bio)) 565 if (!BIO_dup_state(bio,(char *)new_bio)) {
539 {
540 BIO_free(new_bio); 566 BIO_free(new_bio);
541 goto err; 567 goto err;
542 } 568 }
543 569
544 /* copy app data */ 570 /* copy app data */
545 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, 571 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO,
546 &bio->ex_data)) 572 &new_bio->ex_data, &bio->ex_data))
547 goto err; 573 goto err;
548 574
549 if (ret == NULL) 575 if (ret == NULL) {
550 { 576 eoc = new_bio;
551 eoc=new_bio; 577 ret = eoc;
552 ret=eoc; 578 } else {
553 } 579 BIO_push(eoc, new_bio);
554 else 580 eoc = new_bio;
555 {
556 BIO_push(eoc,new_bio);
557 eoc=new_bio;
558 }
559 } 581 }
560 return(ret); 582 }
583 return (ret);
561err: 584err:
562 if (ret != NULL) 585 if (ret != NULL)
563 BIO_free(ret); 586 BIO_free(ret);
564 return(NULL); 587 return (NULL);
565 }
566 588
567void BIO_copy_next_retry(BIO *b) 589}
568 {
569 BIO_set_flags(b,BIO_get_retry_flags(b->next_bio));
570 b->retry_reason=b->next_bio->retry_reason;
571 }
572 590
573int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 591void
574 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) 592BIO_copy_next_retry(BIO *b)
575 { 593{
594 BIO_set_flags(b, BIO_get_retry_flags(b->next_bio));
595 b->retry_reason = b->next_bio->retry_reason;
596}
597
598int
599BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
600 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
601{
576 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, 602 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp,
577 new_func, dup_func, free_func); 603 new_func, dup_func, free_func);
578 } 604}
579 605
580int BIO_set_ex_data(BIO *bio, int idx, void *data) 606int
581 { 607BIO_set_ex_data(BIO *bio, int idx, void *data)
582 return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); 608{
583 } 609 return (CRYPTO_set_ex_data(&(bio->ex_data), idx, data));
610}
584 611
585void *BIO_get_ex_data(BIO *bio, int idx) 612void
586 { 613*BIO_get_ex_data(BIO *bio, int idx)
587 return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); 614{
588 } 615 return (CRYPTO_get_ex_data(&(bio->ex_data), idx));
616}
589 617
590unsigned long BIO_number_read(BIO *bio) 618unsigned long
619BIO_number_read(BIO *bio)
591{ 620{
592 if(bio) return bio->num_read; 621 if (bio)
622 return bio->num_read;
593 return 0; 623 return 0;
594} 624}
595 625
596unsigned long BIO_number_written(BIO *bio) 626unsigned long
627BIO_number_written(BIO *bio)
597{ 628{
598 if(bio) return bio->num_write; 629 if (bio)
630 return bio->num_write;
599 return 0; 631 return 0;
600} 632}
601 633
diff --git a/src/lib/libcrypto/bio/bss_acpt.c b/src/lib/libcrypto/bio/bss_acpt.c
index 04bfb6fb9d..d772515d64 100644
--- a/src/lib/libcrypto/bio/bss_acpt.c
+++ b/src/lib/libcrypto/bio/bss_acpt.c
@@ -75,8 +75,7 @@
75#undef FIONBIO 75#undef FIONBIO
76#endif 76#endif
77 77
78typedef struct bio_accept_st 78typedef struct bio_accept_st {
79 {
80 int state; 79 int state;
81 char *param_addr; 80 char *param_addr;
82 81
@@ -90,7 +89,7 @@ typedef struct bio_accept_st
90 * If 2, always use SO_REUSEADDR. */ 89 * If 2, always use SO_REUSEADDR. */
91 int bind_mode; 90 int bind_mode;
92 BIO *bio_chain; 91 BIO *bio_chain;
93 } BIO_ACCEPT; 92} BIO_ACCEPT;
94 93
95static int acpt_write(BIO *h, const char *buf, int num); 94static int acpt_write(BIO *h, const char *buf, int num);
96static int acpt_read(BIO *h, char *buf, int size); 95static int acpt_read(BIO *h, char *buf, int size);
@@ -107,8 +106,7 @@ static void BIO_ACCEPT_free(BIO_ACCEPT *a);
107#define ACPT_S_GET_ACCEPT_SOCKET 2 106#define ACPT_S_GET_ACCEPT_SOCKET 2
108#define ACPT_S_OK 3 107#define ACPT_S_OK 3
109 108
110static BIO_METHOD methods_acceptp= 109static BIO_METHOD methods_acceptp = {
111 {
112 BIO_TYPE_ACCEPT, 110 BIO_TYPE_ACCEPT,
113 "socket accept", 111 "socket accept",
114 acpt_write, 112 acpt_write,
@@ -119,321 +117,313 @@ static BIO_METHOD methods_acceptp=
119 acpt_new, 117 acpt_new,
120 acpt_free, 118 acpt_free,
121 NULL, 119 NULL,
122 }; 120};
123 121
124BIO_METHOD *BIO_s_accept(void) 122BIO_METHOD
125 { 123*BIO_s_accept(void)
126 return(&methods_acceptp); 124{
127 } 125 return (&methods_acceptp);
126}
128 127
129static int acpt_new(BIO *bi) 128static int
130 { 129acpt_new(BIO *bi)
130{
131 BIO_ACCEPT *ba; 131 BIO_ACCEPT *ba;
132 132
133 bi->init=0; 133 bi->init = 0;
134 bi->num=-1; 134 bi->num = -1;
135 bi->flags=0; 135 bi->flags = 0;
136 if ((ba=BIO_ACCEPT_new()) == NULL) 136 if ((ba = BIO_ACCEPT_new()) == NULL)
137 return(0); 137 return (0);
138 bi->ptr=(char *)ba; 138 bi->ptr = (char *)ba;
139 ba->state=ACPT_S_BEFORE; 139 ba->state = ACPT_S_BEFORE;
140 bi->shutdown=1; 140 bi->shutdown = 1;
141 return(1); 141 return (1);
142 } 142}
143 143
144static BIO_ACCEPT *BIO_ACCEPT_new(void) 144static BIO_ACCEPT
145 { 145*BIO_ACCEPT_new(void)
146{
146 BIO_ACCEPT *ret; 147 BIO_ACCEPT *ret;
147 148
148 if ((ret=(BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) 149 if ((ret = (BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL)
149 return(NULL); 150 return (NULL);
150 151
151 memset(ret,0,sizeof(BIO_ACCEPT)); 152 memset(ret, 0, sizeof(BIO_ACCEPT));
152 ret->accept_sock=-1; 153 ret->accept_sock = -1;
153 ret->bind_mode=BIO_BIND_NORMAL; 154 ret->bind_mode = BIO_BIND_NORMAL;
154 return(ret); 155 return (ret);
155 } 156}
156 157
157static void BIO_ACCEPT_free(BIO_ACCEPT *a) 158static void
158 { 159BIO_ACCEPT_free(BIO_ACCEPT *a)
159 if(a == NULL) 160{
160 return; 161 if (a == NULL)
161 162 return;
162 if (a->param_addr != NULL) OPENSSL_free(a->param_addr); 163
163 if (a->addr != NULL) OPENSSL_free(a->addr); 164 if (a->param_addr != NULL)
164 if (a->bio_chain != NULL) BIO_free(a->bio_chain); 165 OPENSSL_free(a->param_addr);
166 if (a->addr != NULL)
167 OPENSSL_free(a->addr);
168 if (a->bio_chain != NULL)
169 BIO_free(a->bio_chain);
165 OPENSSL_free(a); 170 OPENSSL_free(a);
166 } 171}
167 172
168static void acpt_close_socket(BIO *bio) 173static void
169 { 174acpt_close_socket(BIO *bio)
175{
170 BIO_ACCEPT *c; 176 BIO_ACCEPT *c;
171 177
172 c=(BIO_ACCEPT *)bio->ptr; 178 c = (BIO_ACCEPT *)bio->ptr;
173 if (c->accept_sock != -1) 179 if (c->accept_sock != -1) {
174 {
175 shutdown(c->accept_sock, SHUT_RDWR); 180 shutdown(c->accept_sock, SHUT_RDWR);
176 close(c->accept_sock); 181 close(c->accept_sock);
177 c->accept_sock=-1; 182 c->accept_sock = -1;
178 bio->num=-1; 183 bio->num = -1;
179 }
180 } 184 }
185}
181 186
182static int acpt_free(BIO *a) 187static int
183 { 188acpt_free(BIO *a)
189{
184 BIO_ACCEPT *data; 190 BIO_ACCEPT *data;
185 191
186 if (a == NULL) return(0); 192 if (a == NULL)
187 data=(BIO_ACCEPT *)a->ptr; 193 return (0);
188 194 data = (BIO_ACCEPT *)a->ptr;
189 if (a->shutdown) 195
190 { 196 if (a->shutdown) {
191 acpt_close_socket(a); 197 acpt_close_socket(a);
192 BIO_ACCEPT_free(data); 198 BIO_ACCEPT_free(data);
193 a->ptr=NULL; 199 a->ptr = NULL;
194 a->flags=0; 200 a->flags = 0;
195 a->init=0; 201 a->init = 0;
196 }
197 return(1);
198 } 202 }
199 203 return (1);
200static int acpt_state(BIO *b, BIO_ACCEPT *c) 204}
201 { 205
202 BIO *bio=NULL,*dbio; 206static int
203 int s= -1; 207acpt_state(BIO *b, BIO_ACCEPT *c)
208{
209 BIO *bio = NULL, *dbio;
210 int s = -1;
204 int i; 211 int i;
205 212
206again: 213again:
207 switch (c->state) 214 switch (c->state) {
208 {
209 case ACPT_S_BEFORE: 215 case ACPT_S_BEFORE:
210 if (c->param_addr == NULL) 216 if (c->param_addr == NULL) {
211 { 217 BIOerr(BIO_F_ACPT_STATE, BIO_R_NO_ACCEPT_PORT_SPECIFIED);
212 BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); 218 return (-1);
213 return(-1); 219 }
214 } 220 s = BIO_get_accept_socket(c->param_addr, c->bind_mode);
215 s=BIO_get_accept_socket(c->param_addr,c->bind_mode);
216 if (s == -1) 221 if (s == -1)
217 return(-1); 222 return (-1);
218 223
219 if (c->accept_nbio) 224 if (c->accept_nbio) {
220 { 225 if (!BIO_socket_nbio(s, 1)) {
221 if (!BIO_socket_nbio(s,1))
222 {
223 close(s); 226 close(s);
224 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); 227 BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET);
225 return(-1); 228 return (-1);
226 }
227 } 229 }
228 c->accept_sock=s; 230 }
229 b->num=s; 231 c->accept_sock = s;
230 c->state=ACPT_S_GET_ACCEPT_SOCKET; 232 b->num = s;
231 return(1); 233 c->state = ACPT_S_GET_ACCEPT_SOCKET;
234 return (1);
232 /* break; */ 235 /* break; */
233 case ACPT_S_GET_ACCEPT_SOCKET: 236 case ACPT_S_GET_ACCEPT_SOCKET:
234 if (b->next_bio != NULL) 237 if (b->next_bio != NULL) {
235 { 238 c->state = ACPT_S_OK;
236 c->state=ACPT_S_OK;
237 goto again; 239 goto again;
238 } 240 }
239 BIO_clear_retry_flags(b); 241 BIO_clear_retry_flags(b);
240 b->retry_reason=0; 242 b->retry_reason = 0;
241 i=BIO_accept(c->accept_sock,&(c->addr)); 243 i = BIO_accept(c->accept_sock, &(c->addr));
242 244
243 /* -2 return means we should retry */ 245 /* -2 return means we should retry */
244 if(i == -2) 246 if (i == -2) {
245 {
246 BIO_set_retry_special(b); 247 BIO_set_retry_special(b);
247 b->retry_reason=BIO_RR_ACCEPT; 248 b->retry_reason = BIO_RR_ACCEPT;
248 return -1; 249 return -1;
249 } 250 }
250 251
251 if (i < 0) return(i); 252 if (i < 0)
253 return (i);
252 254
253 bio=BIO_new_socket(i,BIO_CLOSE); 255 bio = BIO_new_socket(i, BIO_CLOSE);
254 if (bio == NULL) goto err; 256 if (bio == NULL)
257 goto err;
255 258
256 BIO_set_callback(bio,BIO_get_callback(b)); 259 BIO_set_callback(bio, BIO_get_callback(b));
257 BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); 260 BIO_set_callback_arg(bio, BIO_get_callback_arg(b));
258 261
259 if (c->nbio) 262 if (c->nbio) {
260 { 263 if (!BIO_socket_nbio(i, 1)) {
261 if (!BIO_socket_nbio(i,1)) 264 BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
262 {
263 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
264 goto err; 265 goto err;
265 }
266 } 266 }
267 }
267 268
268 /* If the accept BIO has an bio_chain, we dup it and 269 /* If the accept BIO has an bio_chain, we dup it and
269 * put the new socket at the end. */ 270 * put the new socket at the end. */
270 if (c->bio_chain != NULL) 271 if (c->bio_chain != NULL) {
271 { 272 if ((dbio = BIO_dup_chain(c->bio_chain)) == NULL)
272 if ((dbio=BIO_dup_chain(c->bio_chain)) == NULL)
273 goto err; 273 goto err;
274 if (!BIO_push(dbio,bio)) goto err; 274 if (!BIO_push(dbio, bio)) goto err;
275 bio=dbio; 275 bio = dbio;
276 } 276 }
277 if (BIO_push(b,bio) == NULL) goto err; 277 if (BIO_push(b, bio)
278 == NULL) goto err;
279
280 c->state = ACPT_S_OK;
281 return (1);
278 282
279 c->state=ACPT_S_OK;
280 return(1);
281err: 283err:
282 if (bio != NULL) 284 if (bio != NULL)
283 BIO_free(bio); 285 BIO_free(bio);
284 else if (s >= 0) 286 else if (s >= 0)
285 close(s); 287 close(s);
286 return(0); 288 return (0);
287 /* break; */ 289 /* break; */
288 case ACPT_S_OK: 290 case ACPT_S_OK:
289 if (b->next_bio == NULL) 291 if (b->next_bio == NULL) {
290 { 292 c->state = ACPT_S_GET_ACCEPT_SOCKET;
291 c->state=ACPT_S_GET_ACCEPT_SOCKET;
292 goto again; 293 goto again;
293 } 294 }
294 return(1); 295 return (1);
295 /* break; */ 296 /* break; */
296 default: 297 default:
297 return(0); 298 return (0);
298 /* break; */ 299 /* break; */
299 }
300
301 } 300 }
301}
302 302
303static int acpt_read(BIO *b, char *out, int outl) 303static int
304 { 304acpt_read(BIO *b, char *out, int outl)
305 int ret=0; 305{
306 int ret = 0;
306 BIO_ACCEPT *data; 307 BIO_ACCEPT *data;
307 308
308 BIO_clear_retry_flags(b); 309 BIO_clear_retry_flags(b);
309 data=(BIO_ACCEPT *)b->ptr; 310 data = (BIO_ACCEPT *)b->ptr;
310 311
311 while (b->next_bio == NULL) 312 while (b->next_bio == NULL) {
312 { 313 ret = acpt_state(b, data);
313 ret=acpt_state(b,data); 314 if (ret <= 0)
314 if (ret <= 0) return(ret); 315 return (ret);
315 } 316 }
316 317
317 ret=BIO_read(b->next_bio,out,outl); 318 ret = BIO_read(b->next_bio, out, outl);
318 BIO_copy_next_retry(b); 319 BIO_copy_next_retry(b);
319 return(ret); 320 return (ret);
320 } 321}
321 322
322static int acpt_write(BIO *b, const char *in, int inl) 323static int
323 { 324acpt_write(BIO *b, const char *in, int inl)
325{
324 int ret; 326 int ret;
325 BIO_ACCEPT *data; 327 BIO_ACCEPT *data;
326 328
327 BIO_clear_retry_flags(b); 329 BIO_clear_retry_flags(b);
328 data=(BIO_ACCEPT *)b->ptr; 330 data = (BIO_ACCEPT *)b->ptr;
329 331
330 while (b->next_bio == NULL) 332 while (b->next_bio == NULL) {
331 { 333 ret = acpt_state(b, data);
332 ret=acpt_state(b,data); 334 if (ret <= 0)
333 if (ret <= 0) return(ret); 335 return (ret);
334 } 336 }
335 337
336 ret=BIO_write(b->next_bio,in,inl); 338 ret = BIO_write(b->next_bio, in, inl);
337 BIO_copy_next_retry(b); 339 BIO_copy_next_retry(b);
338 return(ret); 340 return (ret);
339 } 341}
340 342
341static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) 343static long
342 { 344acpt_ctrl(BIO *b, int cmd, long num, void *ptr)
345{
343 int *ip; 346 int *ip;
344 long ret=1; 347 long ret = 1;
345 BIO_ACCEPT *data; 348 BIO_ACCEPT *data;
346 char **pp; 349 char **pp;
347 350
348 data=(BIO_ACCEPT *)b->ptr; 351 data = (BIO_ACCEPT *)b->ptr;
349 352
350 switch (cmd) 353 switch (cmd) {
351 {
352 case BIO_CTRL_RESET: 354 case BIO_CTRL_RESET:
353 ret=0; 355 ret = 0;
354 data->state=ACPT_S_BEFORE; 356 data->state = ACPT_S_BEFORE;
355 acpt_close_socket(b); 357 acpt_close_socket(b);
356 b->flags=0; 358 b->flags = 0;
357 break; 359 break;
358 case BIO_C_DO_STATE_MACHINE: 360 case BIO_C_DO_STATE_MACHINE:
359 /* use this one to start the connection */ 361 /* use this one to start the connection */
360 ret=(long)acpt_state(b,data); 362 ret = (long)acpt_state(b, data);
361 break; 363 break;
362 case BIO_C_SET_ACCEPT: 364 case BIO_C_SET_ACCEPT:
363 if (ptr != NULL) 365 if (ptr != NULL) {
364 { 366 if (num == 0) {
365 if (num == 0) 367 b->init = 1;
366 {
367 b->init=1;
368 if (data->param_addr != NULL) 368 if (data->param_addr != NULL)
369 OPENSSL_free(data->param_addr); 369 OPENSSL_free(data->param_addr);
370 data->param_addr=BUF_strdup(ptr); 370 data->param_addr = BUF_strdup(ptr);
371 } 371 } else if (num == 1) {
372 else if (num == 1) 372 data->accept_nbio = (ptr != NULL);
373 { 373 } else if (num == 2) {
374 data->accept_nbio=(ptr != NULL);
375 }
376 else if (num == 2)
377 {
378 if (data->bio_chain != NULL) 374 if (data->bio_chain != NULL)
379 BIO_free(data->bio_chain); 375 BIO_free(data->bio_chain);
380 data->bio_chain=(BIO *)ptr; 376 data->bio_chain = (BIO *)ptr;
381 }
382 } 377 }
378 }
383 break; 379 break;
384 case BIO_C_SET_NBIO: 380 case BIO_C_SET_NBIO:
385 data->nbio=(int)num; 381 data->nbio = (int)num;
386 break; 382 break;
387 case BIO_C_SET_FD: 383 case BIO_C_SET_FD:
388 b->init=1; 384 b->init = 1;
389 b->num= *((int *)ptr); 385 b->num= *((int *)ptr);
390 data->accept_sock=b->num; 386 data->accept_sock = b->num;
391 data->state=ACPT_S_GET_ACCEPT_SOCKET; 387 data->state = ACPT_S_GET_ACCEPT_SOCKET;
392 b->shutdown=(int)num; 388 b->shutdown = (int)num;
393 b->init=1; 389 b->init = 1;
394 break; 390 break;
395 case BIO_C_GET_FD: 391 case BIO_C_GET_FD:
396 if (b->init) 392 if (b->init) {
397 { 393 ip = (int *)ptr;
398 ip=(int *)ptr;
399 if (ip != NULL) 394 if (ip != NULL)
400 *ip=data->accept_sock; 395 *ip = data->accept_sock;
401 ret=data->accept_sock; 396 ret = data->accept_sock;
402 } 397 } else
403 else 398 ret = -1;
404 ret= -1;
405 break; 399 break;
406 case BIO_C_GET_ACCEPT: 400 case BIO_C_GET_ACCEPT:
407 if (b->init) 401 if (b->init) {
408 { 402 if (ptr != NULL) {
409 if (ptr != NULL) 403 pp = (char **)ptr;
410 { 404 *pp = data->param_addr;
411 pp=(char **)ptr; 405 } else
412 *pp=data->param_addr; 406 ret = -1;
413 } 407 } else
414 else 408 ret = -1;
415 ret= -1;
416 }
417 else
418 ret= -1;
419 break; 409 break;
420 case BIO_CTRL_GET_CLOSE: 410 case BIO_CTRL_GET_CLOSE:
421 ret=b->shutdown; 411 ret = b->shutdown;
422 break; 412 break;
423 case BIO_CTRL_SET_CLOSE: 413 case BIO_CTRL_SET_CLOSE:
424 b->shutdown=(int)num; 414 b->shutdown = (int)num;
425 break; 415 break;
426 case BIO_CTRL_PENDING: 416 case BIO_CTRL_PENDING:
427 case BIO_CTRL_WPENDING: 417 case BIO_CTRL_WPENDING:
428 ret=0; 418 ret = 0;
429 break; 419 break;
430 case BIO_CTRL_FLUSH: 420 case BIO_CTRL_FLUSH:
431 break; 421 break;
432 case BIO_C_SET_BIND_MODE: 422 case BIO_C_SET_BIND_MODE:
433 data->bind_mode=(int)num; 423 data->bind_mode = (int)num;
434 break; 424 break;
435 case BIO_C_GET_BIND_MODE: 425 case BIO_C_GET_BIND_MODE:
436 ret=(long)data->bind_mode; 426 ret = (long)data->bind_mode;
437 break; 427 break;
438 case BIO_CTRL_DUP: 428 case BIO_CTRL_DUP:
439/* dbio=(BIO *)ptr; 429/* dbio=(BIO *)ptr;
@@ -441,38 +431,41 @@ static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr)
441 BIO_set_port(dbio,data->param_port); 431 BIO_set_port(dbio,data->param_port);
442 if (data->param_hostname) 432 if (data->param_hostname)
443 BIO_set_hostname(dbio,data->param_hostname); 433 BIO_set_hostname(dbio,data->param_hostname);
444 BIO_set_nbio(dbio,data->nbio); */ 434 BIO_set_nbio(dbio,data->nbio);
435*/
445 break; 436 break;
446 437
447 default: 438 default:
448 ret=0; 439 ret = 0;
449 break; 440 break;
450 }
451 return(ret);
452 } 441 }
453 442 return (ret);
454static int acpt_puts(BIO *bp, const char *str) 443}
455 { 444
456 int n,ret; 445static int
457 446acpt_puts(BIO *bp, const char *str)
458 n=strlen(str); 447{
459 ret=acpt_write(bp,str,n); 448 int n, ret;
460 return(ret); 449
461 } 450 n = strlen(str);
462 451 ret = acpt_write(bp, str, n);
463BIO *BIO_new_accept(char *str) 452 return (ret);
464 { 453}
454
455BIO
456*BIO_new_accept(char *str)
457{
465 BIO *ret; 458 BIO *ret;
466 459
467 ret=BIO_new(BIO_s_accept()); 460 ret = BIO_new(BIO_s_accept());
468 if (ret == NULL) return(NULL); 461 if (ret == NULL)
469 if (BIO_set_accept_port(ret,str)) 462 return (NULL);
470 return(ret); 463 if (BIO_set_accept_port(ret, str))
471 else 464 return (ret);
472 { 465 else {
473 BIO_free(ret); 466 BIO_free(ret);
474 return(NULL); 467 return (NULL);
475 }
476 } 468 }
469}
477 470
478#endif 471#endif
diff --git a/src/lib/libcrypto/bio/bss_bio.c b/src/lib/libcrypto/bio/bss_bio.c
index 52ef0ebcb3..a74fcfdabc 100644
--- a/src/lib/libcrypto/bio/bss_bio.c
+++ b/src/lib/libcrypto/bio/bss_bio.c
@@ -103,8 +103,7 @@ static int bio_puts(BIO *bio, const char *str);
103static int bio_make_pair(BIO *bio1, BIO *bio2); 103static int bio_make_pair(BIO *bio1, BIO *bio2);
104static void bio_destroy_pair(BIO *bio); 104static void bio_destroy_pair(BIO *bio);
105 105
106static BIO_METHOD methods_biop = 106static BIO_METHOD methods_biop = {
107{
108 BIO_TYPE_BIO, 107 BIO_TYPE_BIO,
109 "BIO pair", 108 "BIO pair",
110 bio_write, 109 bio_write,
@@ -117,50 +116,51 @@ static BIO_METHOD methods_biop =
117 NULL /* no bio_callback_ctrl */ 116 NULL /* no bio_callback_ctrl */
118}; 117};
119 118
120BIO_METHOD *BIO_s_bio(void) 119BIO_METHOD
121 { 120*BIO_s_bio(void)
121{
122 return &methods_biop; 122 return &methods_biop;
123 } 123}
124
125struct bio_bio_st {
126 BIO *peer; /* NULL if buf == NULL.
127 * If peer != NULL, then peer->ptr is also a bio_bio_st,
128 * and its "peer" member points back to us.
129 * peer != NULL iff init != 0 in the BIO. */
124 130
125struct bio_bio_st
126{
127 BIO *peer; /* NULL if buf == NULL.
128 * If peer != NULL, then peer->ptr is also a bio_bio_st,
129 * and its "peer" member points back to us.
130 * peer != NULL iff init != 0 in the BIO. */
131
132 /* This is for what we write (i.e. reading uses peer's struct): */ 131 /* This is for what we write (i.e. reading uses peer's struct): */
133 int closed; /* valid iff peer != NULL */ 132 int closed; /* valid iff peer != NULL */
134 size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ 133 size_t len; /* valid iff buf != NULL; 0 if peer == NULL */
135 size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ 134 size_t offset; /* valid iff buf != NULL; 0 if len == 0 */
136 size_t size; 135 size_t size;
137 char *buf; /* "size" elements (if != NULL) */ 136 char *buf; /* "size" elements (if != NULL) */
138 137
139 size_t request; /* valid iff peer != NULL; 0 if len != 0, 138 size_t request; /* valid iff peer != NULL; 0 if len != 0,
140 * otherwise set by peer to number of bytes 139 * otherwise set by peer to number of bytes
141 * it (unsuccessfully) tried to read, 140 * it (unsuccessfully) tried to read,
142 * never more than buffer space (size-len) warrants. */ 141 * never more than buffer space (size-len) warrants. */
143}; 142};
144 143
145static int bio_new(BIO *bio) 144static int
146 { 145bio_new(BIO *bio)
146{
147 struct bio_bio_st *b; 147 struct bio_bio_st *b;
148 148
149 b = OPENSSL_malloc(sizeof *b); 149 b = OPENSSL_malloc(sizeof *b);
150 if (b == NULL) 150 if (b == NULL)
151 return 0; 151 return 0;
152 152
153 b->peer = NULL; 153 b->peer = NULL;
154 b->size = 17*1024; /* enough for one TLS record (just a default) */ 154 b->size = 17 * 1024; /* enough for one TLS record (just a default) */
155 b->buf = NULL; 155 b->buf = NULL;
156 156
157 bio->ptr = b; 157 bio->ptr = b;
158 return 1; 158 return 1;
159 } 159}
160 160
161 161static int
162static int bio_free(BIO *bio) 162bio_free(BIO *bio)
163 { 163{
164 struct bio_bio_st *b; 164 struct bio_bio_st *b;
165 165
166 if (bio == NULL) 166 if (bio == NULL)
@@ -171,21 +171,21 @@ static int bio_free(BIO *bio)
171 171
172 if (b->peer) 172 if (b->peer)
173 bio_destroy_pair(bio); 173 bio_destroy_pair(bio);
174 174
175 if (b->buf != NULL) 175 if (b->buf != NULL) {
176 {
177 OPENSSL_free(b->buf); 176 OPENSSL_free(b->buf);
178 } 177 }
179 178
180 OPENSSL_free(b); 179 OPENSSL_free(b);
181 180
182 return 1; 181 return 1;
183 } 182}
184 183
185 184
186 185
187static int bio_read(BIO *bio, char *buf, int size_) 186static int
188 { 187bio_read(BIO *bio, char *buf, int size_)
188{
189 size_t size = size_; 189 size_t size = size_;
190 size_t rest; 190 size_t rest;
191 struct bio_bio_st *b, *peer_b; 191 struct bio_bio_st *b, *peer_b;
@@ -207,12 +207,10 @@ static int bio_read(BIO *bio, char *buf, int size_)
207 if (buf == NULL || size == 0) 207 if (buf == NULL || size == 0)
208 return 0; 208 return 0;
209 209
210 if (peer_b->len == 0) 210 if (peer_b->len == 0) {
211 {
212 if (peer_b->closed) 211 if (peer_b->closed)
213 return 0; /* writer has closed, and no data is left */ 212 return 0; /* writer has closed, and no data is left */
214 else 213 else {
215 {
216 BIO_set_retry_read(bio); /* buffer is empty */ 214 BIO_set_retry_read(bio); /* buffer is empty */
217 if (size <= peer_b->size) 215 if (size <= peer_b->size)
218 peer_b->request = size; 216 peer_b->request = size;
@@ -221,22 +219,22 @@ static int bio_read(BIO *bio, char *buf, int size_)
221 * deliver in one write */ 219 * deliver in one write */
222 peer_b->request = peer_b->size; 220 peer_b->request = peer_b->size;
223 return -1; 221 return -1;
224 }
225 } 222 }
223 }
226 224
227 /* we can read */ 225 /* we can read */
228 if (peer_b->len < size) 226 if (peer_b->len < size)
229 size = peer_b->len; 227 size = peer_b->len;
230 228
231 /* now read "size" bytes */ 229 /* now read "size" bytes */
232 230
233 rest = size; 231 rest = size;
234 232
235 assert(rest > 0); 233 assert(rest > 0);
236 do /* one or two iterations */ 234 do /* one or two iterations */
237 { 235 {
238 size_t chunk; 236 size_t chunk;
239 237
240 assert(rest <= peer_b->len); 238 assert(rest <= peer_b->len);
241 if (peer_b->offset + rest <= peer_b->size) 239 if (peer_b->offset + rest <= peer_b->size)
242 chunk = rest; 240 chunk = rest;
@@ -244,30 +242,26 @@ static int bio_read(BIO *bio, char *buf, int size_)
244 /* wrap around ring buffer */ 242 /* wrap around ring buffer */
245 chunk = peer_b->size - peer_b->offset; 243 chunk = peer_b->size - peer_b->offset;
246 assert(peer_b->offset + chunk <= peer_b->size); 244 assert(peer_b->offset + chunk <= peer_b->size);
247 245
248 memcpy(buf, peer_b->buf + peer_b->offset, chunk); 246 memcpy(buf, peer_b->buf + peer_b->offset, chunk);
249 247
250 peer_b->len -= chunk; 248 peer_b->len -= chunk;
251 if (peer_b->len) 249 if (peer_b->len) {
252 {
253 peer_b->offset += chunk; 250 peer_b->offset += chunk;
254 assert(peer_b->offset <= peer_b->size); 251 assert(peer_b->offset <= peer_b->size);
255 if (peer_b->offset == peer_b->size) 252 if (peer_b->offset == peer_b->size)
256 peer_b->offset = 0; 253 peer_b->offset = 0;
257 buf += chunk; 254 buf += chunk;
258 } 255 } else {
259 else
260 {
261 /* buffer now empty, no need to advance "buf" */ 256 /* buffer now empty, no need to advance "buf" */
262 assert(chunk == rest); 257 assert(chunk == rest);
263 peer_b->offset = 0; 258 peer_b->offset = 0;
264 }
265 rest -= chunk;
266 } 259 }
267 while (rest); 260 rest -= chunk;
268 261 } while (rest);
262
269 return size; 263 return size;
270 } 264}
271 265
272/* non-copying interface: provide pointer to available data in buffer 266/* non-copying interface: provide pointer to available data in buffer
273 * bio_nread0: return number of available bytes 267 * bio_nread0: return number of available bytes
@@ -277,32 +271,32 @@ static int bio_read(BIO *bio, char *buf, int size_)
277 */ 271 */
278/* WARNING: The non-copying interface is largely untested as of yet 272/* WARNING: The non-copying interface is largely untested as of yet
279 * and may contain bugs. */ 273 * and may contain bugs. */
280static ossl_ssize_t bio_nread0(BIO *bio, char **buf) 274static ossl_ssize_t
281 { 275bio_nread0(BIO *bio, char **buf)
276{
282 struct bio_bio_st *b, *peer_b; 277 struct bio_bio_st *b, *peer_b;
283 ossl_ssize_t num; 278 ossl_ssize_t num;
284 279
285 BIO_clear_retry_flags(bio); 280 BIO_clear_retry_flags(bio);
286 281
287 if (!bio->init) 282 if (!bio->init)
288 return 0; 283 return 0;
289 284
290 b = bio->ptr; 285 b = bio->ptr;
291 assert(b != NULL); 286 assert(b != NULL);
292 assert(b->peer != NULL); 287 assert(b->peer != NULL);
293 peer_b = b->peer->ptr; 288 peer_b = b->peer->ptr;
294 assert(peer_b != NULL); 289 assert(peer_b != NULL);
295 assert(peer_b->buf != NULL); 290 assert(peer_b->buf != NULL);
296 291
297 peer_b->request = 0; 292 peer_b->request = 0;
298 293
299 if (peer_b->len == 0) 294 if (peer_b->len == 0) {
300 {
301 char dummy; 295 char dummy;
302 296
303 /* avoid code duplication -- nothing available for reading */ 297 /* avoid code duplication -- nothing available for reading */
304 return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ 298 return bio_read(bio, &dummy, 1); /* returns 0 or -1 */
305 } 299 }
306 300
307 num = peer_b->len; 301 num = peer_b->len;
308 if (peer_b->size < peer_b->offset + num) 302 if (peer_b->size < peer_b->offset + num)
@@ -313,10 +307,11 @@ static ossl_ssize_t bio_nread0(BIO *bio, char **buf)
313 if (buf != NULL) 307 if (buf != NULL)
314 *buf = peer_b->buf + peer_b->offset; 308 *buf = peer_b->buf + peer_b->offset;
315 return num; 309 return num;
316 } 310}
317 311
318static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) 312static ossl_ssize_t
319 { 313bio_nread(BIO *bio, char **buf, size_t num_)
314{
320 struct bio_bio_st *b, *peer_b; 315 struct bio_bio_st *b, *peer_b;
321 ossl_ssize_t num, available; 316 ossl_ssize_t num, available;
322 317
@@ -335,22 +330,21 @@ static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_)
335 peer_b = b->peer->ptr; 330 peer_b = b->peer->ptr;
336 331
337 peer_b->len -= num; 332 peer_b->len -= num;
338 if (peer_b->len) 333 if (peer_b->len) {
339 {
340 peer_b->offset += num; 334 peer_b->offset += num;
341 assert(peer_b->offset <= peer_b->size); 335 assert(peer_b->offset <= peer_b->size);
342 if (peer_b->offset == peer_b->size) 336 if (peer_b->offset == peer_b->size)
343 peer_b->offset = 0; 337 peer_b->offset = 0;
344 } 338 } else
345 else
346 peer_b->offset = 0; 339 peer_b->offset = 0;
347 340
348 return num; 341 return num;
349 } 342}
350 343
351 344
352static int bio_write(BIO *bio, const char *buf, int num_) 345static int
353 { 346bio_write(BIO *bio, const char *buf, int num_)
347{
354 size_t num = num_; 348 size_t num = num_;
355 size_t rest; 349 size_t rest;
356 struct bio_bio_st *b; 350 struct bio_bio_st *b;
@@ -360,38 +354,37 @@ static int bio_write(BIO *bio, const char *buf, int num_)
360 if (!bio->init || buf == NULL || num == 0) 354 if (!bio->init || buf == NULL || num == 0)
361 return 0; 355 return 0;
362 356
363 b = bio->ptr; 357 b = bio->ptr;
358
364 assert(b != NULL); 359 assert(b != NULL);
365 assert(b->peer != NULL); 360 assert(b->peer != NULL);
366 assert(b->buf != NULL); 361 assert(b->buf != NULL);
367 362
368 b->request = 0; 363 b->request = 0;
369 if (b->closed) 364 if (b->closed) {
370 {
371 /* we already closed */ 365 /* we already closed */
372 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); 366 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE);
373 return -1; 367 return -1;
374 } 368 }
375 369
376 assert(b->len <= b->size); 370 assert(b->len <= b->size);
377 371
378 if (b->len == b->size) 372 if (b->len == b->size) {
379 {
380 BIO_set_retry_write(bio); /* buffer is full */ 373 BIO_set_retry_write(bio); /* buffer is full */
381 return -1; 374 return -1;
382 } 375 }
383 376
384 /* we can write */ 377 /* we can write */
385 if (num > b->size - b->len) 378 if (num > b->size - b->len)
386 num = b->size - b->len; 379 num = b->size - b->len;
387 380
388 /* now write "num" bytes */ 381 /* now write "num" bytes */
389 382
390 rest = num; 383 rest = num;
391 384
392 assert(rest > 0); 385 assert(rest > 0);
393 do /* one or two iterations */ 386 do /* one or two iterations */
394 { 387 {
395 size_t write_offset; 388 size_t write_offset;
396 size_t chunk; 389 size_t chunk;
397 390
@@ -407,20 +400,19 @@ static int bio_write(BIO *bio, const char *buf, int num_)
407 else 400 else
408 /* wrap around ring buffer */ 401 /* wrap around ring buffer */
409 chunk = b->size - write_offset; 402 chunk = b->size - write_offset;
410 403
411 memcpy(b->buf + write_offset, buf, chunk); 404 memcpy(b->buf + write_offset, buf, chunk);
412 405
413 b->len += chunk; 406 b->len += chunk;
414 407
415 assert(b->len <= b->size); 408 assert(b->len <= b->size);
416 409
417 rest -= chunk; 410 rest -= chunk;
418 buf += chunk; 411 buf += chunk;
419 } 412 } while (rest);
420 while (rest);
421 413
422 return num; 414 return num;
423 } 415}
424 416
425/* non-copying interface: provide pointer to region to write to 417/* non-copying interface: provide pointer to region to write to
426 * bio_nwrite0: check how much space is available 418 * bio_nwrite0: check how much space is available
@@ -428,8 +420,9 @@ static int bio_write(BIO *bio, const char *buf, int num_)
428 * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() 420 * (example usage: bio_nwrite0(), write to buffer, bio_nwrite()
429 * or just bio_nwrite(), write to buffer) 421 * or just bio_nwrite(), write to buffer)
430 */ 422 */
431static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) 423static ossl_ssize_t
432 { 424bio_nwrite0(BIO *bio, char **buf)
425{
433 struct bio_bio_st *b; 426 struct bio_bio_st *b;
434 size_t num; 427 size_t num;
435 size_t write_offset; 428 size_t write_offset;
@@ -439,25 +432,24 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf)
439 if (!bio->init) 432 if (!bio->init)
440 return 0; 433 return 0;
441 434
442 b = bio->ptr; 435 b = bio->ptr;
436
443 assert(b != NULL); 437 assert(b != NULL);
444 assert(b->peer != NULL); 438 assert(b->peer != NULL);
445 assert(b->buf != NULL); 439 assert(b->buf != NULL);
446 440
447 b->request = 0; 441 b->request = 0;
448 if (b->closed) 442 if (b->closed) {
449 {
450 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); 443 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE);
451 return -1; 444 return -1;
452 } 445 }
453 446
454 assert(b->len <= b->size); 447 assert(b->len <= b->size);
455 448
456 if (b->len == b->size) 449 if (b->len == b->size) {
457 {
458 BIO_set_retry_write(bio); 450 BIO_set_retry_write(bio);
459 return -1; 451 return -1;
460 } 452 }
461 453
462 num = b->size - b->len; 454 num = b->size - b->len;
463 write_offset = b->offset + b->len; 455 write_offset = b->offset + b->len;
@@ -474,10 +466,11 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf)
474 assert(write_offset + num <= b->size); 466 assert(write_offset + num <= b->size);
475 467
476 return num; 468 return num;
477 } 469}
478 470
479static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) 471static ossl_ssize_t
480 { 472bio_nwrite(BIO *bio, char **buf, size_t num_)
473{
481 struct bio_bio_st *b; 474 struct bio_bio_st *b;
482 ossl_ssize_t num, space; 475 ossl_ssize_t num, space;
483 476
@@ -497,46 +490,39 @@ static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_)
497 assert(b->len <= b->size); 490 assert(b->len <= b->size);
498 491
499 return num; 492 return num;
500 } 493}
501 494
502 495
503static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) 496static long
504 { 497bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
498{
505 long ret; 499 long ret;
506 struct bio_bio_st *b = bio->ptr; 500 struct bio_bio_st *b = bio->ptr;
507 501
508 assert(b != NULL); 502 assert(b != NULL);
509 503
510 switch (cmd) 504 switch (cmd) {
511 { 505 /* specific CTRL codes */
512 /* specific CTRL codes */
513 506
514 case BIO_C_SET_WRITE_BUF_SIZE: 507 case BIO_C_SET_WRITE_BUF_SIZE:
515 if (b->peer) 508 if (b->peer) {
516 {
517 BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); 509 BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE);
518 ret = 0; 510 ret = 0;
519 } 511 } else if (num == 0) {
520 else if (num == 0)
521 {
522 BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); 512 BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT);
523 ret = 0; 513 ret = 0;
524 } 514 } else {
525 else
526 {
527 size_t new_size = num; 515 size_t new_size = num;
528 516
529 if (b->size != new_size) 517 if (b->size != new_size) {
530 { 518 if (b->buf) {
531 if (b->buf)
532 {
533 OPENSSL_free(b->buf); 519 OPENSSL_free(b->buf);
534 b->buf = NULL; 520 b->buf = NULL;
535 }
536 b->size = new_size;
537 } 521 }
538 ret = 1; 522 b->size = new_size;
539 } 523 }
524 ret = 1;
525 }
540 break; 526 break;
541 527
542 case BIO_C_GET_WRITE_BUF_SIZE: 528 case BIO_C_GET_WRITE_BUF_SIZE:
@@ -545,15 +531,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
545 531
546 case BIO_C_MAKE_BIO_PAIR: 532 case BIO_C_MAKE_BIO_PAIR:
547 { 533 {
548 BIO *other_bio = ptr; 534 BIO *other_bio = ptr;
549 535
550 if (bio_make_pair(bio, other_bio)) 536 if (bio_make_pair(bio, other_bio))
551 ret = 1; 537 ret = 1;
552 else 538 else
553 ret = 0; 539 ret = 0;
554 } 540 }
555 break; 541 break;
556 542
557 case BIO_C_DESTROY_BIO_PAIR: 543 case BIO_C_DESTROY_BIO_PAIR:
558 /* Affects both BIOs in the pair -- call just once! 544 /* Affects both BIOs in the pair -- call just once!
559 * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ 545 * Or let BIO_free(bio1); BIO_free(bio2); do the job. */
@@ -596,12 +582,12 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
596 /* prepare for non-copying read */ 582 /* prepare for non-copying read */
597 ret = (long) bio_nread0(bio, ptr); 583 ret = (long) bio_nread0(bio, ptr);
598 break; 584 break;
599 585
600 case BIO_C_NREAD: 586 case BIO_C_NREAD:
601 /* non-copying read */ 587 /* non-copying read */
602 ret = (long) bio_nread(bio, ptr, (size_t) num); 588 ret = (long) bio_nread(bio, ptr, (size_t) num);
603 break; 589 break;
604 590
605 case BIO_C_NWRITE0: 591 case BIO_C_NWRITE0:
606 /* prepare for non-copying write */ 592 /* prepare for non-copying write */
607 ret = (long) bio_nwrite0(bio, ptr); 593 ret = (long) bio_nwrite0(bio, ptr);
@@ -611,18 +597,18 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
611 /* non-copying write */ 597 /* non-copying write */
612 ret = (long) bio_nwrite(bio, ptr, (size_t) num); 598 ret = (long) bio_nwrite(bio, ptr, (size_t) num);
613 break; 599 break;
614
615 600
616 /* standard CTRL codes follow */ 601
602 /* standard CTRL codes follow */
617 603
618 case BIO_CTRL_RESET: 604 case BIO_CTRL_RESET:
619 if (b->buf != NULL) 605 if (b->buf != NULL) {
620 {
621 b->len = 0; 606 b->len = 0;
622 b->offset = 0; 607 b->offset = 0;
623 } 608 }
624 ret = 0; 609 ret = 0;
625 break; 610 break;
611
626 612
627 case BIO_CTRL_GET_CLOSE: 613 case BIO_CTRL_GET_CLOSE:
628 ret = bio->shutdown; 614 ret = bio->shutdown;
@@ -634,13 +620,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
634 break; 620 break;
635 621
636 case BIO_CTRL_PENDING: 622 case BIO_CTRL_PENDING:
637 if (b->peer != NULL) 623 if (b->peer != NULL) {
638 {
639 struct bio_bio_st *peer_b = b->peer->ptr; 624 struct bio_bio_st *peer_b = b->peer->ptr;
640 625
641 ret = (long) peer_b->len; 626 ret = (long) peer_b->len;
642 } 627 } else
643 else
644 ret = 0; 628 ret = 0;
645 break; 629 break;
646 630
@@ -654,16 +638,16 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
654 case BIO_CTRL_DUP: 638 case BIO_CTRL_DUP:
655 /* See BIO_dup_chain for circumstances we have to expect. */ 639 /* See BIO_dup_chain for circumstances we have to expect. */
656 { 640 {
657 BIO *other_bio = ptr; 641 BIO *other_bio = ptr;
658 struct bio_bio_st *other_b; 642 struct bio_bio_st *other_b;
659 643
660 assert(other_bio != NULL); 644 assert(other_bio != NULL);
661 other_b = other_bio->ptr; 645 other_b = other_bio->ptr;
662 assert(other_b != NULL); 646 assert(other_b != NULL);
663 647
664 assert(other_b->buf == NULL); /* other_bio is always fresh */ 648 assert(other_b->buf == NULL); /* other_bio is always fresh */
665 649
666 other_b->size = b->size; 650 other_b->size = b->size;
667 } 651 }
668 652
669 ret = 1; 653 ret = 1;
@@ -675,34 +659,34 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
675 659
676 case BIO_CTRL_EOF: 660 case BIO_CTRL_EOF:
677 { 661 {
678 BIO *other_bio = ptr; 662 BIO *other_bio = ptr;
679 663
680 if (other_bio) 664 if (other_bio) {
681 { 665 struct bio_bio_st *other_b = other_bio->ptr;
682 struct bio_bio_st *other_b = other_bio->ptr; 666
683 667 assert(other_b != NULL);
684 assert(other_b != NULL); 668 ret = other_b->len == 0 && other_b->closed;
685 ret = other_b->len == 0 && other_b->closed; 669 } else
686 } 670 ret = 1;
687 else
688 ret = 1;
689 } 671 }
690 break; 672 break;
691 673
692 default: 674 default:
693 ret = 0; 675 ret = 0;
694 }
695 return ret;
696 } 676 }
677 return ret;
678}
697 679
698static int bio_puts(BIO *bio, const char *str) 680static int
699 { 681bio_puts(BIO *bio, const char *str)
682{
700 return bio_write(bio, str, strlen(str)); 683 return bio_write(bio, str, strlen(str));
701 } 684}
702 685
703 686
704static int bio_make_pair(BIO *bio1, BIO *bio2) 687static int
705 { 688bio_make_pair(BIO *bio1, BIO *bio2)
689{
706 struct bio_bio_st *b1, *b2; 690 struct bio_bio_st *b1, *b2;
707 691
708 assert(bio1 != NULL); 692 assert(bio1 != NULL);
@@ -710,37 +694,32 @@ static int bio_make_pair(BIO *bio1, BIO *bio2)
710 694
711 b1 = bio1->ptr; 695 b1 = bio1->ptr;
712 b2 = bio2->ptr; 696 b2 = bio2->ptr;
713 697
714 if (b1->peer != NULL || b2->peer != NULL) 698 if (b1->peer != NULL || b2->peer != NULL) {
715 {
716 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); 699 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE);
717 return 0; 700 return 0;
718 } 701 }
719 702
720 if (b1->buf == NULL) 703 if (b1->buf == NULL) {
721 {
722 b1->buf = OPENSSL_malloc(b1->size); 704 b1->buf = OPENSSL_malloc(b1->size);
723 if (b1->buf == NULL) 705 if (b1->buf == NULL) {
724 {
725 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); 706 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
726 return 0; 707 return 0;
727 } 708 }
728 b1->len = 0; 709 b1->len = 0;
729 b1->offset = 0; 710 b1->offset = 0;
730 } 711 }
731 712
732 if (b2->buf == NULL) 713 if (b2->buf == NULL) {
733 {
734 b2->buf = OPENSSL_malloc(b2->size); 714 b2->buf = OPENSSL_malloc(b2->size);
735 if (b2->buf == NULL) 715 if (b2->buf == NULL) {
736 {
737 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); 716 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
738 return 0; 717 return 0;
739 } 718 }
740 b2->len = 0; 719 b2->len = 0;
741 b2->offset = 0; 720 b2->offset = 0;
742 } 721 }
743 722
744 b1->peer = bio2; 723 b1->peer = bio2;
745 b1->closed = 0; 724 b1->closed = 0;
746 b1->request = 0; 725 b1->request = 0;
@@ -752,18 +731,17 @@ static int bio_make_pair(BIO *bio1, BIO *bio2)
752 bio2->init = 1; 731 bio2->init = 1;
753 732
754 return 1; 733 return 1;
755 } 734}
756 735
757static void bio_destroy_pair(BIO *bio) 736static void
758 { 737bio_destroy_pair(BIO *bio)
738{
759 struct bio_bio_st *b = bio->ptr; 739 struct bio_bio_st *b = bio->ptr;
760 740
761 if (b != NULL) 741 if (b != NULL) {
762 {
763 BIO *peer_bio = b->peer; 742 BIO *peer_bio = b->peer;
764 743
765 if (peer_bio != NULL) 744 if (peer_bio != NULL) {
766 {
767 struct bio_bio_st *peer_b = peer_bio->ptr; 745 struct bio_bio_st *peer_b = peer_bio->ptr;
768 746
769 assert(peer_b != NULL); 747 assert(peer_b != NULL);
@@ -774,151 +752,149 @@ static void bio_destroy_pair(BIO *bio)
774 assert(peer_b->buf != NULL); 752 assert(peer_b->buf != NULL);
775 peer_b->len = 0; 753 peer_b->len = 0;
776 peer_b->offset = 0; 754 peer_b->offset = 0;
777 755
778 b->peer = NULL; 756 b->peer = NULL;
779 bio->init = 0; 757 bio->init = 0;
780 assert(b->buf != NULL); 758 assert(b->buf != NULL);
781 b->len = 0; 759 b->len = 0;
782 b->offset = 0; 760 b->offset = 0;
783 }
784 } 761 }
785 } 762 }
786 763}
764
787 765
788/* Exported convenience functions */ 766/* Exported convenience functions */
789int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, 767int
790 BIO **bio2_p, size_t writebuf2) 768BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, BIO **bio2_p, size_t writebuf2)
791 { 769{
792 BIO *bio1 = NULL, *bio2 = NULL; 770 BIO *bio1 = NULL, *bio2 = NULL;
793 long r; 771 long r;
794 int ret = 0; 772 int ret = 0;
795 773
796 bio1 = BIO_new(BIO_s_bio()); 774 bio1 = BIO_new(BIO_s_bio());
797 if (bio1 == NULL) 775 if (bio1 == NULL)
798 goto err; 776 goto err;
799 bio2 = BIO_new(BIO_s_bio()); 777 bio2 = BIO_new(BIO_s_bio());
800 if (bio2 == NULL) 778 if (bio2 == NULL)
801 goto err; 779 goto err;
802 780
803 if (writebuf1) 781 if (writebuf1) {
804 { 782 r = BIO_set_write_buf_size(bio1, writebuf1);
805 r = BIO_set_write_buf_size(bio1, writebuf1); 783 if (!r)
806 if (!r) 784 goto err;
807 goto err; 785 }
808 } 786 if (writebuf2) {
809 if (writebuf2) 787 r = BIO_set_write_buf_size(bio2, writebuf2);
810 { 788 if (!r)
811 r = BIO_set_write_buf_size(bio2, writebuf2); 789 goto err;
812 if (!r)
813 goto err;
814 }
815
816 r = BIO_make_bio_pair(bio1, bio2);
817 if (!r)
818 goto err;
819 ret = 1;
820
821 err:
822 if (ret == 0)
823 {
824 if (bio1)
825 {
826 BIO_free(bio1);
827 bio1 = NULL;
828 }
829 if (bio2)
830 {
831 BIO_free(bio2);
832 bio2 = NULL;
833 }
834 }
835
836 *bio1_p = bio1;
837 *bio2_p = bio2;
838 return ret;
839 }
840
841size_t BIO_ctrl_get_write_guarantee(BIO *bio)
842 {
843 return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
844 } 790 }
845 791
846size_t BIO_ctrl_get_read_request(BIO *bio) 792 r = BIO_make_bio_pair(bio1, bio2);
847 { 793 if (!r)
848 return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); 794 goto err;
795 ret = 1;
796
797 err:
798 if (ret == 0) {
799 if (bio1) {
800 BIO_free(bio1);
801 bio1 = NULL;
802 }
803 if (bio2) {
804 BIO_free(bio2);
805 bio2 = NULL;
806 }
849 } 807 }
850 808
851int BIO_ctrl_reset_read_request(BIO *bio) 809 *bio1_p = bio1;
852 { 810 *bio2_p = bio2;
811 return ret;
812}
813
814size_t
815BIO_ctrl_get_write_guarantee(BIO *bio)
816{
817 return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
818}
819
820size_t
821BIO_ctrl_get_read_request(BIO *bio)
822{
823 return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL);
824}
825
826int
827BIO_ctrl_reset_read_request(BIO *bio)
828{
853 return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); 829 return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0);
854 } 830}
855 831
856 832
857/* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now 833/* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now
858 * (conceivably some other BIOs could allow non-copying reads and writes too.) 834 * (conceivably some other BIOs could allow non-copying reads and writes too.)
859 */ 835 */
860int BIO_nread0(BIO *bio, char **buf) 836int
861 { 837BIO_nread0(BIO *bio, char **buf)
838{
862 long ret; 839 long ret;
863 840
864 if (!bio->init) 841 if (!bio->init) {
865 {
866 BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); 842 BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED);
867 return -2; 843 return -2;
868 } 844 }
869 845
870 ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); 846 ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf);
871 if (ret > INT_MAX) 847 if (ret > INT_MAX)
872 return INT_MAX; 848 return INT_MAX;
873 else 849 else
874 return (int) ret; 850 return (int) ret;
875 } 851}
876 852
877int BIO_nread(BIO *bio, char **buf, int num) 853int
878 { 854BIO_nread(BIO *bio, char **buf, int num)
855{
879 int ret; 856 int ret;
880 857
881 if (!bio->init) 858 if (!bio->init) {
882 {
883 BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); 859 BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED);
884 return -2; 860 return -2;
885 } 861 }
886 862
887 ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); 863 ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf);
888 if (ret > 0) 864 if (ret > 0)
889 bio->num_read += ret; 865 bio->num_read += ret;
890 return ret; 866 return ret;
891 } 867}
892 868
893int BIO_nwrite0(BIO *bio, char **buf) 869int
894 { 870BIO_nwrite0(BIO *bio, char **buf)
871{
895 long ret; 872 long ret;
896 873
897 if (!bio->init) 874 if (!bio->init) {
898 {
899 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); 875 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED);
900 return -2; 876 return -2;
901 } 877 }
902 878
903 ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); 879 ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf);
904 if (ret > INT_MAX) 880 if (ret > INT_MAX)
905 return INT_MAX; 881 return INT_MAX;
906 else 882 else
907 return (int) ret; 883 return (int) ret;
908 } 884}
909 885
910int BIO_nwrite(BIO *bio, char **buf, int num) 886int
911 { 887BIO_nwrite(BIO *bio, char **buf, int num)
888{
912 int ret; 889 int ret;
913 890
914 if (!bio->init) 891 if (!bio->init) {
915 {
916 BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); 892 BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED);
917 return -2; 893 return -2;
918 } 894 }
919 895
920 ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); 896 ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf);
921 if (ret > 0) 897 if (ret > 0)
922 bio->num_write += ret; 898 bio->num_write += ret;
923 return ret; 899 return ret;
924 } 900}
diff --git a/src/lib/libcrypto/bio/bss_conn.c b/src/lib/libcrypto/bio/bss_conn.c
index 5162e75c87..df34c49a4a 100644
--- a/src/lib/libcrypto/bio/bss_conn.c
+++ b/src/lib/libcrypto/bio/bss_conn.c
@@ -76,8 +76,7 @@
76#endif 76#endif
77 77
78 78
79typedef struct bio_connect_st 79typedef struct bio_connect_st {
80 {
81 int state; 80 int state;
82 81
83 char *param_hostname; 82 char *param_hostname;
@@ -95,8 +94,8 @@ typedef struct bio_connect_st
95 /* called when the connection is initially made 94 /* called when the connection is initially made
96 * callback(BIO,state,ret); The callback should return 95 * callback(BIO,state,ret); The callback should return
97 * 'ret'. state is for compatibility with the ssl info_callback */ 96 * 'ret'. state is for compatibility with the ssl info_callback */
98 int (*info_callback)(const BIO *bio,int state,int ret); 97 int (*info_callback)(const BIO *bio, int state, int ret);
99 } BIO_CONNECT; 98} BIO_CONNECT;
100 99
101static int conn_write(BIO *h, const char *buf, int num); 100static int conn_write(BIO *h, const char *buf, int num);
102static int conn_read(BIO *h, char *buf, int size); 101static int conn_read(BIO *h, char *buf, int size);
@@ -108,11 +107,10 @@ static long conn_callback_ctrl(BIO *h, int cmd, bio_info_cb *);
108 107
109static int conn_state(BIO *b, BIO_CONNECT *c); 108static int conn_state(BIO *b, BIO_CONNECT *c);
110static void conn_close_socket(BIO *data); 109static void conn_close_socket(BIO *data);
111BIO_CONNECT *BIO_CONNECT_new(void ); 110BIO_CONNECT *BIO_CONNECT_new(void);
112void BIO_CONNECT_free(BIO_CONNECT *a); 111void BIO_CONNECT_free(BIO_CONNECT *a);
113 112
114static BIO_METHOD methods_connectp= 113static BIO_METHOD methods_connectp = {
115 {
116 BIO_TYPE_CONNECT, 114 BIO_TYPE_CONNECT,
117 "socket connect", 115 "socket connect",
118 conn_write, 116 conn_write,
@@ -123,530 +121,501 @@ static BIO_METHOD methods_connectp=
123 conn_new, 121 conn_new,
124 conn_free, 122 conn_free,
125 conn_callback_ctrl, 123 conn_callback_ctrl,
126 }; 124};
127 125
128static int conn_state(BIO *b, BIO_CONNECT *c) 126static int
129 { 127conn_state(BIO *b, BIO_CONNECT *c)
130 int ret= -1,i; 128{
129 int ret = -1, i;
131 unsigned long l; 130 unsigned long l;
132 char *p,*q; 131 char *p, *q;
133 int (*cb)(const BIO *,int,int)=NULL; 132 int (*cb)(const BIO *, int, int) = NULL;
134 133
135 if (c->info_callback != NULL) 134 if (c->info_callback != NULL)
136 cb=c->info_callback; 135 cb = c->info_callback;
137 136
138 for (;;) 137 for (;;) {
139 { 138 switch (c->state) {
140 switch (c->state)
141 {
142 case BIO_CONN_S_BEFORE: 139 case BIO_CONN_S_BEFORE:
143 p=c->param_hostname; 140 p = c->param_hostname;
144 if (p == NULL) 141 if (p == NULL) {
145 { 142 BIOerr(BIO_F_CONN_STATE, BIO_R_NO_HOSTNAME_SPECIFIED);
146 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED);
147 goto exit_loop; 143 goto exit_loop;
148 } 144 }
149 for ( ; *p != '\0'; p++) 145 for (; *p != '\0'; p++) {
150 { 146 if ((*p == ':') || (*p == '/'))
151 if ((*p == ':') || (*p == '/')) break; 147 break;
152 } 148 }
153 149
154 i= *p; 150 i= *p;
155 if ((i == ':') || (i == '/')) 151 if ((i == ':') || (i == '/')) {
156 { 152 *(p++) = '\0';
157 153 if (i == ':') {
158 *(p++)='\0'; 154 for (q = p; *q; q++)
159 if (i == ':') 155 if (*q == '/') {
160 { 156 *q = '\0';
161 for (q=p; *q; q++)
162 if (*q == '/')
163 {
164 *q='\0';
165 break; 157 break;
166 } 158 }
167 if (c->param_port != NULL) 159 if (c->param_port != NULL)
168 OPENSSL_free(c->param_port); 160 OPENSSL_free(c->param_port);
169 c->param_port=BUF_strdup(p); 161 c->param_port = BUF_strdup(p);
170 }
171 } 162 }
163 }
172 164
173 if (c->param_port == NULL) 165 if (c->param_port == NULL) {
174 { 166 BIOerr(BIO_F_CONN_STATE, BIO_R_NO_PORT_SPECIFIED);
175 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); 167 ERR_add_error_data(2, "host=", c->param_hostname);
176 ERR_add_error_data(2,"host=",c->param_hostname);
177 goto exit_loop; 168 goto exit_loop;
178 } 169 }
179 c->state=BIO_CONN_S_GET_IP; 170 c->state = BIO_CONN_S_GET_IP;
180 break; 171 break;
181 172
182 case BIO_CONN_S_GET_IP: 173 case BIO_CONN_S_GET_IP:
183 if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) 174 if (BIO_get_host_ip(c->param_hostname, &(c->ip[0])) <= 0)
184 goto exit_loop; 175 goto exit_loop;
185 c->state=BIO_CONN_S_GET_PORT; 176 c->state = BIO_CONN_S_GET_PORT;
186 break; 177 break;
187 178
188 case BIO_CONN_S_GET_PORT: 179 case BIO_CONN_S_GET_PORT:
189 if (c->param_port == NULL) 180 if (c->param_port == NULL) {
190 {
191 /* abort(); */ 181 /* abort(); */
192 goto exit_loop; 182 goto exit_loop;
193 } 183 } else if (BIO_get_port(c->param_port, &c->port) <= 0)
194 else if (BIO_get_port(c->param_port,&c->port) <= 0)
195 goto exit_loop; 184 goto exit_loop;
196 c->state=BIO_CONN_S_CREATE_SOCKET; 185 c->state = BIO_CONN_S_CREATE_SOCKET;
197 break; 186 break;
198 187
199 case BIO_CONN_S_CREATE_SOCKET: 188 case BIO_CONN_S_CREATE_SOCKET:
200 /* now setup address */ 189 /* now setup address */
201 memset((char *)&c->them,0,sizeof(c->them)); 190 memset((char *)&c->them, 0, sizeof(c->them));
202 c->them.sin_family=AF_INET; 191 c->them.sin_family = AF_INET;
203 c->them.sin_port=htons((unsigned short)c->port); 192 c->them.sin_port = htons((unsigned short)c->port);
204 l=(unsigned long) 193 l = (unsigned long)
205 ((unsigned long)c->ip[0]<<24L)| 194 ((unsigned long)c->ip[0] << 24L)|
206 ((unsigned long)c->ip[1]<<16L)| 195 ((unsigned long)c->ip[1] << 16L)|
207 ((unsigned long)c->ip[2]<< 8L)| 196 ((unsigned long)c->ip[2] << 8L)|
208 ((unsigned long)c->ip[3]); 197 ((unsigned long)c->ip[3]);
209 c->them.sin_addr.s_addr=htonl(l); 198 c->them.sin_addr.s_addr = htonl(l);
210 c->state=BIO_CONN_S_CREATE_SOCKET; 199 c->state = BIO_CONN_S_CREATE_SOCKET;
211 200
212 ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); 201 ret = socket(AF_INET, SOCK_STREAM, SOCKET_PROTOCOL);
213 if (ret == -1) 202 if (ret == -1) {
214 { 203 SYSerr(SYS_F_SOCKET, errno);
215 SYSerr(SYS_F_SOCKET,errno); 204 ERR_add_error_data(4, "host=",
216 ERR_add_error_data(4,"host=",c->param_hostname, 205 c->param_hostname, ":", c->param_port);
217 ":",c->param_port); 206 BIOerr(BIO_F_CONN_STATE,
218 BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); 207 BIO_R_UNABLE_TO_CREATE_SOCKET);
219 goto exit_loop; 208 goto exit_loop;
220 } 209 }
221 b->num=ret; 210 b->num = ret;
222 c->state=BIO_CONN_S_NBIO; 211 c->state = BIO_CONN_S_NBIO;
223 break; 212 break;
224 213
225 case BIO_CONN_S_NBIO: 214 case BIO_CONN_S_NBIO:
226 if (c->nbio) 215 if (c->nbio) {
227 { 216 if (!BIO_socket_nbio(b->num, 1)) {
228 if (!BIO_socket_nbio(b->num,1)) 217 BIOerr(BIO_F_CONN_STATE,
229 { 218 BIO_R_ERROR_SETTING_NBIO);
230 BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); 219 ERR_add_error_data(4, "host=",
231 ERR_add_error_data(4,"host=", 220 c->param_hostname, ":",
232 c->param_hostname, 221 c->param_port);
233 ":",c->param_port);
234 goto exit_loop; 222 goto exit_loop;
235 }
236 } 223 }
237 c->state=BIO_CONN_S_CONNECT; 224 }
225 c->state = BIO_CONN_S_CONNECT;
238 226
239#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) 227#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE)
240 i=1; 228 i = 1;
241 i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); 229 i = setsockopt(b->num, SOL_SOCKET, SO_KEEPALIVE,(char *)&i, sizeof(i));
242 if (i < 0) 230 if (i < 0) {
243 { 231 SYSerr(SYS_F_SOCKET, errno);
244 SYSerr(SYS_F_SOCKET,errno); 232 ERR_add_error_data(4, "host=",
245 ERR_add_error_data(4,"host=",c->param_hostname, 233 c->param_hostname, ":", c->param_port);
246 ":",c->param_port); 234 BIOerr(BIO_F_CONN_STATE, BIO_R_KEEPALIVE);
247 BIOerr(BIO_F_CONN_STATE,BIO_R_KEEPALIVE);
248 goto exit_loop; 235 goto exit_loop;
249 } 236 }
250#endif 237#endif
251 break; 238 break;
252 239
253 case BIO_CONN_S_CONNECT: 240 case BIO_CONN_S_CONNECT:
254 BIO_clear_retry_flags(b); 241 BIO_clear_retry_flags(b);
255 ret=connect(b->num, 242 ret = connect(b->num,
256 (struct sockaddr *)&c->them, 243 (struct sockaddr *)&c->them,
257 sizeof(c->them)); 244 sizeof(c->them));
258 b->retry_reason=0; 245 b->retry_reason = 0;
259 if (ret < 0) 246 if (ret < 0) {
260 { 247 if (BIO_sock_should_retry(ret)) {
261 if (BIO_sock_should_retry(ret))
262 {
263 BIO_set_retry_special(b); 248 BIO_set_retry_special(b);
264 c->state=BIO_CONN_S_BLOCKED_CONNECT; 249 c->state = BIO_CONN_S_BLOCKED_CONNECT;
265 b->retry_reason=BIO_RR_CONNECT; 250 b->retry_reason = BIO_RR_CONNECT;
266 } 251 } else {
267 else 252 SYSerr(SYS_F_CONNECT, errno);
268 { 253 ERR_add_error_data(4, "host=",
269 SYSerr(SYS_F_CONNECT,errno); 254 c->param_hostname, ":",
270 ERR_add_error_data(4,"host=", 255 c->param_port);
271 c->param_hostname, 256 BIOerr(BIO_F_CONN_STATE,
272 ":",c->param_port); 257 BIO_R_CONNECT_ERROR);
273 BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR);
274 }
275 goto exit_loop;
276 } 258 }
277 else 259 goto exit_loop;
278 c->state=BIO_CONN_S_OK; 260 } else
261 c->state = BIO_CONN_S_OK;
279 break; 262 break;
280 263
281 case BIO_CONN_S_BLOCKED_CONNECT: 264 case BIO_CONN_S_BLOCKED_CONNECT:
282 i=BIO_sock_error(b->num); 265 i = BIO_sock_error(b->num);
283 if (i) 266 if (i) {
284 {
285 BIO_clear_retry_flags(b); 267 BIO_clear_retry_flags(b);
286 SYSerr(SYS_F_CONNECT,i); 268 SYSerr(SYS_F_CONNECT, i);
287 ERR_add_error_data(4,"host=", 269 ERR_add_error_data(4, "host=",
288 c->param_hostname, 270 c->param_hostname, ":", c->param_port);
289 ":",c->param_port); 271 BIOerr(BIO_F_CONN_STATE,
290 BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); 272 BIO_R_NBIO_CONNECT_ERROR);
291 ret=0; 273 ret = 0;
292 goto exit_loop; 274 goto exit_loop;
293 } 275 } else
294 else 276 c->state = BIO_CONN_S_OK;
295 c->state=BIO_CONN_S_OK;
296 break; 277 break;
297 278
298 case BIO_CONN_S_OK: 279 case BIO_CONN_S_OK:
299 ret=1; 280 ret = 1;
300 goto exit_loop; 281 goto exit_loop;
301 default: 282 default:
302 /* abort(); */ 283 /* abort(); */
303 goto exit_loop; 284 goto exit_loop;
304 } 285 }
305 286
306 if (cb != NULL) 287 if (cb != NULL) {
307 { 288 if (!(ret = cb((BIO *)b, c->state, ret)))
308 if (!(ret=cb((BIO *)b,c->state,ret)))
309 goto end; 289 goto end;
310 }
311 } 290 }
291 }
312 292
313 /* Loop does not exit */ 293 /* Loop does not exit */
314exit_loop: 294exit_loop:
315 if (cb != NULL) 295 if (cb != NULL)
316 ret=cb((BIO *)b,c->state,ret); 296 ret = cb((BIO *)b, c->state, ret);
317end: 297end:
318 return(ret); 298 return (ret);
319 } 299}
320 300
321BIO_CONNECT *BIO_CONNECT_new(void) 301BIO_CONNECT
322 { 302*BIO_CONNECT_new(void)
303{
323 BIO_CONNECT *ret; 304 BIO_CONNECT *ret;
324 305
325 if ((ret=(BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) 306 if ((ret = (BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL)
326 return(NULL); 307 return (NULL);
327 ret->state=BIO_CONN_S_BEFORE; 308 ret->state = BIO_CONN_S_BEFORE;
328 ret->param_hostname=NULL; 309 ret->param_hostname = NULL;
329 ret->param_port=NULL; 310 ret->param_port = NULL;
330 ret->info_callback=NULL; 311 ret->info_callback = NULL;
331 ret->nbio=0; 312 ret->nbio = 0;
332 ret->ip[0]=0; 313 ret->ip[0] = 0;
333 ret->ip[1]=0; 314 ret->ip[1] = 0;
334 ret->ip[2]=0; 315 ret->ip[2] = 0;
335 ret->ip[3]=0; 316 ret->ip[3] = 0;
336 ret->port=0; 317 ret->port = 0;
337 memset((char *)&ret->them,0,sizeof(ret->them)); 318 memset((char *)&ret->them, 0, sizeof(ret->them));
338 return(ret); 319 return (ret);
339 } 320}
340 321
341void BIO_CONNECT_free(BIO_CONNECT *a) 322void
342 { 323BIO_CONNECT_free(BIO_CONNECT *a)
343 if(a == NULL) 324{
344 return; 325 if (a == NULL)
326 return;
345 327
346 if (a->param_hostname != NULL) 328 if (a->param_hostname != NULL)
347 OPENSSL_free(a->param_hostname); 329 OPENSSL_free(a->param_hostname);
348 if (a->param_port != NULL) 330 if (a->param_port != NULL)
349 OPENSSL_free(a->param_port); 331 OPENSSL_free(a->param_port);
350 OPENSSL_free(a); 332 OPENSSL_free(a);
351 } 333}
352 334
353BIO_METHOD *BIO_s_connect(void) 335BIO_METHOD
354 { 336*BIO_s_connect(void)
355 return(&methods_connectp); 337{
356 } 338 return (&methods_connectp);
357 339}
358static int conn_new(BIO *bi) 340
359 { 341static int
360 bi->init=0; 342conn_new(BIO *bi)
361 bi->num=-1; 343{
362 bi->flags=0; 344 bi->init = 0;
363 if ((bi->ptr=(char *)BIO_CONNECT_new()) == NULL) 345 bi->num = -1;
364 return(0); 346 bi->flags = 0;
347 if ((bi->ptr = (char *)BIO_CONNECT_new()) == NULL)
348 return (0);
365 else 349 else
366 return(1); 350 return (1);
367 } 351}
368 352
369static void conn_close_socket(BIO *bio) 353static void
370 { 354conn_close_socket(BIO *bio)
355{
371 BIO_CONNECT *c; 356 BIO_CONNECT *c;
372 357
373 c=(BIO_CONNECT *)bio->ptr; 358 c = (BIO_CONNECT *)bio->ptr;
374 if (bio->num != -1) 359 if (bio->num != -1) {
375 {
376 /* Only do a shutdown if things were established */ 360 /* Only do a shutdown if things were established */
377 if (c->state == BIO_CONN_S_OK) 361 if (c->state == BIO_CONN_S_OK)
378 shutdown(bio->num, SHUT_RDWR); 362 shutdown(bio->num, SHUT_RDWR);
379 close(bio->num); 363 close(bio->num);
380 bio->num=-1; 364 bio->num = -1;
381 }
382 } 365 }
366}
383 367
384static int conn_free(BIO *a) 368static int
385 { 369conn_free(BIO *a)
370{
386 BIO_CONNECT *data; 371 BIO_CONNECT *data;
387 372
388 if (a == NULL) return(0); 373 if (a == NULL)
389 data=(BIO_CONNECT *)a->ptr; 374 return (0);
390 375 data = (BIO_CONNECT *)a->ptr;
391 if (a->shutdown) 376
392 { 377 if (a->shutdown) {
393 conn_close_socket(a); 378 conn_close_socket(a);
394 BIO_CONNECT_free(data); 379 BIO_CONNECT_free(data);
395 a->ptr=NULL; 380 a->ptr = NULL;
396 a->flags=0; 381 a->flags = 0;
397 a->init=0; 382 a->init = 0;
398 }
399 return(1);
400 } 383 }
401 384 return (1);
402static int conn_read(BIO *b, char *out, int outl) 385}
403 { 386
404 int ret=0; 387static int
388conn_read(BIO *b, char *out, int outl)
389{
390 int ret = 0;
405 BIO_CONNECT *data; 391 BIO_CONNECT *data;
406 392
407 data=(BIO_CONNECT *)b->ptr; 393 data = (BIO_CONNECT *)b->ptr;
408 if (data->state != BIO_CONN_S_OK) 394 if (data->state != BIO_CONN_S_OK) {
409 { 395 ret = conn_state(b, data);
410 ret=conn_state(b,data);
411 if (ret <= 0) 396 if (ret <= 0)
412 return(ret); 397 return (ret);
413 } 398 }
414 399
415 if (out != NULL) 400 if (out != NULL) {
416 {
417 errno = 0; 401 errno = 0;
418 ret=read(b->num,out,outl); 402 ret = read(b->num, out, outl);
419 BIO_clear_retry_flags(b); 403 BIO_clear_retry_flags(b);
420 if (ret <= 0) 404 if (ret <= 0) {
421 {
422 if (BIO_sock_should_retry(ret)) 405 if (BIO_sock_should_retry(ret))
423 BIO_set_retry_read(b); 406 BIO_set_retry_read(b);
424 }
425 } 407 }
426 return(ret);
427 } 408 }
409 return (ret);
410}
428 411
429static int conn_write(BIO *b, const char *in, int inl) 412static int
430 { 413conn_write(BIO *b, const char *in, int inl)
414{
431 int ret; 415 int ret;
432 BIO_CONNECT *data; 416 BIO_CONNECT *data;
433 417
434 data=(BIO_CONNECT *)b->ptr; 418 data = (BIO_CONNECT *)b->ptr;
435 if (data->state != BIO_CONN_S_OK) 419 if (data->state != BIO_CONN_S_OK) {
436 { 420 ret = conn_state(b, data);
437 ret=conn_state(b,data); 421 if (ret <= 0)
438 if (ret <= 0) return(ret); 422 return (ret);
439 } 423 }
440 424
441 errno = 0; 425 errno = 0;
442 ret=write(b->num,in,inl); 426 ret = write(b->num, in, inl);
443 BIO_clear_retry_flags(b); 427 BIO_clear_retry_flags(b);
444 if (ret <= 0) 428 if (ret <= 0) {
445 {
446 if (BIO_sock_should_retry(ret)) 429 if (BIO_sock_should_retry(ret))
447 BIO_set_retry_write(b); 430 BIO_set_retry_write(b);
448 }
449 return(ret);
450 } 431 }
432 return (ret);
433}
451 434
452static long conn_ctrl(BIO *b, int cmd, long num, void *ptr) 435static long
453 { 436conn_ctrl(BIO *b, int cmd, long num, void *ptr)
437{
454 BIO *dbio; 438 BIO *dbio;
455 int *ip; 439 int *ip;
456 const char **pptr; 440 const char **pptr;
457 long ret=1; 441 long ret = 1;
458 BIO_CONNECT *data; 442 BIO_CONNECT *data;
459 443
460 data=(BIO_CONNECT *)b->ptr; 444 data = (BIO_CONNECT *)b->ptr;
461 445
462 switch (cmd) 446 switch (cmd) {
463 {
464 case BIO_CTRL_RESET: 447 case BIO_CTRL_RESET:
465 ret=0; 448 ret = 0;
466 data->state=BIO_CONN_S_BEFORE; 449 data->state = BIO_CONN_S_BEFORE;
467 conn_close_socket(b); 450 conn_close_socket(b);
468 b->flags=0; 451 b->flags = 0;
469 break; 452 break;
470 case BIO_C_DO_STATE_MACHINE: 453 case BIO_C_DO_STATE_MACHINE:
471 /* use this one to start the connection */ 454 /* use this one to start the connection */
472 if (data->state != BIO_CONN_S_OK) 455 if (data->state != BIO_CONN_S_OK)
473 ret=(long)conn_state(b,data); 456 ret = (long)conn_state(b, data);
474 else 457 else
475 ret=1; 458 ret = 1;
476 break; 459 break;
477 case BIO_C_GET_CONNECT: 460 case BIO_C_GET_CONNECT:
478 if (ptr != NULL) 461 if (ptr != NULL) {
479 { 462 pptr = (const char **)ptr;
480 pptr=(const char **)ptr; 463 if (num == 0) {
481 if (num == 0) 464 *pptr = data->param_hostname;
482 { 465
483 *pptr=data->param_hostname; 466 } else if (num == 1) {
484 467 *pptr = data->param_port;
485 } 468 } else if (num == 2) {
486 else if (num == 1) 469 *pptr = (char *)&(data->ip[0]);
487 { 470 } else if (num == 3) {
488 *pptr=data->param_port; 471 *((int *)ptr) = data->port;
489 }
490 else if (num == 2)
491 {
492 *pptr= (char *)&(data->ip[0]);
493 }
494 else if (num == 3)
495 {
496 *((int *)ptr)=data->port;
497 }
498 if ((!b->init) || (ptr == NULL))
499 *pptr="not initialized";
500 ret=1;
501 } 472 }
473 if ((!b->init) || (ptr == NULL))
474 *pptr = "not initialized";
475 ret = 1;
476 }
502 break; 477 break;
503 case BIO_C_SET_CONNECT: 478 case BIO_C_SET_CONNECT:
504 if (ptr != NULL) 479 if (ptr != NULL) {
505 { 480 b->init = 1;
506 b->init=1; 481 if (num == 0) {
507 if (num == 0)
508 {
509 if (data->param_hostname != NULL) 482 if (data->param_hostname != NULL)
510 OPENSSL_free(data->param_hostname); 483 OPENSSL_free(data->param_hostname);
511 data->param_hostname=BUF_strdup(ptr); 484 data->param_hostname = BUF_strdup(ptr);
512 } 485 } else if (num == 1) {
513 else if (num == 1)
514 {
515 if (data->param_port != NULL) 486 if (data->param_port != NULL)
516 OPENSSL_free(data->param_port); 487 OPENSSL_free(data->param_port);
517 data->param_port=BUF_strdup(ptr); 488 data->param_port = BUF_strdup(ptr);
518 } 489 } else if (num == 2) {
519 else if (num == 2)
520 {
521 char buf[16]; 490 char buf[16];
522 unsigned char *p = ptr; 491 unsigned char *p = ptr;
523 492
524 (void) snprintf(buf,sizeof buf,"%d.%d.%d.%d", 493 (void) snprintf(buf, sizeof buf, "%d.%d.%d.%d",
525 p[0],p[1],p[2],p[3]); 494 p[0], p[1], p[2], p[3]);
526 if (data->param_hostname != NULL) 495 if (data->param_hostname != NULL)
527 OPENSSL_free(data->param_hostname); 496 OPENSSL_free(data->param_hostname);
528 data->param_hostname=BUF_strdup(buf); 497 data->param_hostname = BUF_strdup(buf);
529 memcpy(&(data->ip[0]),ptr,4); 498 memcpy(&(data->ip[0]), ptr, 4);
530 } 499 } else if (num == 3) {
531 else if (num == 3) 500 char buf[DECIMAL_SIZE(int) + 1];
532 {
533 char buf[DECIMAL_SIZE(int)+1];
534 501
535 (void) snprintf(buf,sizeof buf,"%d",*(int *)ptr); 502 (void) snprintf(buf, sizeof buf, "%d",
503 *(int *)ptr);
536 if (data->param_port != NULL) 504 if (data->param_port != NULL)
537 OPENSSL_free(data->param_port); 505 OPENSSL_free(data->param_port);
538 data->param_port=BUF_strdup(buf); 506 data->param_port = BUF_strdup(buf);
539 data->port= *(int *)ptr; 507 data->port= *(int *)ptr;
540 }
541 } 508 }
509 }
542 break; 510 break;
543 case BIO_C_SET_NBIO: 511 case BIO_C_SET_NBIO:
544 data->nbio=(int)num; 512 data->nbio = (int)num;
545 break; 513 break;
546 case BIO_C_GET_FD: 514 case BIO_C_GET_FD:
547 if (b->init) 515 if (b->init) {
548 { 516 ip = (int *)ptr;
549 ip=(int *)ptr;
550 if (ip != NULL) 517 if (ip != NULL)
551 *ip=b->num; 518 *ip = b->num;
552 ret=b->num; 519 ret = b->num;
553 } 520 } else
554 else 521 ret = -1;
555 ret= -1;
556 break; 522 break;
557 case BIO_CTRL_GET_CLOSE: 523 case BIO_CTRL_GET_CLOSE:
558 ret=b->shutdown; 524 ret = b->shutdown;
559 break; 525 break;
560 case BIO_CTRL_SET_CLOSE: 526 case BIO_CTRL_SET_CLOSE:
561 b->shutdown=(int)num; 527 b->shutdown = (int)num;
562 break; 528 break;
563 case BIO_CTRL_PENDING: 529 case BIO_CTRL_PENDING:
564 case BIO_CTRL_WPENDING: 530 case BIO_CTRL_WPENDING:
565 ret=0; 531 ret = 0;
566 break; 532 break;
567 case BIO_CTRL_FLUSH: 533 case BIO_CTRL_FLUSH:
568 break; 534 break;
569 case BIO_CTRL_DUP: 535 case BIO_CTRL_DUP:
570 { 536 {
571 dbio=(BIO *)ptr; 537 dbio = (BIO *)ptr;
572 if (data->param_port) 538 if (data->param_port)
573 BIO_set_conn_port(dbio,data->param_port); 539 BIO_set_conn_port(dbio, data->param_port);
574 if (data->param_hostname) 540 if (data->param_hostname)
575 BIO_set_conn_hostname(dbio,data->param_hostname); 541 BIO_set_conn_hostname(dbio,
576 BIO_set_nbio(dbio,data->nbio); 542 data->param_hostname);
577 /* FIXME: the cast of the function seems unlikely to be a good idea */ 543 BIO_set_nbio(dbio, data->nbio);
578 (void)BIO_set_info_callback(dbio,(bio_info_cb *)data->info_callback); 544 /* FIXME: the cast of the function seems unlikely to be a good idea */
545 (void)BIO_set_info_callback(dbio,
546 (bio_info_cb *)data->info_callback);
579 } 547 }
580 break; 548 break;
581 case BIO_CTRL_SET_CALLBACK: 549 case BIO_CTRL_SET_CALLBACK:
582 { 550 {
583#if 0 /* FIXME: Should this be used? -- Richard Levitte */ 551#if 0 /* FIXME: Should this be used? -- Richard Levitte */
584 BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 552 BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
585 ret = -1; 553 ret = -1;
586#else 554#else
587 ret=0; 555 ret = 0;
588#endif 556#endif
589 } 557 }
590 break; 558 break;
591 case BIO_CTRL_GET_CALLBACK: 559 case BIO_CTRL_GET_CALLBACK:
592 { 560 {
593 int (**fptr)(const BIO *bio,int state,int xret); 561 int (**fptr)(const BIO *bio, int state, int xret);
594 562
595 fptr=(int (**)(const BIO *bio,int state,int xret))ptr; 563 fptr = (int (**)(const BIO *bio, int state, int xret))ptr;
596 *fptr=data->info_callback; 564 *fptr = data->info_callback;
597 } 565 }
598 break; 566 break;
599 default: 567 default:
600 ret=0; 568 ret = 0;
601 break; 569 break;
602 }
603 return(ret);
604 } 570 }
571 return (ret);
572}
605 573
606static long conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 574static long
607 { 575conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
608 long ret=1; 576{
577 long ret = 1;
609 BIO_CONNECT *data; 578 BIO_CONNECT *data;
610 579
611 data=(BIO_CONNECT *)b->ptr; 580 data = (BIO_CONNECT *)b->ptr;
612 581
613 switch (cmd) 582 switch (cmd) {
614 {
615 case BIO_CTRL_SET_CALLBACK: 583 case BIO_CTRL_SET_CALLBACK:
616 { 584 {
617 data->info_callback=(int (*)(const struct bio_st *, int, int))fp; 585 data->info_callback = (int (*)(const struct bio_st *, int, int))fp;
618 } 586 }
619 break; 587 break;
620 default: 588 default:
621 ret=0; 589 ret = 0;
622 break; 590 break;
623 }
624 return(ret);
625 } 591 }
626 592 return (ret);
627static int conn_puts(BIO *bp, const char *str) 593}
628 { 594
629 int n,ret; 595static int
630 596conn_puts(BIO *bp, const char *str)
631 n=strlen(str); 597{
632 ret=conn_write(bp,str,n); 598 int n, ret;
633 return(ret); 599
634 } 600 n = strlen(str);
635 601 ret = conn_write(bp, str, n);
636BIO *BIO_new_connect(char *str) 602 return (ret);
637 { 603}
604
605BIO
606*BIO_new_connect(char *str)
607{
638 BIO *ret; 608 BIO *ret;
639 609
640 ret=BIO_new(BIO_s_connect()); 610 ret = BIO_new(BIO_s_connect());
641 if (ret == NULL) return(NULL); 611 if (ret == NULL)
642 if (BIO_set_conn_hostname(ret,str)) 612 return (NULL);
643 return(ret); 613 if (BIO_set_conn_hostname(ret, str))
644 else 614 return (ret);
645 { 615 else {
646 BIO_free(ret); 616 BIO_free(ret);
647 return(NULL); 617 return (NULL);
648 }
649 } 618 }
619}
650 620
651#endif 621#endif
652
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c
index 67a13ae845..330f6fc404 100644
--- a/src/lib/libcrypto/bio/bss_dgram.c
+++ b/src/lib/libcrypto/bio/bss_dgram.c
@@ -113,7 +113,8 @@ static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
113static int dgram_sctp_new(BIO *h); 113static int dgram_sctp_new(BIO *h);
114static int dgram_sctp_free(BIO *data); 114static int dgram_sctp_free(BIO *data);
115#ifdef SCTP_AUTHENTICATION_EVENT 115#ifdef SCTP_AUTHENTICATION_EVENT
116static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp); 116static void dgram_sctp_handle_auth_free_key_event(BIO *b,
117 union sctp_notification *snp);
117#endif 118#endif
118#endif 119#endif
119 120
@@ -121,8 +122,7 @@ static int BIO_dgram_should_retry(int s);
121 122
122static void get_current_time(struct timeval *t); 123static void get_current_time(struct timeval *t);
123 124
124static BIO_METHOD methods_dgramp= 125static BIO_METHOD methods_dgramp = {
125 {
126 BIO_TYPE_DGRAM, 126 BIO_TYPE_DGRAM,
127 "datagram socket", 127 "datagram socket",
128 dgram_write, 128 dgram_write,
@@ -133,11 +133,10 @@ static BIO_METHOD methods_dgramp=
133 dgram_new, 133 dgram_new,
134 dgram_free, 134 dgram_free,
135 NULL, 135 NULL,
136 }; 136};
137 137
138#ifndef OPENSSL_NO_SCTP 138#ifndef OPENSSL_NO_SCTP
139static BIO_METHOD methods_dgramp_sctp= 139static BIO_METHOD methods_dgramp_sctp = {
140 {
141 BIO_TYPE_DGRAM_SCTP, 140 BIO_TYPE_DGRAM_SCTP,
142 "datagram sctp socket", 141 "datagram sctp socket",
143 dgram_sctp_write, 142 dgram_sctp_write,
@@ -148,11 +147,10 @@ static BIO_METHOD methods_dgramp_sctp=
148 dgram_sctp_new, 147 dgram_sctp_new,
149 dgram_sctp_free, 148 dgram_sctp_free,
150 NULL, 149 NULL,
151 }; 150};
152#endif 151#endif
153 152
154typedef struct bio_dgram_data_st 153typedef struct bio_dgram_data_st {
155 {
156 union { 154 union {
157 struct sockaddr sa; 155 struct sockaddr sa;
158 struct sockaddr_in sa_in; 156 struct sockaddr_in sa_in;
@@ -165,18 +163,16 @@ typedef struct bio_dgram_data_st
165 unsigned int mtu; 163 unsigned int mtu;
166 struct timeval next_timeout; 164 struct timeval next_timeout;
167 struct timeval socket_timeout; 165 struct timeval socket_timeout;
168 } bio_dgram_data; 166} bio_dgram_data;
169 167
170#ifndef OPENSSL_NO_SCTP 168#ifndef OPENSSL_NO_SCTP
171typedef struct bio_dgram_sctp_save_message_st 169typedef struct bio_dgram_sctp_save_message_st {
172 { 170 BIO *bio;
173 BIO *bio; 171 char *data;
174 char *data; 172 int length;
175 int length; 173} bio_dgram_sctp_save_message;
176 } bio_dgram_sctp_save_message;
177 174
178typedef struct bio_dgram_sctp_data_st 175typedef struct bio_dgram_sctp_data_st {
179 {
180 union { 176 union {
181 struct sockaddr sa; 177 struct sockaddr sa;
182 struct sockaddr_in sa_in; 178 struct sockaddr_in sa_in;
@@ -198,79 +194,88 @@ typedef struct bio_dgram_sctp_data_st
198 int save_shutdown; 194 int save_shutdown;
199 int peer_auth_tested; 195 int peer_auth_tested;
200 bio_dgram_sctp_save_message saved_message; 196 bio_dgram_sctp_save_message saved_message;
201 } bio_dgram_sctp_data; 197} bio_dgram_sctp_data;
202#endif 198#endif
203 199
204BIO_METHOD *BIO_s_datagram(void) 200BIO_METHOD
205 { 201*BIO_s_datagram(void)
206 return(&methods_dgramp); 202{
207 } 203 return (&methods_dgramp);
204}
208 205
209BIO *BIO_new_dgram(int fd, int close_flag) 206BIO
210 { 207*BIO_new_dgram(int fd, int close_flag)
208{
211 BIO *ret; 209 BIO *ret;
212 210
213 ret=BIO_new(BIO_s_datagram()); 211 ret = BIO_new(BIO_s_datagram());
214 if (ret == NULL) return(NULL); 212 if (ret == NULL)
215 BIO_set_fd(ret,fd,close_flag); 213 return (NULL);
216 return(ret); 214 BIO_set_fd(ret, fd, close_flag);
217 } 215 return (ret);
216}
218 217
219static int dgram_new(BIO *bi) 218static int
220 { 219dgram_new(BIO *bi)
220{
221 bio_dgram_data *data = NULL; 221 bio_dgram_data *data = NULL;
222 222
223 bi->init=0; 223 bi->init = 0;
224 bi->num=0; 224 bi->num = 0;
225 data = OPENSSL_malloc(sizeof(bio_dgram_data)); 225 data = OPENSSL_malloc(sizeof(bio_dgram_data));
226 if (data == NULL) 226 if (data == NULL)
227 return 0; 227 return 0;
228 memset(data, 0x00, sizeof(bio_dgram_data)); 228 memset(data, 0x00, sizeof(bio_dgram_data));
229 bi->ptr = data; 229 bi->ptr = data;
230 230
231 bi->flags=0; 231 bi->flags = 0;
232 return(1); 232 return (1);
233 } 233}
234 234
235static int dgram_free(BIO *a) 235static int
236 { 236dgram_free(BIO *a)
237{
237 bio_dgram_data *data; 238 bio_dgram_data *data;
238 239
239 if (a == NULL) return(0); 240 if (a == NULL)
240 if ( ! dgram_clear(a)) 241 return (0);
242 if (!dgram_clear(a))
241 return 0; 243 return 0;
242 244
243 data = (bio_dgram_data *)a->ptr; 245 data = (bio_dgram_data *)a->ptr;
244 if(data != NULL) OPENSSL_free(data); 246 if (data != NULL)
247 OPENSSL_free(data);
245 248
246 return(1); 249 return (1);
247 } 250}
248 251
249static int dgram_clear(BIO *a) 252static int
250 { 253dgram_clear(BIO *a)
251 if (a == NULL) return(0); 254{
252 if (a->shutdown) 255 if (a == NULL)
253 { 256 return (0);
254 if (a->init) 257 if (a->shutdown) {
255 { 258 if (a->init) {
256 shutdown(a->num, SHUT_RDWR); 259 shutdown(a->num, SHUT_RDWR);
257 close(a->num); 260 close(a->num);
258 }
259 a->init=0;
260 a->flags=0;
261 } 261 }
262 return(1); 262 a->init = 0;
263 a->flags = 0;
263 } 264 }
265 return (1);
266}
264 267
265static void dgram_adjust_rcv_timeout(BIO *b) 268static void
266 { 269dgram_adjust_rcv_timeout(BIO *b)
270{
267#if defined(SO_RCVTIMEO) 271#if defined(SO_RCVTIMEO)
268 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 272 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
269 union { size_t s; int i; } sz = {0}; 273 union { size_t s;
274 int i;
275 } sz = {0};
270 276
271 /* Is a timer active? */ 277 /* Is a timer active? */
272 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) 278 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
273 {
274 struct timeval timenow, timeleft; 279 struct timeval timenow, timeleft;
275 280
276 /* Read current socket timeout */ 281 /* Read current socket timeout */
@@ -279,20 +284,19 @@ static void dgram_adjust_rcv_timeout(BIO *b)
279 284
280 sz.i = sizeof(timeout); 285 sz.i = sizeof(timeout);
281 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 286 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
282 (void*)&timeout, &sz.i) < 0) 287 (void*)&timeout, &sz.i) < 0) {
283 { perror("getsockopt"); } 288 perror("getsockopt");
284 else 289 } else {
285 {
286 data->socket_timeout.tv_sec = timeout / 1000; 290 data->socket_timeout.tv_sec = timeout / 1000;
287 data->socket_timeout.tv_usec = (timeout % 1000) * 1000; 291 data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
288 } 292 }
289#else 293#else
290 sz.i = sizeof(data->socket_timeout); 294 sz.i = sizeof(data->socket_timeout);
291 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 295 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
292 &(data->socket_timeout), (void *)&sz) < 0) 296 &(data->socket_timeout), (void *)&sz) < 0) {
293 { perror("getsockopt"); } 297 perror("getsockopt");
294 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 298 } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0)
295 OPENSSL_assert(sz.s<=sizeof(data->socket_timeout)); 299 OPENSSL_assert(sz.s <= sizeof(data->socket_timeout));
296#endif 300#endif
297 301
298 /* Get current time */ 302 /* Get current time */
@@ -302,126 +306,128 @@ static void dgram_adjust_rcv_timeout(BIO *b)
302 memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); 306 memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval));
303 timeleft.tv_sec -= timenow.tv_sec; 307 timeleft.tv_sec -= timenow.tv_sec;
304 timeleft.tv_usec -= timenow.tv_usec; 308 timeleft.tv_usec -= timenow.tv_usec;
305 if (timeleft.tv_usec < 0) 309 if (timeleft.tv_usec < 0) {
306 {
307 timeleft.tv_sec--; 310 timeleft.tv_sec--;
308 timeleft.tv_usec += 1000000; 311 timeleft.tv_usec += 1000000;
309 } 312 }
310 313
311 if (timeleft.tv_sec < 0) 314 if (timeleft.tv_sec < 0) {
312 {
313 timeleft.tv_sec = 0; 315 timeleft.tv_sec = 0;
314 timeleft.tv_usec = 1; 316 timeleft.tv_usec = 1;
315 } 317 }
316 318
317 /* Adjust socket timeout if next handhake message timer 319 /* Adjust socket timeout if next handhake message timer
318 * will expire earlier. 320 * will expire earlier.
319 */ 321 */
320 if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) || 322 if ((data->socket_timeout.tv_sec == 0 &&
321 (data->socket_timeout.tv_sec > timeleft.tv_sec) || 323 data->socket_timeout.tv_usec == 0) ||
322 (data->socket_timeout.tv_sec == timeleft.tv_sec && 324 (data->socket_timeout.tv_sec > timeleft.tv_sec) ||
323 data->socket_timeout.tv_usec >= timeleft.tv_usec)) 325 (data->socket_timeout.tv_sec == timeleft.tv_sec &&
324 { 326 data->socket_timeout.tv_usec >= timeleft.tv_usec)) {
325#ifdef OPENSSL_SYS_WINDOWS 327#ifdef OPENSSL_SYS_WINDOWS
326 timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; 328 timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000;
327 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 329 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
328 (void*)&timeout, sizeof(timeout)) < 0) 330 (void*)&timeout, sizeof(timeout)) < 0) {
329 { perror("setsockopt"); } 331 perror("setsockopt");
332 }
330#else 333#else
331 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft, 334 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
332 sizeof(struct timeval)) < 0) 335 &timeleft, sizeof(struct timeval)) < 0) {
333 { perror("setsockopt"); } 336 perror("setsockopt");
334#endif
335 } 337 }
336 }
337#endif 338#endif
339 }
338 } 340 }
341#endif
342}
339 343
340static void dgram_reset_rcv_timeout(BIO *b) 344static void
341 { 345dgram_reset_rcv_timeout(BIO *b)
346{
342#if defined(SO_RCVTIMEO) 347#if defined(SO_RCVTIMEO)
343 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 348 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
344 349
345 /* Is a timer active? */ 350 /* Is a timer active? */
346 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) 351 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
347 {
348#ifdef OPENSSL_SYS_WINDOWS 352#ifdef OPENSSL_SYS_WINDOWS
349 int timeout = data->socket_timeout.tv_sec * 1000 + 353 int timeout = data->socket_timeout.tv_sec * 1000 +
350 data->socket_timeout.tv_usec / 1000; 354 data->socket_timeout.tv_usec / 1000;
351 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 355 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
352 (void*)&timeout, sizeof(timeout)) < 0) 356 (void*)&timeout, sizeof(timeout)) < 0) {
353 { perror("setsockopt"); } 357 perror("setsockopt");
358 }
354#else 359#else
355 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout), 360 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
356 sizeof(struct timeval)) < 0) 361 &(data->socket_timeout), sizeof(struct timeval)) < 0) {
357 { perror("setsockopt"); } 362 perror("setsockopt");
358#endif
359 } 363 }
360#endif 364#endif
361 } 365 }
366#endif
367}
362 368
363static int dgram_read(BIO *b, char *out, int outl) 369static int
364 { 370dgram_read(BIO *b, char *out, int outl)
365 int ret=0; 371{
372 int ret = 0;
366 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 373 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
367 374
368 struct { 375 struct {
369 /* 376 /*
370 * See commentary in b_sock.c. <appro> 377 * See commentary in b_sock.c. <appro>
371 */ 378 */
372 union { size_t s; int i; } len; 379 union {
373 union { 380 size_t s;
374 struct sockaddr sa; 381 int i;
375 struct sockaddr_in sa_in; 382 } len;
383 union {
384 struct sockaddr sa;
385 struct sockaddr_in sa_in;
376#if OPENSSL_USE_IPV6 386#if OPENSSL_USE_IPV6
377 struct sockaddr_in6 sa_in6; 387 struct sockaddr_in6 sa_in6;
378#endif 388#endif
379 } peer; 389 } peer;
380 } sa; 390 } sa;
381 391
382 sa.len.s=0; 392 sa.len.s = 0;
383 sa.len.i=sizeof(sa.peer); 393 sa.len.i = sizeof(sa.peer);
384 394
385 if (out != NULL) 395 if (out != NULL) {
386 {
387 errno = 0; 396 errno = 0;
388 memset(&sa.peer, 0x00, sizeof(sa.peer)); 397 memset(&sa.peer, 0x00, sizeof(sa.peer));
389 dgram_adjust_rcv_timeout(b); 398 dgram_adjust_rcv_timeout(b);
390 ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len); 399 ret = recvfrom(b->num, out, outl, 0, &sa.peer.sa,(void *)&sa.len);
391 if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) 400 if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) {
392 { 401 OPENSSL_assert(sa.len.s <= sizeof(sa.peer));
393 OPENSSL_assert(sa.len.s<=sizeof(sa.peer));
394 sa.len.i = (int)sa.len.s; 402 sa.len.i = (int)sa.len.s;
395 } 403 }
396 404
397 if ( ! data->connected && ret >= 0) 405 if (! data->connected && ret >= 0)
398 BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); 406 BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer);
399 407
400 BIO_clear_retry_flags(b); 408 BIO_clear_retry_flags(b);
401 if (ret < 0) 409 if (ret < 0) {
402 { 410 if (BIO_dgram_should_retry(ret)) {
403 if (BIO_dgram_should_retry(ret))
404 {
405 BIO_set_retry_read(b); 411 BIO_set_retry_read(b);
406 data->_errno = errno; 412 data->_errno = errno;
407 }
408 } 413 }
414 }
409 415
410 dgram_reset_rcv_timeout(b); 416 dgram_reset_rcv_timeout(b);
411 }
412 return(ret);
413 } 417 }
418 return (ret);
419}
414 420
415static int dgram_write(BIO *b, const char *in, int inl) 421static int
416 { 422dgram_write(BIO *b, const char *in, int inl)
423{
417 int ret; 424 int ret;
418 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 425 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
419 errno = 0; 426 errno = 0;
420 427
421 if ( data->connected ) 428 if (data->connected)
422 ret=write(b->num,in,inl); 429 ret = write(b->num, in, inl);
423 else 430 else {
424 {
425 int peerlen = sizeof(data->peer); 431 int peerlen = sizeof(data->peer);
426 432
427 if (data->peer.sa.sa_family == AF_INET) 433 if (data->peer.sa.sa_family == AF_INET)
@@ -431,33 +437,33 @@ static int dgram_write(BIO *b, const char *in, int inl)
431 peerlen = sizeof(data->peer.sa_in6); 437 peerlen = sizeof(data->peer.sa_in6);
432#endif 438#endif
433#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) 439#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
434 ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); 440 ret = sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen);
435#else 441#else
436 ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); 442 ret = sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
437#endif 443#endif
438 } 444 }
439 445
440 BIO_clear_retry_flags(b); 446 BIO_clear_retry_flags(b);
441 if (ret <= 0) 447 if (ret <= 0) {
442 { 448 if (BIO_dgram_should_retry(ret)) {
443 if (BIO_dgram_should_retry(ret)) 449 BIO_set_retry_write(b);
444 { 450
445 BIO_set_retry_write(b);
446 data->_errno = errno; 451 data->_errno = errno;
447 452
448#if 0 /* higher layers are responsible for querying MTU, if necessary */ 453#if 0 /* higher layers are responsible for querying MTU, if necessary */
449 if ( data->_errno == EMSGSIZE) 454 if (data->_errno == EMSGSIZE)
450 /* retrieve the new MTU */ 455 /* retrieve the new MTU */
451 BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); 456 BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
452#endif 457#endif
453 }
454 } 458 }
455 return(ret);
456 } 459 }
460 return (ret);
461}
457 462
458static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) 463static long
459 { 464dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
460 long ret=1; 465{
466 long ret = 1;
461 int *ip; 467 int *ip;
462 struct sockaddr *to = NULL; 468 struct sockaddr *to = NULL;
463 bio_dgram_data *data = NULL; 469 bio_dgram_data *data = NULL;
@@ -472,76 +478,73 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
472#if OPENSSL_USE_IPV6 478#if OPENSSL_USE_IPV6
473 struct sockaddr_in6 s6; 479 struct sockaddr_in6 s6;
474#endif 480#endif
475 } addr; 481 } addr;
476#endif 482#endif
477 483
478 data = (bio_dgram_data *)b->ptr; 484 data = (bio_dgram_data *)b->ptr;
479 485
480 switch (cmd) 486 switch (cmd) {
481 {
482 case BIO_CTRL_RESET: 487 case BIO_CTRL_RESET:
483 num=0; 488 num = 0;
484 case BIO_C_FILE_SEEK: 489 case BIO_C_FILE_SEEK:
485 ret=0; 490 ret = 0;
486 break; 491 break;
487 case BIO_C_FILE_TELL: 492 case BIO_C_FILE_TELL:
488 case BIO_CTRL_INFO: 493 case BIO_CTRL_INFO:
489 ret=0; 494 ret = 0;
490 break; 495 break;
491 case BIO_C_SET_FD: 496 case BIO_C_SET_FD:
492 dgram_clear(b); 497 dgram_clear(b);
493 b->num= *((int *)ptr); 498 b->num= *((int *)ptr);
494 b->shutdown=(int)num; 499 b->shutdown = (int)num;
495 b->init=1; 500 b->init = 1;
496 break; 501 break;
497 case BIO_C_GET_FD: 502 case BIO_C_GET_FD:
498 if (b->init) 503 if (b->init) {
499 { 504 ip = (int *)ptr;
500 ip=(int *)ptr; 505 if (ip != NULL)
501 if (ip != NULL) *ip=b->num; 506 *ip = b->num;
502 ret=b->num; 507 ret = b->num;
503 } 508 } else
504 else 509 ret = -1;
505 ret= -1;
506 break; 510 break;
507 case BIO_CTRL_GET_CLOSE: 511 case BIO_CTRL_GET_CLOSE:
508 ret=b->shutdown; 512 ret = b->shutdown;
509 break; 513 break;
510 case BIO_CTRL_SET_CLOSE: 514 case BIO_CTRL_SET_CLOSE:
511 b->shutdown=(int)num; 515 b->shutdown = (int)num;
512 break; 516 break;
513 case BIO_CTRL_PENDING: 517 case BIO_CTRL_PENDING:
514 case BIO_CTRL_WPENDING: 518 case BIO_CTRL_WPENDING:
515 ret=0; 519 ret = 0;
516 break; 520 break;
517 case BIO_CTRL_DUP: 521 case BIO_CTRL_DUP:
518 case BIO_CTRL_FLUSH: 522 case BIO_CTRL_FLUSH:
519 ret=1; 523 ret = 1;
520 break; 524 break;
521 case BIO_CTRL_DGRAM_CONNECT: 525 case BIO_CTRL_DGRAM_CONNECT:
522 to = (struct sockaddr *)ptr; 526 to = (struct sockaddr *)ptr;
523#if 0 527#if 0
524 if (connect(b->num, to, sizeof(struct sockaddr)) < 0) 528 if (connect(b->num, to, sizeof(struct sockaddr)) < 0) {
525 { perror("connect"); ret = 0; } 529 perror("connect");
526 else 530 ret = 0;
527 { 531 } else {
528#endif 532#endif
529 switch (to->sa_family) 533 switch (to->sa_family) {
530 { 534 case AF_INET:
531 case AF_INET: 535 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
532 memcpy(&data->peer,to,sizeof(data->peer.sa_in)); 536 break;
533 break;
534#if OPENSSL_USE_IPV6 537#if OPENSSL_USE_IPV6
535 case AF_INET6: 538 case AF_INET6:
536 memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); 539 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
537 break; 540 break;
538#endif 541#endif
539 default: 542 default:
540 memcpy(&data->peer,to,sizeof(data->peer.sa)); 543 memcpy(&data->peer, to, sizeof(data->peer.sa));
541 break; 544 break;
542 }
543#if 0
544 } 545 }
546#if 0
547 }
545#endif 548#endif
546 break; 549 break;
547 /* (Linux)kernel sets DF bit on outgoing IP packets */ 550 /* (Linux)kernel sets DF bit on outgoing IP packets */
@@ -549,31 +552,31 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
549#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) 552#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
550 addr_len = (socklen_t)sizeof(addr); 553 addr_len = (socklen_t)sizeof(addr);
551 memset((void *)&addr, 0, sizeof(addr)); 554 memset((void *)&addr, 0, sizeof(addr));
552 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 555 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
553 {
554 ret = 0; 556 ret = 0;
555 break; 557 break;
556 } 558 }
557 switch (addr.sa.sa_family) 559 switch (addr.sa.sa_family) {
558 {
559 case AF_INET: 560 case AF_INET:
560 sockopt_val = IP_PMTUDISC_DO; 561 sockopt_val = IP_PMTUDISC_DO;
561 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER, 562 if ((ret = setsockopt(b->num, IPPROTO_IP,
562 &sockopt_val, sizeof(sockopt_val))) < 0) 563 IP_MTU_DISCOVER, &sockopt_val,
564 sizeof(sockopt_val))) < 0)
563 perror("setsockopt"); 565 perror("setsockopt");
564 break; 566 break;
565#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) 567#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
566 case AF_INET6: 568 case AF_INET6:
567 sockopt_val = IPV6_PMTUDISC_DO; 569 sockopt_val = IPV6_PMTUDISC_DO;
568 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER, 570 if ((ret = setsockopt(b->num, IPPROTO_IPV6,
569 &sockopt_val, sizeof(sockopt_val))) < 0) 571 IPV6_MTU_DISCOVER, &sockopt_val,
572 sizeof(sockopt_val))) < 0)
570 perror("setsockopt"); 573 perror("setsockopt");
571 break; 574 break;
572#endif 575#endif
573 default: 576 default:
574 ret = -1; 577 ret = -1;
575 break; 578 break;
576 } 579 }
577 ret = -1; 580 ret = -1;
578#else 581#else
579 break; 582 break;
@@ -582,74 +585,67 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
582#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) 585#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
583 addr_len = (socklen_t)sizeof(addr); 586 addr_len = (socklen_t)sizeof(addr);
584 memset((void *)&addr, 0, sizeof(addr)); 587 memset((void *)&addr, 0, sizeof(addr));
585 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 588 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
586 {
587 ret = 0; 589 ret = 0;
588 break; 590 break;
589 } 591 }
590 sockopt_len = sizeof(sockopt_val); 592 sockopt_len = sizeof(sockopt_val);
591 switch (addr.sa.sa_family) 593 switch (addr.sa.sa_family) {
592 {
593 case AF_INET: 594 case AF_INET:
594 if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, 595 if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU,
595 &sockopt_len)) < 0 || sockopt_val < 0) 596 (void *)&sockopt_val, &sockopt_len)) < 0 ||
596 { 597 sockopt_val < 0) {
597 ret = 0; 598 ret = 0;
598 } 599 } else {
599 else
600 {
601 /* we assume that the transport protocol is UDP and no 600 /* we assume that the transport protocol is UDP and no
602 * IP options are used. 601 * IP options are used.
603 */ 602 */
604 data->mtu = sockopt_val - 8 - 20; 603 data->mtu = sockopt_val - 8 - 20;
605 ret = data->mtu; 604 ret = data->mtu;
606 } 605 }
607 break; 606 break;
608#if OPENSSL_USE_IPV6 && defined(IPV6_MTU) 607#if OPENSSL_USE_IPV6 && defined(IPV6_MTU)
609 case AF_INET6: 608 case AF_INET6:
610 if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val, 609 if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU,
611 &sockopt_len)) < 0 || sockopt_val < 0) 610 (void *)&sockopt_val, &sockopt_len)) < 0 ||
612 { 611 sockopt_val < 0) {
613 ret = 0; 612 ret = 0;
614 } 613 } else {
615 else
616 {
617 /* we assume that the transport protocol is UDP and no 614 /* we assume that the transport protocol is UDP and no
618 * IPV6 options are used. 615 * IPV6 options are used.
619 */ 616 */
620 data->mtu = sockopt_val - 8 - 40; 617 data->mtu = sockopt_val - 8 - 40;
621 ret = data->mtu; 618 ret = data->mtu;
622 } 619 }
623 break; 620 break;
624#endif 621#endif
625 default: 622default:
626 ret = 0; 623 ret = 0;
627 break; 624 break;
628 } 625 }
629#else 626#else
630 ret = 0; 627 ret = 0;
631#endif 628#endif
632 break; 629 break;
633 case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: 630 case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
634 switch (data->peer.sa.sa_family) 631 switch (data->peer.sa.sa_family) {
635 { 632 case AF_INET:
636 case AF_INET: 633 ret = 576 - 20 - 8;
637 ret = 576 - 20 - 8; 634 break;
638 break;
639#if OPENSSL_USE_IPV6 635#if OPENSSL_USE_IPV6
640 case AF_INET6: 636 case AF_INET6:
641#ifdef IN6_IS_ADDR_V4MAPPED 637#ifdef IN6_IS_ADDR_V4MAPPED
642 if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) 638 if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
643 ret = 576 - 20 - 8; 639 ret = 576 - 20 - 8;
644 else 640 else
645#endif 641#endif
646 ret = 1280 - 40 - 8; 642 ret = 1280 - 40 - 8;
647 break; 643 break;
648#endif 644#endif
649 default: 645 default:
650 ret = 576 - 20 - 8; 646 ret = 576 - 20 - 8;
651 break; 647 break;
652 } 648 }
653 break; 649 break;
654 case BIO_CTRL_DGRAM_GET_MTU: 650 case BIO_CTRL_DGRAM_GET_MTU:
655 return data->mtu; 651 return data->mtu;
@@ -661,65 +657,59 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
661 case BIO_CTRL_DGRAM_SET_CONNECTED: 657 case BIO_CTRL_DGRAM_SET_CONNECTED:
662 to = (struct sockaddr *)ptr; 658 to = (struct sockaddr *)ptr;
663 659
664 if ( to != NULL) 660 if (to != NULL) {
665 {
666 data->connected = 1; 661 data->connected = 1;
667 switch (to->sa_family) 662 switch (to->sa_family) {
668 {
669 case AF_INET:
670 memcpy(&data->peer,to,sizeof(data->peer.sa_in));
671 break;
672#if OPENSSL_USE_IPV6
673 case AF_INET6:
674 memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
675 break;
676#endif
677 default:
678 memcpy(&data->peer,to,sizeof(data->peer.sa));
679 break;
680 }
681 }
682 else
683 {
684 data->connected = 0;
685 memset(&(data->peer), 0x00, sizeof(data->peer));
686 }
687 break;
688 case BIO_CTRL_DGRAM_GET_PEER:
689 switch (data->peer.sa.sa_family)
690 {
691 case AF_INET: 663 case AF_INET:
692 ret=sizeof(data->peer.sa_in); 664 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
693 break; 665 break;
694#if OPENSSL_USE_IPV6 666#if OPENSSL_USE_IPV6
695 case AF_INET6: 667 case AF_INET6:
696 ret=sizeof(data->peer.sa_in6); 668 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
697 break; 669 break;
698#endif 670#endif
699 default: 671 default:
700 ret=sizeof(data->peer.sa); 672 memcpy(&data->peer, to, sizeof(data->peer.sa));
701 break; 673 break;
702 } 674 }
703 if (num==0 || num>ret) 675 } else {
704 num=ret; 676 data->connected = 0;
705 memcpy(ptr,&data->peer,(ret=num)); 677 memset(&(data->peer), 0x00, sizeof(data->peer));
678 }
679 break;
680 case BIO_CTRL_DGRAM_GET_PEER:
681 switch (data->peer.sa.sa_family) {
682 case AF_INET:
683 ret = sizeof(data->peer.sa_in);
684 break;
685#if OPENSSL_USE_IPV6
686 case AF_INET6:
687 ret = sizeof(data->peer.sa_in6);
688 break;
689#endif
690 default:
691 ret = sizeof(data->peer.sa);
692 break;
693 }
694 if (num == 0 || num > ret)
695 num = ret;
696 memcpy(ptr, &data->peer, (ret = num));
706 break; 697 break;
707 case BIO_CTRL_DGRAM_SET_PEER: 698 case BIO_CTRL_DGRAM_SET_PEER:
708 to = (struct sockaddr *) ptr; 699 to = (struct sockaddr *) ptr;
709 switch (to->sa_family) 700 switch (to->sa_family) {
710 { 701 case AF_INET:
711 case AF_INET: 702 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
712 memcpy(&data->peer,to,sizeof(data->peer.sa_in)); 703 break;
713 break;
714#if OPENSSL_USE_IPV6 704#if OPENSSL_USE_IPV6
715 case AF_INET6: 705 case AF_INET6:
716 memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); 706 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
717 break; 707 break;
718#endif 708#endif
719 default: 709 default:
720 memcpy(&data->peer,to,sizeof(data->peer.sa)); 710 memcpy(&data->peer, to, sizeof(data->peer.sa));
721 break; 711 break;
722 } 712 }
723 break; 713 break;
724 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: 714 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
725 memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); 715 memcpy(&(data->next_timeout), ptr, sizeof(struct timeval));
@@ -728,47 +718,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
728 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: 718 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
729#ifdef OPENSSL_SYS_WINDOWS 719#ifdef OPENSSL_SYS_WINDOWS
730 { 720 {
731 struct timeval *tv = (struct timeval *)ptr; 721 struct timeval *tv = (struct timeval *)ptr;
732 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; 722 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
733 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 723 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
734 (void*)&timeout, sizeof(timeout)) < 0) 724 (void*)&timeout, sizeof(timeout)) < 0) {
735 { perror("setsockopt"); ret = -1; } 725 perror("setsockopt");
726 ret = -1;
727 }
736 } 728 }
737#else 729#else
738 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, 730 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
739 sizeof(struct timeval)) < 0) 731 sizeof(struct timeval)) < 0) {
740 { perror("setsockopt"); ret = -1; } 732 perror("setsockopt");
733 ret = -1;
734 }
741#endif 735#endif
742 break; 736 break;
743 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 737 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
744 { 738 {
745 union { size_t s; int i; } sz = {0}; 739 union {
740 size_t s;
741 int i;
742 } sz = {0};
746#ifdef OPENSSL_SYS_WINDOWS 743#ifdef OPENSSL_SYS_WINDOWS
747 int timeout; 744 int timeout;
748 struct timeval *tv = (struct timeval *)ptr; 745 struct timeval *tv = (struct timeval *)ptr;
749 746
750 sz.i = sizeof(timeout); 747 sz.i = sizeof(timeout);
751 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 748 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
752 (void*)&timeout, &sz.i) < 0) 749 (void*)&timeout, &sz.i) < 0) {
753 { perror("getsockopt"); ret = -1; } 750 perror("getsockopt");
754 else 751 ret = -1;
755 { 752 } else {
756 tv->tv_sec = timeout / 1000; 753 tv->tv_sec = timeout / 1000;
757 tv->tv_usec = (timeout % 1000) * 1000; 754 tv->tv_usec = (timeout % 1000) * 1000;
758 ret = sizeof(*tv); 755 ret = sizeof(*tv);
759 } 756 }
760#else 757#else
761 sz.i = sizeof(struct timeval); 758 sz.i = sizeof(struct timeval);
762 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 759 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
763 ptr, (void *)&sz) < 0) 760 ptr, (void *)&sz) < 0) {
764 { perror("getsockopt"); ret = -1; } 761 perror("getsockopt");
765 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 762 ret = -1;
766 { 763 } else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) {
767 OPENSSL_assert(sz.s<=sizeof(struct timeval)); 764 OPENSSL_assert(sz.s <= sizeof(struct timeval));
768 ret = (int)sz.s; 765 ret = (int)sz.s;
769 } 766 } else
770 else 767 ret = sz.i;
771 ret = sz.i;
772#endif 768#endif
773 } 769 }
774 break; 770 break;
@@ -777,47 +773,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
777 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: 773 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
778#ifdef OPENSSL_SYS_WINDOWS 774#ifdef OPENSSL_SYS_WINDOWS
779 { 775 {
780 struct timeval *tv = (struct timeval *)ptr; 776 struct timeval *tv = (struct timeval *)ptr;
781 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; 777 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
782 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 778 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
783 (void*)&timeout, sizeof(timeout)) < 0) 779 (void*)&timeout, sizeof(timeout)) < 0) {
784 { perror("setsockopt"); ret = -1; } 780 perror("setsockopt");
781 ret = -1;
782 }
785 } 783 }
786#else 784#else
787 if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, 785 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
788 sizeof(struct timeval)) < 0) 786 sizeof(struct timeval)) < 0) {
789 { perror("setsockopt"); ret = -1; } 787 perror("setsockopt");
788 ret = -1;
789 }
790#endif 790#endif
791 break; 791 break;
792 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 792 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
793 { 793 {
794 union { size_t s; int i; } sz = {0}; 794 union {
795 size_t s;
796 int i;
797 } sz = {0};
795#ifdef OPENSSL_SYS_WINDOWS 798#ifdef OPENSSL_SYS_WINDOWS
796 int timeout; 799 int timeout;
797 struct timeval *tv = (struct timeval *)ptr; 800 struct timeval *tv = (struct timeval *)ptr;
798 801
799 sz.i = sizeof(timeout); 802 sz.i = sizeof(timeout);
800 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 803 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
801 (void*)&timeout, &sz.i) < 0) 804 (void*)&timeout, &sz.i) < 0) {
802 { perror("getsockopt"); ret = -1; } 805 perror("getsockopt");
803 else 806 ret = -1;
804 { 807 } else {
805 tv->tv_sec = timeout / 1000; 808 tv->tv_sec = timeout / 1000;
806 tv->tv_usec = (timeout % 1000) * 1000; 809 tv->tv_usec = (timeout % 1000) * 1000;
807 ret = sizeof(*tv); 810 ret = sizeof(*tv);
808 } 811 }
809#else 812#else
810 sz.i = sizeof(struct timeval); 813 sz.i = sizeof(struct timeval);
811 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 814 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
812 ptr, (void *)&sz) < 0) 815 ptr, (void *)&sz) < 0) {
813 { perror("getsockopt"); ret = -1; } 816 perror("getsockopt");
814 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 817 ret = -1;
815 { 818 } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) {
816 OPENSSL_assert(sz.s<=sizeof(struct timeval)); 819 OPENSSL_assert(sz.s <= sizeof(struct timeval));
817 ret = (int)sz.s; 820 ret = (int)sz.s;
818 } 821 } else
819 else 822 ret = sz.i;
820 ret = sz.i;
821#endif 823#endif
822 } 824 }
823 break; 825 break;
@@ -826,52 +828,52 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
826 /* fall-through */ 828 /* fall-through */
827 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: 829 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
828#ifdef OPENSSL_SYS_WINDOWS 830#ifdef OPENSSL_SYS_WINDOWS
829 if ( data->_errno == WSAETIMEDOUT) 831 if (data->_errno == WSAETIMEDOUT)
830#else 832#else
831 if ( data->_errno == EAGAIN) 833 if (data->_errno == EAGAIN)
832#endif 834#endif
833 { 835 {
834 ret = 1; 836 ret = 1;
835 data->_errno = 0; 837 data->_errno = 0;
836 } 838 } else
837 else
838 ret = 0; 839 ret = 0;
839 break; 840 break;
840#ifdef EMSGSIZE 841#ifdef EMSGSIZE
841 case BIO_CTRL_DGRAM_MTU_EXCEEDED: 842 case BIO_CTRL_DGRAM_MTU_EXCEEDED:
842 if ( data->_errno == EMSGSIZE) 843 if (data->_errno == EMSGSIZE) {
843 {
844 ret = 1; 844 ret = 1;
845 data->_errno = 0; 845 data->_errno = 0;
846 } 846 } else
847 else
848 ret = 0; 847 ret = 0;
849 break; 848 break;
850#endif 849#endif
851 default: 850 default:
852 ret=0; 851 ret = 0;
853 break; 852 break;
854 }
855 return(ret);
856 } 853 }
854 return (ret);
855}
857 856
858static int dgram_puts(BIO *bp, const char *str) 857static int
859 { 858dgram_puts(BIO *bp, const char *str)
860 int n,ret; 859{
860 int n, ret;
861 861
862 n=strlen(str); 862 n = strlen(str);
863 ret=dgram_write(bp,str,n); 863 ret = dgram_write(bp, str, n);
864 return(ret); 864 return (ret);
865 } 865}
866 866
867#ifndef OPENSSL_NO_SCTP 867#ifndef OPENSSL_NO_SCTP
868BIO_METHOD *BIO_s_datagram_sctp(void) 868BIO_METHOD
869 { 869*BIO_s_datagram_sctp(void)
870 return(&methods_dgramp_sctp); 870{
871 } 871 return (&methods_dgramp_sctp);
872}
872 873
873BIO *BIO_new_dgram_sctp(int fd, int close_flag) 874BIO
874 { 875*BIO_new_dgram_sctp(int fd, int close_flag)
876{
875 BIO *bio; 877 BIO *bio;
876 int ret, optval = 20000; 878 int ret, optval = 20000;
877 int auth_data = 0, auth_forward = 0; 879 int auth_data = 0, auth_forward = 0;
@@ -887,9 +889,10 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
887#endif 889#endif
888#endif 890#endif
889 891
890 bio=BIO_new(BIO_s_datagram_sctp()); 892 bio = BIO_new(BIO_s_datagram_sctp());
891 if (bio == NULL) return(NULL); 893 if (bio == NULL)
892 BIO_set_fd(bio,fd,close_flag); 894 return (NULL);
895 BIO_set_fd(bio, fd, close_flag);
893 896
894 /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ 897 /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */
895 auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; 898 auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE;
@@ -909,13 +912,14 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
909 OPENSSL_assert(ret >= 0); 912 OPENSSL_assert(ret >= 0);
910 913
911 for (p = (unsigned char*) authchunks->gauth_chunks; 914 for (p = (unsigned char*) authchunks->gauth_chunks;
912 p < (unsigned char*) authchunks + sockopt_len; 915 p < (unsigned char*) authchunks + sockopt_len;
913 p += sizeof(uint8_t)) 916 p += sizeof(uint8_t)) {
914 { 917 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
915 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; 918 auth_data = 1;
916 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; 919 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
917 } 920 auth_forward = 1;
918 921 }
922
919 OPENSSL_free(authchunks); 923 OPENSSL_free(authchunks);
920 924
921 OPENSSL_assert(auth_data); 925 OPENSSL_assert(auth_data);
@@ -947,20 +951,22 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
947 ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); 951 ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval));
948 OPENSSL_assert(ret >= 0); 952 OPENSSL_assert(ret >= 0);
949 953
950 return(bio); 954 return (bio);
951 } 955}
952 956
953int BIO_dgram_is_sctp(BIO *bio) 957int
954 { 958BIO_dgram_is_sctp(BIO *bio)
959{
955 return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); 960 return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP);
956 } 961}
957 962
958static int dgram_sctp_new(BIO *bi) 963static int
959 { 964dgram_sctp_new(BIO *bi)
965{
960 bio_dgram_sctp_data *data = NULL; 966 bio_dgram_sctp_data *data = NULL;
961 967
962 bi->init=0; 968 bi->init = 0;
963 bi->num=0; 969 bi->num = 0;
964 data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); 970 data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data));
965 if (data == NULL) 971 if (data == NULL)
966 return 0; 972 return 0;
@@ -968,46 +974,50 @@ static int dgram_sctp_new(BIO *bi)
968#ifdef SCTP_PR_SCTP_NONE 974#ifdef SCTP_PR_SCTP_NONE
969 data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; 975 data->prinfo.pr_policy = SCTP_PR_SCTP_NONE;
970#endif 976#endif
971 bi->ptr = data; 977 bi->ptr = data;
972 978
973 bi->flags=0; 979 bi->flags = 0;
974 return(1); 980 return (1);
975 } 981}
976 982
977static int dgram_sctp_free(BIO *a) 983static int
978 { 984dgram_sctp_free(BIO *a)
985{
979 bio_dgram_sctp_data *data; 986 bio_dgram_sctp_data *data;
980 987
981 if (a == NULL) return(0); 988 if (a == NULL)
982 if ( ! dgram_clear(a)) 989 return (0);
990 if (! dgram_clear(a))
983 return 0; 991 return 0;
984 992
985 data = (bio_dgram_sctp_data *)a->ptr; 993 data = (bio_dgram_sctp_data *)a->ptr;
986 if(data != NULL) OPENSSL_free(data); 994 if (data != NULL)
995 OPENSSL_free(data);
987 996
988 return(1); 997 return (1);
989 } 998}
990 999
991#ifdef SCTP_AUTHENTICATION_EVENT 1000#ifdef SCTP_AUTHENTICATION_EVENT
992void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) 1001void
993 { 1002dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
1003{
994 int ret; 1004 int ret;
995 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; 1005 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event;
996 1006
997 if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) 1007 if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) {
998 {
999 struct sctp_authkeyid authkeyid; 1008 struct sctp_authkeyid authkeyid;
1000 1009
1001 /* delete key */ 1010 /* delete key */
1002 authkeyid.scact_keynumber = authkeyevent->auth_keynumber; 1011 authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
1003 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, 1012 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1004 &authkeyid, sizeof(struct sctp_authkeyid)); 1013 &authkeyid, sizeof(struct sctp_authkeyid));
1005 }
1006 } 1014 }
1015}
1007#endif 1016#endif
1008 1017
1009static int dgram_sctp_read(BIO *b, char *out, int outl) 1018static int
1010 { 1019dgram_sctp_read(BIO *b, char *out, int outl)
1020{
1011 int ret = 0, n = 0, i, optval; 1021 int ret = 0, n = 0, i, optval;
1012 socklen_t optlen; 1022 socklen_t optlen;
1013 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; 1023 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
@@ -1017,12 +1027,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1017 struct cmsghdr *cmsg; 1027 struct cmsghdr *cmsg;
1018 char cmsgbuf[512]; 1028 char cmsgbuf[512];
1019 1029
1020 if (out != NULL) 1030 if (out != NULL) {
1021 {
1022 errno = 0; 1031 errno = 0;
1023 1032
1024 do 1033 do {
1025 {
1026 memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); 1034 memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo));
1027 iov.iov_base = out; 1035 iov.iov_base = out;
1028 iov.iov_len = outl; 1036 iov.iov_len = outl;
@@ -1035,15 +1043,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1035 msg.msg_flags = 0; 1043 msg.msg_flags = 0;
1036 n = recvmsg(b->num, &msg, 0); 1044 n = recvmsg(b->num, &msg, 0);
1037 1045
1038 if (msg.msg_controllen > 0) 1046 if (msg.msg_controllen > 0) {
1039 { 1047 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
1040 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg))
1041 {
1042 if (cmsg->cmsg_level != IPPROTO_SCTP) 1048 if (cmsg->cmsg_level != IPPROTO_SCTP)
1043 continue; 1049 continue;
1044#ifdef SCTP_RCVINFO 1050#ifdef SCTP_RCVINFO
1045 if (cmsg->cmsg_type == SCTP_RCVINFO) 1051 if (cmsg->cmsg_type == SCTP_RCVINFO) {
1046 {
1047 struct sctp_rcvinfo *rcvinfo; 1052 struct sctp_rcvinfo *rcvinfo;
1048 1053
1049 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); 1054 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg);
@@ -1054,11 +1059,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1054 data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; 1059 data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn;
1055 data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; 1060 data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn;
1056 data->rcvinfo.rcv_context = rcvinfo->rcv_context; 1061 data->rcvinfo.rcv_context = rcvinfo->rcv_context;
1057 } 1062 }
1058#endif 1063#endif
1059#ifdef SCTP_SNDRCV 1064#ifdef SCTP_SNDRCV
1060 if (cmsg->cmsg_type == SCTP_SNDRCV) 1065 if (cmsg->cmsg_type == SCTP_SNDRCV) {
1061 {
1062 struct sctp_sndrcvinfo *sndrcvinfo; 1066 struct sctp_sndrcvinfo *sndrcvinfo;
1063 1067
1064 sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); 1068 sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
@@ -1069,23 +1073,20 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1069 data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; 1073 data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn;
1070 data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; 1074 data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn;
1071 data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; 1075 data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context;
1072 }
1073#endif
1074 } 1076 }
1077#endif
1075 } 1078 }
1079 }
1076 1080
1077 if (n <= 0) 1081 if (n <= 0) {
1078 {
1079 if (n < 0) 1082 if (n < 0)
1080 ret = n; 1083 ret = n;
1081 break; 1084 break;
1082 } 1085 }
1083 1086
1084 if (msg.msg_flags & MSG_NOTIFICATION) 1087 if (msg.msg_flags & MSG_NOTIFICATION) {
1085 {
1086 snp = (union sctp_notification*) out; 1088 snp = (union sctp_notification*) out;
1087 if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) 1089 if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1088 {
1089#ifdef SCTP_EVENT 1090#ifdef SCTP_EVENT
1090 struct sctp_event event; 1091 struct sctp_event event;
1091#else 1092#else
@@ -1095,13 +1096,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1095 /* If a message has been delayed until the socket 1096 /* If a message has been delayed until the socket
1096 * is dry, it can be sent now. 1097 * is dry, it can be sent now.
1097 */ 1098 */
1098 if (data->saved_message.length > 0) 1099 if (data->saved_message.length > 0) {
1099 {
1100 dgram_sctp_write(data->saved_message.bio, data->saved_message.data, 1100 dgram_sctp_write(data->saved_message.bio, data->saved_message.data,
1101 data->saved_message.length); 1101 data->saved_message.length);
1102 OPENSSL_free(data->saved_message.data); 1102 OPENSSL_free(data->saved_message.data);
1103 data->saved_message.length = 0; 1103 data->saved_message.length = 0;
1104 } 1104 }
1105 1105
1106 /* disable sender dry event */ 1106 /* disable sender dry event */
1107#ifdef SCTP_EVENT 1107#ifdef SCTP_EVENT
@@ -1121,7 +1121,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1121 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); 1121 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
1122 OPENSSL_assert(i >= 0); 1122 OPENSSL_assert(i >= 0);
1123#endif 1123#endif
1124 } 1124 }
1125 1125
1126#ifdef SCTP_AUTHENTICATION_EVENT 1126#ifdef SCTP_AUTHENTICATION_EVENT
1127 if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1127 if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1132,14 +1132,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1132 data->handle_notifications(b, data->notification_context, (void*) out); 1132 data->handle_notifications(b, data->notification_context, (void*) out);
1133 1133
1134 memset(out, 0, outl); 1134 memset(out, 0, outl);
1135 } 1135 } else
1136 else
1137 ret += n; 1136 ret += n;
1138 } 1137 }
1139 while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); 1138 while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl));
1140 1139
1141 if (ret > 0 && !(msg.msg_flags & MSG_EOR)) 1140 if (ret > 0 && !(msg.msg_flags & MSG_EOR)) {
1142 {
1143 /* Partial message read, this should never happen! */ 1141 /* Partial message read, this should never happen! */
1144 1142
1145 /* The buffer was too small, this means the peer sent 1143 /* The buffer was too small, this means the peer sent
@@ -1159,8 +1157,8 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1159 * max record size (2^14 + 2048 + 13) 1157 * max record size (2^14 + 2048 + 13)
1160 */ 1158 */
1161 optlen = (socklen_t) sizeof(int); 1159 optlen = (socklen_t) sizeof(int);
1162 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, 1160 ret = getsockopt(b->num, IPPROTO_SCTP,
1163 &optval, &optlen); 1161 SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen);
1164 OPENSSL_assert(ret >= 0); 1162 OPENSSL_assert(ret >= 0);
1165 OPENSSL_assert(optval >= 18445); 1163 OPENSSL_assert(optval >= 18445);
1166 1164
@@ -1173,21 +1171,18 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1173 memset(out, 0, outl); 1171 memset(out, 0, outl);
1174 BIO_set_retry_read(b); 1172 BIO_set_retry_read(b);
1175 return -1; 1173 return -1;
1176 } 1174 }
1177 1175
1178 BIO_clear_retry_flags(b); 1176 BIO_clear_retry_flags(b);
1179 if (ret < 0) 1177 if (ret < 0) {
1180 { 1178 if (BIO_dgram_should_retry(ret)) {
1181 if (BIO_dgram_should_retry(ret))
1182 {
1183 BIO_set_retry_read(b); 1179 BIO_set_retry_read(b);
1184 data->_errno = errno; 1180 data->_errno = errno;
1185 }
1186 } 1181 }
1182 }
1187 1183
1188 /* Test if peer uses SCTP-AUTH before continuing */ 1184 /* Test if peer uses SCTP-AUTH before continuing */
1189 if (!data->peer_auth_tested) 1185 if (!data->peer_auth_tested) {
1190 {
1191 int ii, auth_data = 0, auth_forward = 0; 1186 int ii, auth_data = 0, auth_forward = 0;
1192 unsigned char *p; 1187 unsigned char *p;
1193 struct sctp_authchunks *authchunks; 1188 struct sctp_authchunks *authchunks;
@@ -1199,29 +1194,30 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1199 OPENSSL_assert(ii >= 0); 1194 OPENSSL_assert(ii >= 0);
1200 1195
1201 for (p = (unsigned char*) authchunks->gauth_chunks; 1196 for (p = (unsigned char*) authchunks->gauth_chunks;
1202 p < (unsigned char*) authchunks + optlen; 1197 p < (unsigned char*) authchunks + optlen;
1203 p += sizeof(uint8_t)) 1198 p += sizeof(uint8_t)) {
1204 { 1199 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
1205 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; 1200 auth_data = 1;
1206 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; 1201 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
1207 } 1202 auth_forward = 1;
1203 }
1208 1204
1209 OPENSSL_free(authchunks); 1205 OPENSSL_free(authchunks);
1210 1206
1211 if (!auth_data || !auth_forward) 1207 if (!auth_data || !auth_forward) {
1212 { 1208 BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR);
1213 BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR);
1214 return -1; 1209 return -1;
1215 } 1210 }
1216 1211
1217 data->peer_auth_tested = 1; 1212 data->peer_auth_tested = 1;
1218 }
1219 } 1213 }
1220 return(ret);
1221 } 1214 }
1215 return (ret);
1216}
1222 1217
1223static int dgram_sctp_write(BIO *b, const char *in, int inl) 1218static int
1224 { 1219dgram_sctp_write(BIO *b, const char *in, int inl)
1220{
1225 int ret; 1221 int ret;
1226 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; 1222 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
1227 struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); 1223 struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo);
@@ -1256,8 +1252,7 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
1256 * socket is not dry yet, we have to save it and send it 1252 * socket is not dry yet, we have to save it and send it
1257 * as soon as the socket gets dry. 1253 * as soon as the socket gets dry.
1258 */ 1254 */
1259 if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) 1255 if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) {
1260 {
1261 data->saved_message.bio = b; 1256 data->saved_message.bio = b;
1262 data->saved_message.length = inl; 1257 data->saved_message.length = inl;
1263 data->saved_message.data = OPENSSL_malloc(inl); 1258 data->saved_message.data = OPENSSL_malloc(inl);
@@ -1317,20 +1312,20 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
1317 ret = sendmsg(b->num, &msg, 0); 1312 ret = sendmsg(b->num, &msg, 0);
1318 1313
1319 BIO_clear_retry_flags(b); 1314 BIO_clear_retry_flags(b);
1320 if (ret <= 0) 1315 if (ret <= 0) {
1321 { 1316 if (BIO_dgram_should_retry(ret)) {
1322 if (BIO_dgram_should_retry(ret)) 1317 BIO_set_retry_write(b);
1323 { 1318
1324 BIO_set_retry_write(b);
1325 data->_errno = errno; 1319 data->_errno = errno;
1326 }
1327 } 1320 }
1328 return(ret);
1329 } 1321 }
1322 return (ret);
1323}
1330 1324
1331static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) 1325static long
1332 { 1326dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1333 long ret=1; 1327{
1328 long ret = 1;
1334 bio_dgram_sctp_data *data = NULL; 1329 bio_dgram_sctp_data *data = NULL;
1335 socklen_t sockopt_len = 0; 1330 socklen_t sockopt_len = 0;
1336 struct sctp_authkeyid authkeyid; 1331 struct sctp_authkeyid authkeyid;
@@ -1338,8 +1333,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1338 1333
1339 data = (bio_dgram_sctp_data *)b->ptr; 1334 data = (bio_dgram_sctp_data *)b->ptr;
1340 1335
1341 switch (cmd) 1336 switch (cmd) {
1342 {
1343 case BIO_CTRL_DGRAM_QUERY_MTU: 1337 case BIO_CTRL_DGRAM_QUERY_MTU:
1344 /* Set to maximum (2^14) 1338 /* Set to maximum (2^14)
1345 * and ignore user input to enable transport 1339 * and ignore user input to enable transport
@@ -1384,7 +1378,8 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1384 /* Get active key */ 1378 /* Get active key */
1385 sockopt_len = sizeof(struct sctp_authkeyid); 1379 sockopt_len = sizeof(struct sctp_authkeyid);
1386 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1380 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1387 if (ret < 0) break; 1381 if (ret < 0)
1382 break;
1388 1383
1389 /* Add new key */ 1384 /* Add new key */
1390 sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); 1385 sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
@@ -1400,12 +1395,14 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1400 memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); 1395 memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t));
1401 1396
1402 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); 1397 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len);
1403 if (ret < 0) break; 1398 if (ret < 0)
1399 break;
1404 1400
1405 /* Reset active key */ 1401 /* Reset active key */
1406 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, 1402 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1407 &authkeyid, sizeof(struct sctp_authkeyid)); 1403 &authkeyid, sizeof(struct sctp_authkeyid));
1408 if (ret < 0) break; 1404 if (ret < 0)
1405 break;
1409 1406
1410 break; 1407 break;
1411 case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: 1408 case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY:
@@ -1414,13 +1411,15 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1414 /* Get active key */ 1411 /* Get active key */
1415 sockopt_len = sizeof(struct sctp_authkeyid); 1412 sockopt_len = sizeof(struct sctp_authkeyid);
1416 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1413 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1417 if (ret < 0) break; 1414 if (ret < 0)
1415 break;
1418 1416
1419 /* Set active key */ 1417 /* Set active key */
1420 authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; 1418 authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1;
1421 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, 1419 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1422 &authkeyid, sizeof(struct sctp_authkeyid)); 1420 &authkeyid, sizeof(struct sctp_authkeyid));
1423 if (ret < 0) break; 1421 if (ret < 0)
1422 break;
1424 1423
1425 /* CCS has been sent, so remember that and fall through 1424 /* CCS has been sent, so remember that and fall through
1426 * to check if we need to deactivate an old key 1425 * to check if we need to deactivate an old key
@@ -1435,12 +1434,12 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1435 data->ccs_rcvd = 1; 1434 data->ccs_rcvd = 1;
1436 1435
1437 /* CSS has been both, received and sent, so deactivate an old key */ 1436 /* CSS has been both, received and sent, so deactivate an old key */
1438 if (data->ccs_rcvd == 1 && data->ccs_sent == 1) 1437 if (data->ccs_rcvd == 1 && data->ccs_sent == 1) {
1439 {
1440 /* Get active key */ 1438 /* Get active key */
1441 sockopt_len = sizeof(struct sctp_authkeyid); 1439 sockopt_len = sizeof(struct sctp_authkeyid);
1442 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1440 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1443 if (ret < 0) break; 1441 if (ret < 0)
1442 break;
1444 1443
1445 /* Deactivate key or delete second last key if 1444 /* Deactivate key or delete second last key if
1446 * SCTP_AUTHENTICATION_EVENT is not available. 1445 * SCTP_AUTHENTICATION_EVENT is not available.
@@ -1449,22 +1448,23 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1449#ifdef SCTP_AUTH_DEACTIVATE_KEY 1448#ifdef SCTP_AUTH_DEACTIVATE_KEY
1450 sockopt_len = sizeof(struct sctp_authkeyid); 1449 sockopt_len = sizeof(struct sctp_authkeyid);
1451 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, 1450 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY,
1452 &authkeyid, sockopt_len); 1451 &authkeyid, sockopt_len);
1453 if (ret < 0) break; 1452 if (ret < 0)
1453 break;
1454#endif 1454#endif
1455#ifndef SCTP_AUTHENTICATION_EVENT 1455#ifndef SCTP_AUTHENTICATION_EVENT
1456 if (authkeyid.scact_keynumber > 0) 1456 if (authkeyid.scact_keynumber > 0) {
1457 {
1458 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; 1457 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
1459 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, 1458 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1460 &authkeyid, sizeof(struct sctp_authkeyid)); 1459 &authkeyid, sizeof(struct sctp_authkeyid));
1461 if (ret < 0) break; 1460 if (ret < 0)
1462 } 1461 break;
1462 }
1463#endif 1463#endif
1464 1464
1465 data->ccs_rcvd = 0; 1465 data->ccs_rcvd = 0;
1466 data->ccs_sent = 0; 1466 data->ccs_sent = 0;
1467 } 1467 }
1468 break; 1468 break;
1469 case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: 1469 case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO:
1470 /* Returns the size of the copied struct. */ 1470 /* Returns the size of the copied struct. */
@@ -1524,30 +1524,30 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1524 /* Pass to default ctrl function to 1524 /* Pass to default ctrl function to
1525 * process SCTP unspecific commands 1525 * process SCTP unspecific commands
1526 */ 1526 */
1527 ret=dgram_ctrl(b, cmd, num, ptr); 1527 ret = dgram_ctrl(b, cmd, num, ptr);
1528 break; 1528 break;
1529 }
1530 return(ret);
1531 } 1529 }
1530 return (ret);
1531}
1532 1532
1533int BIO_dgram_sctp_notification_cb(BIO *b, 1533int
1534 void (*handle_notifications)(BIO *bio, void *context, void *buf), 1534BIO_dgram_sctp_notification_cb(BIO *b,
1535 void *context) 1535 void (*handle_notifications)(BIO *bio, void *context, void *buf),
1536 { 1536 void *context)
1537{
1537 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; 1538 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1538 1539
1539 if (handle_notifications != NULL) 1540 if (handle_notifications != NULL) {
1540 {
1541 data->handle_notifications = handle_notifications; 1541 data->handle_notifications = handle_notifications;
1542 data->notification_context = context; 1542 data->notification_context = context;
1543 } 1543 } else
1544 else
1545 return -1; 1544 return -1;
1546 1545
1547 return 0; 1546 return 0;
1548 } 1547}
1549 1548
1550int BIO_dgram_sctp_wait_for_dry(BIO *b) 1549int
1550BIO_dgram_sctp_wait_for_dry(BIO *b)
1551{ 1551{
1552 int is_dry = 0; 1552 int is_dry = 0;
1553 int n, sockflags, ret; 1553 int n, sockflags, ret;
@@ -1574,9 +1574,9 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1574 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); 1574 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize);
1575 if (ret < 0) 1575 if (ret < 0)
1576 return -1; 1576 return -1;
1577 1577
1578 event.sctp_sender_dry_event = 1; 1578 event.sctp_sender_dry_event = 1;
1579 1579
1580 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); 1580 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
1581#endif 1581#endif
1582 if (ret < 0) 1582 if (ret < 0)
@@ -1595,17 +1595,15 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1595 msg.msg_flags = 0; 1595 msg.msg_flags = 0;
1596 1596
1597 n = recvmsg(b->num, &msg, MSG_PEEK); 1597 n = recvmsg(b->num, &msg, MSG_PEEK);
1598 if (n <= 0) 1598 if (n <= 0) {
1599 {
1600 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1599 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1601 return -1; 1600 return -1;
1602 else 1601 else
1603 return 0; 1602 return 0;
1604 } 1603 }
1605 1604
1606 /* if we find a notification, process it and try again if necessary */ 1605 /* if we find a notification, process it and try again if necessary */
1607 while (msg.msg_flags & MSG_NOTIFICATION) 1606 while (msg.msg_flags & MSG_NOTIFICATION) {
1608 {
1609 memset(&snp, 0x00, sizeof(union sctp_notification)); 1607 memset(&snp, 0x00, sizeof(union sctp_notification));
1610 iov.iov_base = (char *)&snp; 1608 iov.iov_base = (char *)&snp;
1611 iov.iov_len = sizeof(union sctp_notification); 1609 iov.iov_len = sizeof(union sctp_notification);
@@ -1618,16 +1616,14 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1618 msg.msg_flags = 0; 1616 msg.msg_flags = 0;
1619 1617
1620 n = recvmsg(b->num, &msg, 0); 1618 n = recvmsg(b->num, &msg, 0);
1621 if (n <= 0) 1619 if (n <= 0) {
1622 {
1623 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1620 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1624 return -1; 1621 return -1;
1625 else 1622 else
1626 return is_dry; 1623 return is_dry;
1627 } 1624 }
1628 1625
1629 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) 1626 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1630 {
1631 is_dry = 1; 1627 is_dry = 1;
1632 1628
1633 /* disable sender dry event */ 1629 /* disable sender dry event */
@@ -1649,7 +1645,7 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1649#endif 1645#endif
1650 if (ret < 0) 1646 if (ret < 0)
1651 return -1; 1647 return -1;
1652 } 1648 }
1653 1649
1654#ifdef SCTP_AUTHENTICATION_EVENT 1650#ifdef SCTP_AUTHENTICATION_EVENT
1655 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1651 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1672,34 +1668,32 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1672 msg.msg_flags = 0; 1668 msg.msg_flags = 0;
1673 1669
1674 /* if we have seen the dry already, don't wait */ 1670 /* if we have seen the dry already, don't wait */
1675 if (is_dry) 1671 if (is_dry) {
1676 {
1677 sockflags = fcntl(b->num, F_GETFL, 0); 1672 sockflags = fcntl(b->num, F_GETFL, 0);
1678 fcntl(b->num, F_SETFL, O_NONBLOCK); 1673 fcntl(b->num, F_SETFL, O_NONBLOCK);
1679 } 1674 }
1680 1675
1681 n = recvmsg(b->num, &msg, MSG_PEEK); 1676 n = recvmsg(b->num, &msg, MSG_PEEK);
1682 1677
1683 if (is_dry) 1678 if (is_dry) {
1684 {
1685 fcntl(b->num, F_SETFL, sockflags); 1679 fcntl(b->num, F_SETFL, sockflags);
1686 } 1680 }
1687 1681
1688 if (n <= 0) 1682 if (n <= 0) {
1689 {
1690 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1683 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1691 return -1; 1684 return -1;
1692 else 1685 else
1693 return is_dry; 1686 return is_dry;
1694 }
1695 } 1687 }
1688 }
1696 1689
1697 /* read anything else */ 1690 /* read anything else */
1698 return is_dry; 1691 return is_dry;
1699} 1692}
1700 1693
1701int BIO_dgram_sctp_msg_waiting(BIO *b) 1694int
1702 { 1695BIO_dgram_sctp_msg_waiting(BIO *b)
1696{
1703 int n, sockflags; 1697 int n, sockflags;
1704 union sctp_notification snp; 1698 union sctp_notification snp;
1705 struct msghdr msg; 1699 struct msghdr msg;
@@ -1708,7 +1702,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1708 1702
1709 /* Check if there are any messages waiting to be read */ 1703 /* Check if there are any messages waiting to be read */
1710 do 1704 do
1711 { 1705 {
1712 memset(&snp, 0x00, sizeof(union sctp_notification)); 1706 memset(&snp, 0x00, sizeof(union sctp_notification));
1713 iov.iov_base = (char *)&snp; 1707 iov.iov_base = (char *)&snp;
1714 iov.iov_len = sizeof(union sctp_notification); 1708 iov.iov_len = sizeof(union sctp_notification);
@@ -1726,8 +1720,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1726 fcntl(b->num, F_SETFL, sockflags); 1720 fcntl(b->num, F_SETFL, sockflags);
1727 1721
1728 /* if notification, process and try again */ 1722 /* if notification, process and try again */
1729 if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) 1723 if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) {
1730 {
1731#ifdef SCTP_AUTHENTICATION_EVENT 1724#ifdef SCTP_AUTHENTICATION_EVENT
1732 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1725 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
1733 dgram_sctp_handle_auth_free_key_event(b, &snp); 1726 dgram_sctp_handle_auth_free_key_event(b, &snp);
@@ -1747,34 +1740,35 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1747 1740
1748 if (data->handle_notifications != NULL) 1741 if (data->handle_notifications != NULL)
1749 data->handle_notifications(b, data->notification_context, (void*) &snp); 1742 data->handle_notifications(b, data->notification_context, (void*) &snp);
1750 } 1743 }
1751 1744
1752 } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); 1745 } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
1753 1746
1754 /* Return 1 if there is a message to be read, return 0 otherwise. */ 1747 /* Return 1 if there is a message to be read, return 0 otherwise. */
1755 if (n > 0) 1748 if (n > 0)
1756 return 1; 1749 return 1;
1757 else 1750 else
1758 return 0; 1751 return 0;
1759 } 1752}
1760 1753
1761static int dgram_sctp_puts(BIO *bp, const char *str) 1754static int
1762 { 1755dgram_sctp_puts(BIO *bp, const char *str)
1763 int n,ret; 1756{
1757 int n, ret;
1764 1758
1765 n=strlen(str); 1759 n = strlen(str);
1766 ret=dgram_sctp_write(bp,str,n); 1760 ret = dgram_sctp_write(bp, str, n);
1767 return(ret); 1761 return (ret);
1768 } 1762}
1769#endif 1763#endif
1770 1764
1771static int BIO_dgram_should_retry(int i) 1765static int
1772 { 1766BIO_dgram_should_retry(int i)
1767{
1773 int err; 1768 int err;
1774 1769
1775 if ((i == 0) || (i == -1)) 1770 if ((i == 0) || (i == -1)) {
1776 { 1771 err = errno;
1777 err=errno;
1778 1772
1779#if defined(OPENSSL_SYS_WINDOWS) 1773#if defined(OPENSSL_SYS_WINDOWS)
1780 /* If the socket return value (i) is -1 1774 /* If the socket return value (i) is -1
@@ -1785,15 +1779,15 @@ static int BIO_dgram_should_retry(int i)
1785 */ 1779 */
1786#endif 1780#endif
1787 1781
1788 return(BIO_dgram_non_fatal_error(err)); 1782 return (BIO_dgram_non_fatal_error(err));
1789 }
1790 return(0);
1791 } 1783 }
1784 return (0);
1785}
1792 1786
1793int BIO_dgram_non_fatal_error(int err) 1787int
1794 { 1788BIO_dgram_non_fatal_error(int err)
1795 switch (err) 1789{
1796 { 1790 switch (err) {
1797#if defined(OPENSSL_SYS_WINDOWS) 1791#if defined(OPENSSL_SYS_WINDOWS)
1798# if defined(WSAEWOULDBLOCK) 1792# if defined(WSAEWOULDBLOCK)
1799 case WSAEWOULDBLOCK: 1793 case WSAEWOULDBLOCK:
@@ -1838,17 +1832,17 @@ int BIO_dgram_non_fatal_error(int err)
1838 case EALREADY: 1832 case EALREADY:
1839#endif 1833#endif
1840 1834
1841 return(1); 1835 return (1);
1842 /* break; */ 1836 /* break; */
1843 default: 1837 default:
1844 break; 1838 break;
1845 }
1846 return(0);
1847 } 1839 }
1840 return (0);
1841}
1848 1842
1849static void get_current_time(struct timeval *t) 1843static void
1850 { 1844get_current_time(struct timeval *t) {
1851 gettimeofday(t, NULL); 1845 gettimeofday(t, NULL);
1852 } 1846}
1853 1847
1854#endif 1848#endif
diff --git a/src/lib/libcrypto/bio/bss_fd.c b/src/lib/libcrypto/bio/bss_fd.c
index ab18a56310..35ddd61359 100644
--- a/src/lib/libcrypto/bio/bss_fd.c
+++ b/src/lib/libcrypto/bio/bss_fd.c
@@ -90,9 +90,8 @@ static int fd_new(BIO *h);
90static int fd_free(BIO *data); 90static int fd_free(BIO *data);
91int BIO_fd_should_retry(int s); 91int BIO_fd_should_retry(int s);
92 92
93static BIO_METHOD methods_fdp= 93static BIO_METHOD methods_fdp = {
94 { 94 BIO_TYPE_FD, "file descriptor",
95 BIO_TYPE_FD,"file descriptor",
96 fd_write, 95 fd_write,
97 fd_read, 96 fd_read,
98 fd_puts, 97 fd_puts,
@@ -101,178 +100,182 @@ static BIO_METHOD methods_fdp=
101 fd_new, 100 fd_new,
102 fd_free, 101 fd_free,
103 NULL, 102 NULL,
104 }; 103};
105 104
106BIO_METHOD *BIO_s_fd(void) 105BIO_METHOD
107 { 106*BIO_s_fd(void)
108 return(&methods_fdp); 107{
109 } 108 return (&methods_fdp);
109}
110 110
111BIO *BIO_new_fd(int fd,int close_flag) 111BIO
112 { 112*BIO_new_fd(int fd, int close_flag)
113{
113 BIO *ret; 114 BIO *ret;
114 ret=BIO_new(BIO_s_fd()); 115 ret = BIO_new(BIO_s_fd());
115 if (ret == NULL) return(NULL); 116 if (ret == NULL)
116 BIO_set_fd(ret,fd,close_flag); 117 return (NULL);
117 return(ret); 118 BIO_set_fd(ret, fd, close_flag);
118 } 119 return (ret);
120}
119 121
120static int fd_new(BIO *bi) 122static int
121 { 123fd_new(BIO *bi)
122 bi->init=0; 124{
123 bi->num=-1; 125 bi->init = 0;
124 bi->ptr=NULL; 126 bi->num = -1;
127 bi->ptr = NULL;
125 bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ 128 bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */
126 return(1); 129 return (1);
127 } 130}
128 131
129static int fd_free(BIO *a) 132static int
130 { 133fd_free(BIO *a)
131 if (a == NULL) return(0); 134{
132 if (a->shutdown) 135 if (a == NULL)
133 { 136 return (0);
134 if (a->init) 137 if (a->shutdown) {
135 { 138 if (a->init) {
136 UP_close(a->num); 139 UP_close(a->num);
137 }
138 a->init=0;
139 a->flags=BIO_FLAGS_UPLINK;
140 } 140 }
141 return(1); 141 a->init = 0;
142 a->flags = BIO_FLAGS_UPLINK;
142 } 143 }
143 144 return (1);
144static int fd_read(BIO *b, char *out,int outl) 145}
145 {
146 int ret=0;
147 146
148 if (out != NULL) 147static int
149 { 148fd_read(BIO *b, char *out, int outl)
149{
150 int ret = 0;
151
152 if (out != NULL) {
150 errno = 0; 153 errno = 0;
151 ret=UP_read(b->num,out,outl); 154 ret = UP_read(b->num, out, outl);
152 BIO_clear_retry_flags(b); 155 BIO_clear_retry_flags(b);
153 if (ret <= 0) 156 if (ret <= 0) {
154 {
155 if (BIO_fd_should_retry(ret)) 157 if (BIO_fd_should_retry(ret))
156 BIO_set_retry_read(b); 158 BIO_set_retry_read(b);
157 }
158 } 159 }
159 return(ret);
160 } 160 }
161 return (ret);
162}
161 163
162static int fd_write(BIO *b, const char *in, int inl) 164static int
163 { 165fd_write(BIO *b, const char *in, int inl)
166{
164 int ret; 167 int ret;
165 errno = 0; 168 errno = 0;
166 ret=UP_write(b->num,in,inl); 169 ret = UP_write(b->num, in, inl);
167 BIO_clear_retry_flags(b); 170 BIO_clear_retry_flags(b);
168 if (ret <= 0) 171 if (ret <= 0) {
169 {
170 if (BIO_fd_should_retry(ret)) 172 if (BIO_fd_should_retry(ret))
171 BIO_set_retry_write(b); 173 BIO_set_retry_write(b);
172 }
173 return(ret);
174 } 174 }
175 return (ret);
176}
175 177
176static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) 178static long
177 { 179fd_ctrl(BIO *b, int cmd, long num, void *ptr)
178 long ret=1; 180{
181 long ret = 1;
179 int *ip; 182 int *ip;
180 183
181 switch (cmd) 184 switch (cmd) {
182 {
183 case BIO_CTRL_RESET: 185 case BIO_CTRL_RESET:
184 num=0; 186 num = 0;
185 case BIO_C_FILE_SEEK: 187 case BIO_C_FILE_SEEK:
186 ret=(long)UP_lseek(b->num,num,0); 188 ret = (long)UP_lseek(b->num, num, 0);
187 break; 189 break;
188 case BIO_C_FILE_TELL: 190 case BIO_C_FILE_TELL:
189 case BIO_CTRL_INFO: 191 case BIO_CTRL_INFO:
190 ret=(long)UP_lseek(b->num,0,1); 192 ret = (long)UP_lseek(b->num, 0, 1);
191 break; 193 break;
192 case BIO_C_SET_FD: 194 case BIO_C_SET_FD:
193 fd_free(b); 195 fd_free(b);
194 b->num= *((int *)ptr); 196 b->num= *((int *)ptr);
195 b->shutdown=(int)num; 197 b->shutdown = (int)num;
196 b->init=1; 198 b->init = 1;
197 break; 199 break;
198 case BIO_C_GET_FD: 200 case BIO_C_GET_FD:
199 if (b->init) 201 if (b->init) {
200 { 202 ip = (int *)ptr;
201 ip=(int *)ptr; 203 if (ip != NULL)
202 if (ip != NULL) *ip=b->num; 204 *ip = b->num;
203 ret=b->num; 205 ret = b->num;
204 } 206 } else
205 else 207 ret = -1;
206 ret= -1;
207 break; 208 break;
208 case BIO_CTRL_GET_CLOSE: 209 case BIO_CTRL_GET_CLOSE:
209 ret=b->shutdown; 210 ret = b->shutdown;
210 break; 211 break;
211 case BIO_CTRL_SET_CLOSE: 212 case BIO_CTRL_SET_CLOSE:
212 b->shutdown=(int)num; 213 b->shutdown = (int)num;
213 break; 214 break;
214 case BIO_CTRL_PENDING: 215 case BIO_CTRL_PENDING:
215 case BIO_CTRL_WPENDING: 216 case BIO_CTRL_WPENDING:
216 ret=0; 217 ret = 0;
217 break; 218 break;
218 case BIO_CTRL_DUP: 219 case BIO_CTRL_DUP:
219 case BIO_CTRL_FLUSH: 220 case BIO_CTRL_FLUSH:
220 ret=1; 221 ret = 1;
221 break; 222 break;
222 default: 223 default:
223 ret=0; 224 ret = 0;
224 break; 225 break;
225 }
226 return(ret);
227 } 226 }
227 return (ret);
228}
228 229
229static int fd_puts(BIO *bp, const char *str) 230static int
230 { 231fd_puts(BIO *bp, const char *str)
231 int n,ret; 232{
233 int n, ret;
232 234
233 n=strlen(str); 235 n = strlen(str);
234 ret=fd_write(bp,str,n); 236 ret = fd_write(bp, str, n);
235 return(ret); 237 return (ret);
236 } 238}
237 239
238static int fd_gets(BIO *bp, char *buf, int size) 240static int
239 { 241fd_gets(BIO *bp, char *buf, int size)
240 int ret=0; 242{
241 char *ptr=buf; 243 int ret = 0;
242 char *end=buf+size-1; 244 char *ptr = buf;
245 char *end = buf + size - 1;
243 246
244 while ( (ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n') ) 247 while ((ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n'))
245 ptr++; 248 ptr++;
246 249
247 ptr[0]='\0'; 250 ptr[0] = '\0';
248 251
249 if (buf[0] != '\0') 252 if (buf[0] != '\0')
250 ret=strlen(buf); 253 ret = strlen(buf);
251 return(ret); 254 return (ret);
252 } 255}
253 256
254int BIO_fd_should_retry(int i) 257int
255 { 258BIO_fd_should_retry(int i)
259{
256 int err; 260 int err;
257 261
258 if ((i == 0) || (i == -1)) 262 if ((i == 0) || (i == -1)) {
259 { 263 err = errno;
260 err=errno;
261 264
262#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 265#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
263 if ((i == -1) && (err == 0)) 266 if ((i == -1) && (err == 0))
264 return(1); 267 return (1);
265#endif 268#endif
266 269
267 return(BIO_fd_non_fatal_error(err)); 270 return (BIO_fd_non_fatal_error(err));
268 }
269 return(0);
270 } 271 }
272 return (0);
273}
271 274
272int BIO_fd_non_fatal_error(int err) 275int
273 { 276BIO_fd_non_fatal_error(int err)
274 switch (err) 277{
275 { 278 switch (err) {
276 279
277#ifdef EWOULDBLOCK 280#ifdef EWOULDBLOCK
278# ifdef WSAEWOULDBLOCK 281# ifdef WSAEWOULDBLOCK
@@ -309,11 +312,11 @@ int BIO_fd_non_fatal_error(int err)
309#ifdef EALREADY 312#ifdef EALREADY
310 case EALREADY: 313 case EALREADY:
311#endif 314#endif
312 return(1); 315 return (1);
313 /* break; */ 316 /* break; */
314 default: 317 default:
315 break; 318 break;
316 }
317 return(0);
318 } 319 }
320 return (0);
321}
319#endif 322#endif
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c
index 638572ab7f..794f503a69 100644
--- a/src/lib/libcrypto/bio/bss_file.c
+++ b/src/lib/libcrypto/bio/bss_file.c
@@ -102,8 +102,8 @@ static int file_gets(BIO *h, char *str, int size);
102static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); 102static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2);
103static int file_new(BIO *h); 103static int file_new(BIO *h);
104static int file_free(BIO *data); 104static int file_free(BIO *data);
105static BIO_METHOD methods_filep= 105
106 { 106static BIO_METHOD methods_filep = {
107 BIO_TYPE_FILE, 107 BIO_TYPE_FILE,
108 "FILE pointer", 108 "FILE pointer",
109 file_write, 109 file_write,
@@ -114,15 +114,16 @@ static BIO_METHOD methods_filep=
114 file_new, 114 file_new,
115 file_free, 115 file_free,
116 NULL, 116 NULL,
117 }; 117};
118 118
119BIO *BIO_new_file(const char *filename, const char *mode) 119BIO
120 { 120*BIO_new_file(const char *filename, const char *mode)
121{
121 BIO *ret; 122 BIO *ret;
122 FILE *file=NULL; 123 FILE *file = NULL;
123 124
124#if defined(_WIN32) && defined(CP_UTF8) 125#if defined(_WIN32) && defined(CP_UTF8)
125 int sz, len_0 = (int)strlen(filename)+1; 126 int sz, len_0 = (int)strlen(filename) + 1;
126 DWORD flags; 127 DWORD flags;
127 128
128 /* 129 /*
@@ -137,173 +138,171 @@ BIO *BIO_new_file(const char *filename, const char *mode)
137 * ERROR_NO_UNICODE_TRANSLATION, in which case we fall 138 * ERROR_NO_UNICODE_TRANSLATION, in which case we fall
138 * back to fopen... 139 * back to fopen...
139 */ 140 */
140 if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS), 141 if ((sz = MultiByteToWideChar(CP_UTF8,(flags = MB_ERR_INVALID_CHARS),
141 filename,len_0,NULL,0))>0 || 142 filename, len_0, NULL, 0)) > 0 ||
142 (GetLastError()==ERROR_INVALID_FLAGS && 143 (GetLastError() == ERROR_INVALID_FLAGS &&
143 (sz=MultiByteToWideChar(CP_UTF8,(flags=0), 144 (sz = MultiByteToWideChar(CP_UTF8,(flags = 0),
144 filename,len_0,NULL,0))>0) 145 filename, len_0, NULL, 0)) > 0)) {
145 )
146 {
147 WCHAR wmode[8]; 146 WCHAR wmode[8];
148 WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); 147 WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
149 148
150 if (MultiByteToWideChar(CP_UTF8,flags, 149 if (MultiByteToWideChar(CP_UTF8, flags, filename, len_0,
151 filename,len_0,wfilename,sz) && 150 wfilename, sz) && MultiByteToWideChar(CP_UTF8, 0, mode,
152 MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1, 151 strlen(mode) + 1, wmode,
153 wmode,sizeof(wmode)/sizeof(wmode[0])) && 152 sizeof(wmode) / sizeof(wmode[0])) &&
154 (file=_wfopen(wfilename,wmode))==NULL && 153 (file = _wfopen(wfilename, wmode)) == NULL &&
155 (errno==ENOENT || errno==EBADF) 154 (errno == ENOENT || errno == EBADF)
156 ) /* UTF-8 decode succeeded, but no file, filename 155 ) /* UTF - 8 decode succeeded, but no file, filename
157 * could still have been locale-ized... */ 156 * could still have been locale-ized... */
158 file = fopen(filename,mode); 157 file = fopen(filename, mode);
159 } 158 } else if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) {
160 else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) 159 file = fopen(filename, mode);
161 { 160 }
162 file = fopen(filename,mode);
163 }
164#else 161#else
165 file=fopen(filename,mode); 162 file = fopen(filename, mode);
163
166#endif 164#endif
167 if (file == NULL) 165 if (file == NULL) {
168 {
169 SYSerr(SYS_F_FOPEN, errno); 166 SYSerr(SYS_F_FOPEN, errno);
170 ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); 167 ERR_add_error_data(5, "fopen('", filename, "', '", mode, "')");
171 if (errno == ENOENT) 168 if (errno == ENOENT)
172 BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); 169 BIOerr(BIO_F_BIO_NEW_FILE, BIO_R_NO_SUCH_FILE);
173 else 170 else
174 BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); 171 BIOerr(BIO_F_BIO_NEW_FILE, ERR_R_SYS_LIB);
175 return(NULL); 172 return (NULL);
176 } 173 }
177 if ((ret=BIO_new(BIO_s_file())) == NULL) 174 if ((ret = BIO_new(BIO_s_file())) == NULL) {
178 {
179 fclose(file); 175 fclose(file);
180 return(NULL); 176 return (NULL);
181 }
182
183 BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
184 BIO_set_fp(ret,file,BIO_CLOSE);
185 return(ret);
186 } 177 }
187 178
188BIO *BIO_new_fp(FILE *stream, int close_flag) 179 BIO_clear_flags(ret, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
189 { 180 BIO_set_fp(ret, file, BIO_CLOSE);
190 BIO *ret; 181 return (ret);
191 182}
192 if ((ret=BIO_new(BIO_s_file())) == NULL)
193 return(NULL);
194
195 BIO_set_flags(ret,BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */
196 BIO_set_fp(ret,stream,close_flag);
197 return(ret);
198 }
199 183
200BIO_METHOD *BIO_s_file(void) 184BIO
201 { 185*BIO_new_fp(FILE *stream, int close_flag)
202 return(&methods_filep); 186{
203 } 187 BIO *ret;
204 188
205static int file_new(BIO *bi) 189 if ((ret = BIO_new(BIO_s_file())) == NULL)
206 { 190 return (NULL);
207 bi->init=0; 191
208 bi->num=0; 192 BIO_set_flags(ret, BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */
209 bi->ptr=NULL; 193 BIO_set_fp(ret, stream, close_flag);
194 return (ret);
195}
196
197BIO_METHOD
198*BIO_s_file(void)
199{
200 return (&methods_filep);
201}
202
203static int
204file_new(BIO *bi)
205{
206 bi->init = 0;
207 bi->num = 0;
208 bi->ptr = NULL;
210 bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ 209 bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */
211 return(1); 210 return (1);
212 } 211}
213 212
214static int file_free(BIO *a) 213static int
215 { 214file_free(BIO *a)
216 if (a == NULL) return(0); 215{
217 if (a->shutdown) 216 if (a == NULL)
218 { 217 return (0);
219 if ((a->init) && (a->ptr != NULL)) 218 if (a->shutdown) {
220 { 219 if ((a->init) && (a->ptr != NULL)) {
221 if (a->flags&BIO_FLAGS_UPLINK) 220 if (a->flags&BIO_FLAGS_UPLINK)
222 UP_fclose (a->ptr); 221 UP_fclose (a->ptr);
223 else 222 else
224 fclose (a->ptr); 223 fclose (a->ptr);
225 a->ptr=NULL; 224 a->ptr = NULL;
226 a->flags=BIO_FLAGS_UPLINK; 225 a->flags = BIO_FLAGS_UPLINK;
227 }
228 a->init=0;
229 } 226 }
230 return(1); 227 a->init = 0;
231 } 228 }
232 229 return (1);
233static int file_read(BIO *b, char *out, int outl) 230}
234 {
235 int ret=0;
236 231
237 if (b->init && (out != NULL)) 232static int
238 { 233file_read(BIO *b, char *out, int outl)
234{
235 int ret = 0;
236
237 if (b->init && (out != NULL)) {
239 if (b->flags&BIO_FLAGS_UPLINK) 238 if (b->flags&BIO_FLAGS_UPLINK)
240 ret=UP_fread(out,1,(int)outl,b->ptr); 239 ret = UP_fread(out, 1,(int)outl, b->ptr);
241 else 240 else
242 ret=fread(out,1,(int)outl,(FILE *)b->ptr); 241 ret = fread(out, 1,(int)outl,(FILE *)b->ptr);
243 if(ret == 0 && (b->flags&BIO_FLAGS_UPLINK)?UP_ferror((FILE *)b->ptr):ferror((FILE *)b->ptr)) 242 if (ret == 0 && (b->flags & BIO_FLAGS_UPLINK) ?
244 { 243 UP_ferror((FILE *)b->ptr) : ferror((FILE *)b->ptr)) {
245 SYSerr(SYS_F_FREAD, errno); 244 SYSerr(SYS_F_FREAD, errno);
246 BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB); 245 BIOerr(BIO_F_FILE_READ, ERR_R_SYS_LIB);
247 ret=-1; 246 ret = -1;
248 }
249 } 247 }
250 return(ret);
251 } 248 }
249 return (ret);
250}
252 251
253static int file_write(BIO *b, const char *in, int inl) 252static int
254 { 253file_write(BIO *b, const char *in, int inl)
255 int ret=0; 254{
255 int ret = 0;
256 256
257 if (b->init && (in != NULL)) 257 if (b->init && (in != NULL)) {
258 {
259 if (b->flags&BIO_FLAGS_UPLINK) 258 if (b->flags&BIO_FLAGS_UPLINK)
260 ret=UP_fwrite(in,(int)inl,1,b->ptr); 259 ret = UP_fwrite(in,(int)inl, 1, b->ptr);
261 else 260 else
262 ret=fwrite(in,(int)inl,1,(FILE *)b->ptr); 261 ret = fwrite(in,(int)inl, 1,(FILE *)b->ptr);
263 if (ret) 262 if (ret)
264 ret=inl; 263 ret = inl;
265 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ 264 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */
266 /* according to Tim Hudson <tjh@cryptsoft.com>, the commented 265 /* according to Tim Hudson <tjh@cryptsoft.com>, the commented
267 * out version above can cause 'inl' write calls under 266 * out version above can cause 'inl' write calls under
268 * some stupid stdio implementations (VMS) */ 267 * some stupid stdio implementations (VMS) */
269 }
270 return(ret);
271 } 268 }
272 269 return (ret);
273static long file_ctrl(BIO *b, int cmd, long num, void *ptr) 270}
274 { 271
275 long ret=1; 272static long
276 FILE *fp=(FILE *)b->ptr; 273file_ctrl(BIO *b, int cmd, long num, void *ptr)
274{
275 long ret = 1;
276 FILE *fp = (FILE *)b->ptr;
277 FILE **fpp; 277 FILE **fpp;
278 char p[4]; 278 char p[4];
279 279
280 switch (cmd) 280 switch (cmd) {
281 {
282 case BIO_C_FILE_SEEK: 281 case BIO_C_FILE_SEEK:
283 case BIO_CTRL_RESET: 282 case BIO_CTRL_RESET:
284 if (b->flags&BIO_FLAGS_UPLINK) 283 if (b->flags&BIO_FLAGS_UPLINK)
285 ret=(long)UP_fseek(b->ptr,num,0); 284 ret = (long)UP_fseek(b->ptr, num, 0);
286 else 285 else
287 ret=(long)fseek(fp,num,0); 286 ret = (long)fseek(fp, num, 0);
288 break; 287 break;
289 case BIO_CTRL_EOF: 288 case BIO_CTRL_EOF:
290 if (b->flags&BIO_FLAGS_UPLINK) 289 if (b->flags&BIO_FLAGS_UPLINK)
291 ret=(long)UP_feof(fp); 290 ret = (long)UP_feof(fp);
292 else 291 else
293 ret=(long)feof(fp); 292 ret = (long)feof(fp);
294 break; 293 break;
295 case BIO_C_FILE_TELL: 294 case BIO_C_FILE_TELL:
296 case BIO_CTRL_INFO: 295 case BIO_CTRL_INFO:
297 if (b->flags&BIO_FLAGS_UPLINK) 296 if (b->flags&BIO_FLAGS_UPLINK)
298 ret=UP_ftell(b->ptr); 297 ret = UP_ftell(b->ptr);
299 else 298 else
300 ret=ftell(fp); 299 ret = ftell(fp);
301 break; 300 break;
302 case BIO_C_SET_FILE_PTR: 301 case BIO_C_SET_FILE_PTR:
303 file_free(b); 302 file_free(b);
304 b->shutdown=(int)num&BIO_CLOSE; 303 b->shutdown = (int)num&BIO_CLOSE;
305 b->ptr=ptr; 304 b->ptr = ptr;
306 b->init=1; 305 b->init = 1;
307#if BIO_FLAGS_UPLINK!=0 306#if BIO_FLAGS_UPLINK!=0
308#if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) 307#if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES)
309#define _IOB_ENTRIES 20 308#define _IOB_ENTRIES 20
@@ -311,8 +310,8 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
311#if defined(_IOB_ENTRIES) 310#if defined(_IOB_ENTRIES)
312 /* Safety net to catch purely internal BIO_set_fp calls */ 311 /* Safety net to catch purely internal BIO_set_fp calls */
313 if ((size_t)ptr >= (size_t)stdin && 312 if ((size_t)ptr >= (size_t)stdin &&
314 (size_t)ptr < (size_t)(stdin+_IOB_ENTRIES)) 313 (size_t)ptr < (size_t)(stdin + _IOB_ENTRIES))
315 BIO_clear_flags(b,BIO_FLAGS_UPLINK); 314 BIO_clear_flags(b, BIO_FLAGS_UPLINK);
316#endif 315#endif
317#endif 316#endif
318#ifdef UP_fsetmod 317#ifdef UP_fsetmod
@@ -322,102 +321,94 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
322#endif 321#endif
323 { 322 {
324#if defined(OPENSSL_SYS_WINDOWS) 323#if defined(OPENSSL_SYS_WINDOWS)
325 int fd = _fileno((FILE*)ptr); 324 int fd = _fileno((FILE*)ptr);
326 if (num & BIO_FP_TEXT) 325 if (num & BIO_FP_TEXT)
327 _setmode(fd,_O_TEXT); 326 _setmode(fd, _O_TEXT);
328 else 327 else
329 _setmode(fd,_O_BINARY); 328 _setmode(fd, _O_BINARY);
330#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) 329#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
331 int fd = fileno((FILE*)ptr); 330 int fd = fileno((FILE*)ptr);
332 /* Under CLib there are differences in file modes */ 331 /* Under CLib there are differences in file modes */
333 if (num & BIO_FP_TEXT) 332 if (num & BIO_FP_TEXT)
334 setmode(fd,O_TEXT); 333 setmode(fd, O_TEXT);
335 else
336 setmode(fd,O_BINARY);
337#elif defined(OPENSSL_SYS_MSDOS)
338 int fd = fileno((FILE*)ptr);
339 /* Set correct text/binary mode */
340 if (num & BIO_FP_TEXT)
341 _setmode(fd,_O_TEXT);
342 /* Dangerous to set stdin/stdout to raw (unless redirected) */
343 else
344 {
345 if (fd == STDIN_FILENO || fd == STDOUT_FILENO)
346 {
347 if (isatty(fd) <= 0)
348 _setmode(fd,_O_BINARY);
349 }
350 else 334 else
351 _setmode(fd,_O_BINARY); 335 setmode(fd, O_BINARY);
336#elif defined(OPENSSL_SYS_MSDOS)
337 int fd = fileno((FILE*)ptr);
338 /* Set correct text/binary mode */
339 if (num & BIO_FP_TEXT)
340 _setmode(fd, _O_TEXT);
341 /* Dangerous to set stdin/stdout to raw (unless redirected) */
342 else {
343 if (fd == STDIN_FILENO || fd == STDOUT_FILENO) {
344 if (isatty(fd) <= 0)
345 _setmode(fd, _O_BINARY);
346 } else
347 _setmode(fd, _O_BINARY);
352 } 348 }
353#elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) 349#elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
354 int fd = fileno((FILE*)ptr); 350 int fd = fileno((FILE*)ptr);
355 if (num & BIO_FP_TEXT) 351 if (num & BIO_FP_TEXT)
356 setmode(fd, O_TEXT); 352 setmode(fd, O_TEXT);
357 else 353 else
358 setmode(fd, O_BINARY); 354 setmode(fd, O_BINARY);
359#endif 355#endif
360 } 356 }
361 break; 357 break;
362 case BIO_C_SET_FILENAME: 358 case BIO_C_SET_FILENAME:
363 file_free(b); 359 file_free(b);
364 b->shutdown=(int)num&BIO_CLOSE; 360 b->shutdown = (int)num&BIO_CLOSE;
365 if (num & BIO_FP_APPEND) 361 if (num & BIO_FP_APPEND) {
366 {
367 if (num & BIO_FP_READ) 362 if (num & BIO_FP_READ)
368 BUF_strlcpy(p,"a+",sizeof p); 363 BUF_strlcpy(p, "a+", sizeof p);
369 else BUF_strlcpy(p,"a",sizeof p); 364 else BUF_strlcpy(p, "a", sizeof p);
370 } 365 } else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE))
371 else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) 366 BUF_strlcpy(p, "r+", sizeof p);
372 BUF_strlcpy(p,"r+",sizeof p);
373 else if (num & BIO_FP_WRITE) 367 else if (num & BIO_FP_WRITE)
374 BUF_strlcpy(p,"w",sizeof p); 368 BUF_strlcpy(p, "w", sizeof p);
375 else if (num & BIO_FP_READ) 369 else if (num & BIO_FP_READ)
376 BUF_strlcpy(p,"r",sizeof p); 370 BUF_strlcpy(p, "r", sizeof p);
377 else 371 else {
378 { 372 BIOerr(BIO_F_FILE_CTRL, BIO_R_BAD_FOPEN_MODE);
379 BIOerr(BIO_F_FILE_CTRL,BIO_R_BAD_FOPEN_MODE); 373 ret = 0;
380 ret=0;
381 break; 374 break;
382 } 375 }
383#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) 376#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
384 if (!(num & BIO_FP_TEXT)) 377 if (!(num & BIO_FP_TEXT))
385 strcat(p,"b"); 378 strcat(p, "b");
386 else 379 else
387 strcat(p,"t"); 380 strcat(p, "t");
388#endif 381#endif
389#if defined(OPENSSL_SYS_NETWARE) 382#if defined(OPENSSL_SYS_NETWARE)
390 if (!(num & BIO_FP_TEXT)) 383 if (!(num & BIO_FP_TEXT))
391 strcat(p,"b"); 384 strcat(p, "b");
392 else 385 else
393 strcat(p,"t"); 386 strcat(p, "t");
394#endif 387#endif
395 fp=fopen(ptr,p); 388 fp = fopen(ptr, p);
396 if (fp == NULL) 389 if (fp == NULL) {
397 {
398 SYSerr(SYS_F_FOPEN, errno); 390 SYSerr(SYS_F_FOPEN, errno);
399 ERR_add_error_data(5,"fopen('",ptr,"','",p,"')"); 391 ERR_add_error_data(5, "fopen('", ptr, "', '", p, "')");
400 BIOerr(BIO_F_FILE_CTRL,ERR_R_SYS_LIB); 392 BIOerr(BIO_F_FILE_CTRL, ERR_R_SYS_LIB);
401 ret=0; 393 ret = 0;
402 break; 394 break;
403 } 395 }
404 b->ptr=fp; 396 b->ptr = fp;
405 b->init=1; 397 b->init = 1;
406 BIO_clear_flags(b,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ 398 BIO_clear_flags(b, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
407 break; 399 break;
408 case BIO_C_GET_FILE_PTR: 400 case BIO_C_GET_FILE_PTR:
409 /* the ptr parameter is actually a FILE ** in this case. */ 401 /* the ptr parameter is actually a FILE ** in this case. */
410 if (ptr != NULL) 402 if (ptr != NULL) {
411 { 403 fpp = (FILE **)ptr;
412 fpp=(FILE **)ptr; 404 *fpp = (FILE *)b->ptr;
413 *fpp=(FILE *)b->ptr; 405 }
414 }
415 break; 406 break;
416 case BIO_CTRL_GET_CLOSE: 407 case BIO_CTRL_GET_CLOSE:
417 ret=(long)b->shutdown; 408 ret = (long)b->shutdown;
418 break; 409 break;
419 case BIO_CTRL_SET_CLOSE: 410 case BIO_CTRL_SET_CLOSE:
420 b->shutdown=(int)num; 411 b->shutdown = (int)num;
421 break; 412 break;
422 case BIO_CTRL_FLUSH: 413 case BIO_CTRL_FLUSH:
423 if (b->flags&BIO_FLAGS_UPLINK) 414 if (b->flags&BIO_FLAGS_UPLINK)
@@ -426,7 +417,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
426 fflush((FILE *)b->ptr); 417 fflush((FILE *)b->ptr);
427 break; 418 break;
428 case BIO_CTRL_DUP: 419 case BIO_CTRL_DUP:
429 ret=1; 420 ret = 1;
430 break; 421 break;
431 422
432 case BIO_CTRL_WPENDING: 423 case BIO_CTRL_WPENDING:
@@ -434,44 +425,41 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
434 case BIO_CTRL_PUSH: 425 case BIO_CTRL_PUSH:
435 case BIO_CTRL_POP: 426 case BIO_CTRL_POP:
436 default: 427 default:
437 ret=0; 428 ret = 0;
438 break; 429 break;
439 }
440 return(ret);
441 } 430 }
431 return (ret);
432}
442 433
443static int file_gets(BIO *bp, char *buf, int size) 434static int
444 { 435file_gets(BIO *bp, char *buf, int size)
445 int ret=0; 436{
437 int ret = 0;
446 438
447 buf[0]='\0'; 439 buf[0] = '\0';
448 if (bp->flags&BIO_FLAGS_UPLINK) 440 if (bp->flags&BIO_FLAGS_UPLINK) {
449 { 441 if (!UP_fgets(buf, size, bp->ptr))
450 if (!UP_fgets(buf,size,bp->ptr))
451 goto err; 442 goto err;
452 } 443 } else {
453 else 444 if (!fgets(buf, size,(FILE *)bp->ptr))
454 {
455 if (!fgets(buf,size,(FILE *)bp->ptr))
456 goto err; 445 goto err;
457 }
458 if (buf[0] != '\0')
459 ret=strlen(buf);
460 err:
461 return(ret);
462 } 446 }
447 if (buf[0] != '\0')
448 ret = strlen(buf);
449err:
450 return (ret);
451}
463 452
464static int file_puts(BIO *bp, const char *str) 453static int
465 { 454file_puts(BIO *bp, const char *str)
466 int n,ret; 455{
456 int n, ret;
467 457
468 n=strlen(str); 458 n = strlen(str);
469 ret=file_write(bp,str,n); 459 ret = file_write(bp, str, n);
470 return(ret); 460 return (ret);
471 } 461}
472 462
473#endif /* OPENSSL_NO_STDIO */ 463#endif /* OPENSSL_NO_STDIO */
474 464
475#endif /* HEADER_BSS_FILE_C */ 465#endif /* HEADER_BSS_FILE_C */
476
477
diff --git a/src/lib/libcrypto/bio/bss_log.c b/src/lib/libcrypto/bio/bss_log.c
index 1cc413a916..9225af4df2 100644
--- a/src/lib/libcrypto/bio/bss_log.c
+++ b/src/lib/libcrypto/bio/bss_log.c
@@ -80,7 +80,7 @@
80# if __INITIAL_POINTER_SIZE == 64 80# if __INITIAL_POINTER_SIZE == 64
81# pragma pointer_size save 81# pragma pointer_size save
82# pragma pointer_size 32 82# pragma pointer_size 32
83 void * _malloc32 (__size_t); 83void * _malloc32 (__size_t);
84# pragma pointer_size restore 84# pragma pointer_size restore
85# endif /* __INITIAL_POINTER_SIZE == 64 */ 85# endif /* __INITIAL_POINTER_SIZE == 64 */
86# endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ 86# endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */
@@ -131,9 +131,8 @@ static void xopenlog(BIO* bp, char* name, int level);
131static void xsyslog(BIO* bp, int priority, const char* string); 131static void xsyslog(BIO* bp, int priority, const char* string);
132static void xcloselog(BIO* bp); 132static void xcloselog(BIO* bp);
133 133
134static BIO_METHOD methods_slg= 134static BIO_METHOD methods_slg = {
135 { 135 BIO_TYPE_MEM, "syslog",
136 BIO_TYPE_MEM,"syslog",
137 slg_write, 136 slg_write,
138 NULL, 137 NULL,
139 slg_puts, 138 slg_puts,
@@ -142,43 +141,46 @@ static BIO_METHOD methods_slg=
142 slg_new, 141 slg_new,
143 slg_free, 142 slg_free,
144 NULL, 143 NULL,
145 }; 144};
146 145
147BIO_METHOD *BIO_s_log(void) 146BIO_METHOD
148 { 147*BIO_s_log(void)
149 return(&methods_slg); 148{
150 } 149 return (&methods_slg);
150}
151 151
152static int slg_new(BIO *bi) 152static int
153 { 153slg_new(BIO *bi)
154 bi->init=1; 154{
155 bi->num=0; 155 bi->init = 1;
156 bi->ptr=NULL; 156 bi->num = 0;
157 bi->ptr = NULL;
157 xopenlog(bi, "application", LOG_DAEMON); 158 xopenlog(bi, "application", LOG_DAEMON);
158 return(1); 159 return (1);
159 } 160}
160 161
161static int slg_free(BIO *a) 162static int
162 { 163slg_free(BIO *a)
163 if (a == NULL) return(0); 164{
165 if (a == NULL)
166 return (0);
164 xcloselog(a); 167 xcloselog(a);
165 return(1); 168 return (1);
166 } 169}
167 170
168static int slg_write(BIO *b, const char *in, int inl) 171static int
169 { 172slg_write(BIO *b, const char *in, int inl)
170 int ret= inl; 173{
174 int ret = inl;
171 char* buf; 175 char* buf;
172 char* pp; 176 char* pp;
173 int priority, i; 177 int priority, i;
174 static const struct 178 static const struct {
175 {
176 int strl; 179 int strl;
177 char str[10]; 180 char str[10];
178 int log_level; 181 int log_level;
179 } 182 }
180 mapping[] = 183 mapping[] = {
181 {
182 { 6, "PANIC ", LOG_EMERG }, 184 { 6, "PANIC ", LOG_EMERG },
183 { 6, "EMERG ", LOG_EMERG }, 185 { 6, "EMERG ", LOG_EMERG },
184 { 4, "EMR ", LOG_EMERG }, 186 { 4, "EMR ", LOG_EMERG },
@@ -199,69 +201,72 @@ static int slg_write(BIO *b, const char *in, int inl)
199 { 6, "DEBUG ", LOG_DEBUG }, 201 { 6, "DEBUG ", LOG_DEBUG },
200 { 4, "DBG ", LOG_DEBUG }, 202 { 4, "DBG ", LOG_DEBUG },
201 { 0, "", LOG_ERR } /* The default */ 203 { 0, "", LOG_ERR } /* The default */
202 }; 204 };
203 205
204 if((buf= (char *)OPENSSL_malloc(inl+ 1)) == NULL){ 206 if ((buf = (char *)OPENSSL_malloc(inl + 1)) == NULL) {
205 return(0); 207 return (0);
206 } 208 }
207 strncpy(buf, in, inl); 209 strncpy(buf, in, inl);
208 buf[inl]= '\0'; 210 buf[inl] = '\0';
209 211
210 i = 0; 212 i = 0;
211 while(strncmp(buf, mapping[i].str, mapping[i].strl) != 0) i++; 213 while (strncmp(buf, mapping[i].str, mapping[i].strl) != 0)
214 i++;
212 priority = mapping[i].log_level; 215 priority = mapping[i].log_level;
213 pp = buf + mapping[i].strl; 216 pp = buf + mapping[i].strl;
214 217
215 xsyslog(b, priority, pp); 218 xsyslog(b, priority, pp);
216 219
217 OPENSSL_free(buf); 220 OPENSSL_free(buf);
218 return(ret); 221 return (ret);
219 } 222}
220 223
221static long slg_ctrl(BIO *b, int cmd, long num, void *ptr) 224static long
222 { 225slg_ctrl(BIO *b, int cmd, long num, void *ptr)
223 switch (cmd) 226{
224 { 227 switch (cmd) {
225 case BIO_CTRL_SET: 228 case BIO_CTRL_SET:
226 xcloselog(b); 229 xcloselog(b);
227 xopenlog(b, ptr, num); 230 xopenlog(b, ptr, num);
228 break; 231 break;
229 default: 232 default:
230 break; 233 break;
231 }
232 return(0);
233 } 234 }
235 return (0);
236}
234 237
235static int slg_puts(BIO *bp, const char *str) 238static int
236 { 239slg_puts(BIO *bp, const char *str)
237 int n,ret; 240{
241 int n, ret;
238 242
239 n=strlen(str); 243 n = strlen(str);
240 ret=slg_write(bp,str,n); 244 ret = slg_write(bp, str, n);
241 return(ret); 245 return (ret);
242 } 246}
243 247
244#if defined(OPENSSL_SYS_WIN32) 248#if defined(OPENSSL_SYS_WIN32)
245 249
246static void xopenlog(BIO* bp, char* name, int level) 250static void
251xopenlog(BIO* bp, char* name, int level)
247{ 252{
248 if (check_winnt()) 253 if (check_winnt())
249 bp->ptr = RegisterEventSourceA(NULL,name); 254 bp->ptr = RegisterEventSourceA(NULL, name);
250 else 255 else
251 bp->ptr = NULL; 256 bp->ptr = NULL;
252} 257}
253 258
254static void xsyslog(BIO *bp, int priority, const char *string) 259static void
260xsyslog(BIO *bp, int priority, const char *string)
255{ 261{
256 LPCSTR lpszStrings[2]; 262 LPCSTR lpszStrings[2];
257 WORD evtype= EVENTLOG_ERROR_TYPE; 263 WORD evtype = EVENTLOG_ERROR_TYPE;
258 char pidbuf[DECIMAL_SIZE(DWORD)+4]; 264 char pidbuf[DECIMAL_SIZE(DWORD) + 4];
259 265
260 if (bp->ptr == NULL) 266 if (bp->ptr == NULL)
261 return; 267 return;
262 268
263 switch (priority) 269 switch (priority) {
264 {
265 case LOG_EMERG: 270 case LOG_EMERG:
266 case LOG_ALERT: 271 case LOG_ALERT:
267 case LOG_CRIT: 272 case LOG_CRIT:
@@ -280,33 +285,37 @@ static void xsyslog(BIO *bp, int priority, const char *string)
280 as error anyway. */ 285 as error anyway. */
281 evtype = EVENTLOG_ERROR_TYPE; 286 evtype = EVENTLOG_ERROR_TYPE;
282 break; 287 break;
283 } 288 }
284 289
285 sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); 290 sprintf(pidbuf, "[%u] ", GetCurrentProcessId());
286 lpszStrings[0] = pidbuf; 291 lpszStrings[0] = pidbuf;
287 lpszStrings[1] = string; 292 lpszStrings[1] = string;
288 293
289 ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, 294 ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0,
290 lpszStrings, NULL); 295 lpszStrings, NULL);
291} 296}
292 297
293static void xcloselog(BIO* bp) 298static void
299xcloselog(BIO* bp)
294{ 300{
295 if(bp->ptr) 301 if (bp->ptr)
296 DeregisterEventSource((HANDLE)(bp->ptr)); 302 DeregisterEventSource((HANDLE)(bp->ptr));
297 bp->ptr= NULL; 303 bp->ptr = NULL;
298} 304}
299 305
300#elif defined(OPENSSL_SYS_VMS) 306#elif defined(OPENSSL_SYS_VMS)
301 307
302static int VMS_OPC_target = LOG_DAEMON; 308static int VMS_OPC_target = LOG_DAEMON;
303 309
304static void xopenlog(BIO* bp, char* name, int level) 310static void
311xopenlog(BIO* bp, char* name, int level)
305{ 312{
306 VMS_OPC_target = level; 313 VMS_OPC_target = level;
314
307} 315}
308 316
309static void xsyslog(BIO *bp, int priority, const char *string) 317static void
318xsyslog(BIO *bp, int priority, const char *string)
310{ 319{
311 struct dsc$descriptor_s opc_dsc; 320 struct dsc$descriptor_s opc_dsc;
312 321
@@ -329,21 +338,28 @@ static void xsyslog(BIO *bp, int priority, const char *string)
329 338
330 char buf[10240]; 339 char buf[10240];
331 unsigned int len; 340 unsigned int len;
332 struct dsc$descriptor_s buf_dsc; 341 struct dsc$descriptor_s buf_dsc;
333 $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); 342 $DESCRIPTOR(fao_cmd, "!AZ: !AZ");
334 char *priority_tag; 343 char *priority_tag;
335 344
336 switch (priority) 345 switch (priority) {
337 { 346 case LOG_EMERG:
338 case LOG_EMERG: priority_tag = "Emergency"; break; 347 priority_tag = "Emergency"; break;
339 case LOG_ALERT: priority_tag = "Alert"; break; 348 case LOG_ALERT:
340 case LOG_CRIT: priority_tag = "Critical"; break; 349 priority_tag = "Alert"; break;
341 case LOG_ERR: priority_tag = "Error"; break; 350 case LOG_CRIT:
342 case LOG_WARNING: priority_tag = "Warning"; break; 351 priority_tag = "Critical"; break;
343 case LOG_NOTICE: priority_tag = "Notice"; break; 352 case LOG_ERR:
344 case LOG_INFO: priority_tag = "Info"; break; 353 priority_tag = "Error"; break;
345 case LOG_DEBUG: priority_tag = "DEBUG"; break; 354 case LOG_WARNING:
346 } 355 priority_tag = "Warning"; break;
356 case LOG_NOTICE:
357 priority_tag = "Notice"; break;
358 case LOG_INFO:
359 priority_tag = "Info"; break;
360 case LOG_DEBUG:
361 priority_tag = "DEBUG"; break;
362 }
347 363
348 buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 364 buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
349 buf_dsc.dsc$b_class = DSC$K_CLASS_S; 365 buf_dsc.dsc$b_class = DSC$K_CLASS_S;
@@ -353,7 +369,7 @@ static void xsyslog(BIO *bp, int priority, const char *string)
353 lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); 369 lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string);
354 370
355 /* We know there's an 8-byte header. That's documented. */ 371 /* We know there's an 8-byte header. That's documented. */
356 opcdef_p = OPCDEF_MALLOC( 8+ len); 372 opcdef_p = OPCDEF_MALLOC( 8 + len);
357 opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; 373 opcdef_p->opc$b_ms_type = OPC$_RQ_RQST;
358 memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); 374 memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3);
359 opcdef_p->opc$l_ms_rqstid = 0; 375 opcdef_p->opc$l_ms_rqstid = 0;
@@ -369,13 +385,15 @@ static void xsyslog(BIO *bp, int priority, const char *string)
369 OPENSSL_free(opcdef_p); 385 OPENSSL_free(opcdef_p);
370} 386}
371 387
372static void xcloselog(BIO* bp) 388static void
389xcloselog(BIO* bp)
373{ 390{
374} 391}
375 392
376#else /* Unix/Watt32 */ 393#else /* Unix/Watt32 */
377 394
378static void xopenlog(BIO* bp, char* name, int level) 395static void
396xopenlog(BIO* bp, char* name, int level)
379{ 397{
380#ifdef WATT32 /* djgpp/DOS */ 398#ifdef WATT32 /* djgpp/DOS */
381 openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); 399 openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level);
@@ -384,12 +402,14 @@ static void xopenlog(BIO* bp, char* name, int level)
384#endif 402#endif
385} 403}
386 404
387static void xsyslog(BIO *bp, int priority, const char *string) 405static void
406xsyslog(BIO *bp, int priority, const char *string)
388{ 407{
389 syslog(priority, "%s", string); 408 syslog(priority, "%s", string);
390} 409}
391 410
392static void xcloselog(BIO* bp) 411static void
412xcloselog(BIO* bp)
393{ 413{
394 closelog(); 414 closelog();
395} 415}
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c
index 37d4194e4b..a5192202bd 100644
--- a/src/lib/libcrypto/bio/bss_mem.c
+++ b/src/lib/libcrypto/bio/bss_mem.c
@@ -68,8 +68,8 @@ static int mem_gets(BIO *h, char *str, int size);
68static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); 68static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2);
69static int mem_new(BIO *h); 69static int mem_new(BIO *h);
70static int mem_free(BIO *data); 70static int mem_free(BIO *data);
71static BIO_METHOD mem_method= 71
72 { 72static BIO_METHOD mem_method = {
73 BIO_TYPE_MEM, 73 BIO_TYPE_MEM,
74 "memory buffer", 74 "memory buffer",
75 mem_write, 75 mem_write,
@@ -80,28 +80,31 @@ static BIO_METHOD mem_method=
80 mem_new, 80 mem_new,
81 mem_free, 81 mem_free,
82 NULL, 82 NULL,
83 }; 83};
84 84
85/* bio->num is used to hold the value to return on 'empty', if it is 85/* bio->num is used to hold the value to return on 'empty', if it is
86 * 0, should_retry is not set */ 86 * 0, should_retry is not set */
87 87
88BIO_METHOD *BIO_s_mem(void) 88BIO_METHOD
89 { 89*BIO_s_mem(void)
90 return(&mem_method); 90{
91 } 91 return (&mem_method);
92}
92 93
93BIO *BIO_new_mem_buf(void *buf, int len) 94BIO
95*BIO_new_mem_buf(void *buf, int len)
94{ 96{
95 BIO *ret; 97 BIO *ret;
96 BUF_MEM *b; 98 BUF_MEM *b;
97 size_t sz; 99 size_t sz;
98 100
99 if (!buf) { 101 if (!buf) {
100 BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); 102 BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER);
101 return NULL; 103 return NULL;
102 } 104 }
103 sz = (len<0) ? strlen(buf) : (size_t)len; 105 sz = (len < 0) ? strlen(buf) : (size_t)len;
104 if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; 106 if (!(ret = BIO_new(BIO_s_mem())))
107 return NULL;
105 b = (BUF_MEM *)ret->ptr; 108 b = (BUF_MEM *)ret->ptr;
106 b->data = buf; 109 b->data = buf;
107 b->length = sz; 110 b->length = sz;
@@ -112,208 +115,205 @@ BIO *BIO_new_mem_buf(void *buf, int len)
112 return ret; 115 return ret;
113} 116}
114 117
115static int mem_new(BIO *bi) 118static int
116 { 119mem_new(BIO *bi)
120{
117 BUF_MEM *b; 121 BUF_MEM *b;
118 122
119 if ((b=BUF_MEM_new()) == NULL) 123 if ((b = BUF_MEM_new()) == NULL)
120 return(0); 124 return (0);
121 bi->shutdown=1; 125 bi->shutdown = 1;
122 bi->init=1; 126 bi->init = 1;
123 bi->num= -1; 127 bi->num = -1;
124 bi->ptr=(char *)b; 128 bi->ptr = (char *)b;
125 return(1); 129 return (1);
126 } 130}
127 131
128static int mem_free(BIO *a) 132static int
129 { 133mem_free(BIO *a)
130 if (a == NULL) return(0); 134{
131 if (a->shutdown) 135 if (a == NULL)
132 { 136 return (0);
133 if ((a->init) && (a->ptr != NULL)) 137 if (a->shutdown) {
134 { 138 if ((a->init) && (a->ptr != NULL)) {
135 BUF_MEM *b; 139 BUF_MEM *b;
136 b = (BUF_MEM *)a->ptr; 140 b = (BUF_MEM *)a->ptr;
137 if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL; 141 if (a->flags & BIO_FLAGS_MEM_RDONLY)
138 BUF_MEM_free(b); 142 b->data = NULL;
139 a->ptr=NULL; 143 BUF_MEM_free(b);
140 } 144 a->ptr = NULL;
141 } 145 }
142 return(1);
143 } 146 }
144 147 return (1);
145static int mem_read(BIO *b, char *out, int outl) 148}
146 { 149
147 int ret= -1; 150static int
151mem_read(BIO *b, char *out, int outl)
152{
153 int ret = -1;
148 BUF_MEM *bm; 154 BUF_MEM *bm;
149 155
150 bm=(BUF_MEM *)b->ptr; 156 bm = (BUF_MEM *)b->ptr;
151 BIO_clear_retry_flags(b); 157 BIO_clear_retry_flags(b);
152 ret=(outl >=0 && (size_t)outl > bm->length)?(int)bm->length:outl; 158 ret = (outl >=0 && (size_t)outl > bm->length) ? (int)bm->length : outl;
153 if ((out != NULL) && (ret > 0)) { 159 if ((out != NULL) && (ret > 0)) {
154 memcpy(out,bm->data,ret); 160 memcpy(out, bm->data, ret);
155 bm->length-=ret; 161 bm->length -= ret;
156 if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; 162 if (b->flags & BIO_FLAGS_MEM_RDONLY)
163 bm->data += ret;
157 else { 164 else {
158 memmove(&(bm->data[0]),&(bm->data[ret]),bm->length); 165 memmove(&(bm->data[0]), &(bm->data[ret]), bm->length);
159 } 166 }
160 } else if (bm->length == 0) 167 } else if (bm->length == 0) {
161 {
162 ret = b->num; 168 ret = b->num;
163 if (ret != 0) 169 if (ret != 0)
164 BIO_set_retry_read(b); 170 BIO_set_retry_read(b);
165 }
166 return(ret);
167 } 171 }
172 return (ret);
173}
168 174
169static int mem_write(BIO *b, const char *in, int inl) 175static int
170 { 176mem_write(BIO *b, const char *in, int inl)
171 int ret= -1; 177{
178 int ret = -1;
172 int blen; 179 int blen;
173 BUF_MEM *bm; 180 BUF_MEM *bm;
174 181
175 bm=(BUF_MEM *)b->ptr; 182 bm = (BUF_MEM *)b->ptr;
176 if (in == NULL) 183 if (in == NULL) {
177 { 184 BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER);
178 BIOerr(BIO_F_MEM_WRITE,BIO_R_NULL_PARAMETER);
179 goto end; 185 goto end;
180 } 186 }
181 187
182 if(b->flags & BIO_FLAGS_MEM_RDONLY) { 188 if (b->flags & BIO_FLAGS_MEM_RDONLY) {
183 BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO); 189 BIOerr(BIO_F_MEM_WRITE, BIO_R_WRITE_TO_READ_ONLY_BIO);
184 goto end; 190 goto end;
185 } 191 }
186 192
187 BIO_clear_retry_flags(b); 193 BIO_clear_retry_flags(b);
188 blen=bm->length; 194 blen = bm->length;
189 if (BUF_MEM_grow_clean(bm,blen+inl) != (blen+inl)) 195 if (BUF_MEM_grow_clean(bm, blen + inl) != (blen + inl))
190 goto end; 196 goto end;
191 memcpy(&(bm->data[blen]),in,inl); 197 memcpy(&(bm->data[blen]), in, inl);
192 ret=inl; 198 ret = inl;
193end: 199end:
194 return(ret); 200 return (ret);
195 } 201}
196 202
197static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) 203static long
198 { 204mem_ctrl(BIO *b, int cmd, long num, void *ptr)
199 long ret=1; 205{
206 long ret = 1;
200 char **pptr; 207 char **pptr;
201 208
202 BUF_MEM *bm=(BUF_MEM *)b->ptr; 209 BUF_MEM *bm = (BUF_MEM *)b->ptr;
203 210
204 switch (cmd) 211 switch (cmd) {
205 {
206 case BIO_CTRL_RESET: 212 case BIO_CTRL_RESET:
207 if (bm->data != NULL) 213 if (bm->data != NULL) {
208 {
209 /* For read only case reset to the start again */ 214 /* For read only case reset to the start again */
210 if(b->flags & BIO_FLAGS_MEM_RDONLY) 215 if (b->flags & BIO_FLAGS_MEM_RDONLY) {
211 {
212 bm->data -= bm->max - bm->length; 216 bm->data -= bm->max - bm->length;
213 bm->length = bm->max; 217 bm->length = bm->max;
214 } 218 } else {
215 else 219 memset(bm->data, 0, bm->max);
216 { 220 bm->length = 0;
217 memset(bm->data,0,bm->max);
218 bm->length=0;
219 }
220 } 221 }
222 }
221 break; 223 break;
222 case BIO_CTRL_EOF: 224 case BIO_CTRL_EOF:
223 ret=(long)(bm->length == 0); 225 ret = (long)(bm->length == 0);
224 break; 226 break;
225 case BIO_C_SET_BUF_MEM_EOF_RETURN: 227 case BIO_C_SET_BUF_MEM_EOF_RETURN:
226 b->num=(int)num; 228 b->num = (int)num;
227 break; 229 break;
228 case BIO_CTRL_INFO: 230 case BIO_CTRL_INFO:
229 ret=(long)bm->length; 231 ret = (long)bm->length;
230 if (ptr != NULL) 232 if (ptr != NULL) {
231 { 233 pptr = (char **)ptr;
232 pptr=(char **)ptr; 234 *pptr = (char *)&(bm->data[0]);
233 *pptr=(char *)&(bm->data[0]); 235 }
234 }
235 break; 236 break;
236 case BIO_C_SET_BUF_MEM: 237 case BIO_C_SET_BUF_MEM:
237 mem_free(b); 238 mem_free(b);
238 b->shutdown=(int)num; 239 b->shutdown = (int)num;
239 b->ptr=ptr; 240 b->ptr = ptr;
240 break; 241 break;
241 case BIO_C_GET_BUF_MEM_PTR: 242 case BIO_C_GET_BUF_MEM_PTR:
242 if (ptr != NULL) 243 if (ptr != NULL) {
243 { 244 pptr = (char **)ptr;
244 pptr=(char **)ptr; 245 *pptr = (char *)bm;
245 *pptr=(char *)bm; 246 }
246 }
247 break; 247 break;
248 case BIO_CTRL_GET_CLOSE: 248 case BIO_CTRL_GET_CLOSE:
249 ret=(long)b->shutdown; 249 ret = (long)b->shutdown;
250 break; 250 break;
251 case BIO_CTRL_SET_CLOSE: 251 case BIO_CTRL_SET_CLOSE:
252 b->shutdown=(int)num; 252 b->shutdown = (int)num;
253 break; 253 break;
254 254
255 case BIO_CTRL_WPENDING: 255 case BIO_CTRL_WPENDING:
256 ret=0L; 256 ret = 0L;
257 break; 257 break;
258 case BIO_CTRL_PENDING: 258 case BIO_CTRL_PENDING:
259 ret=(long)bm->length; 259 ret = (long)bm->length;
260 break; 260 break;
261 case BIO_CTRL_DUP: 261 case BIO_CTRL_DUP:
262 case BIO_CTRL_FLUSH: 262 case BIO_CTRL_FLUSH:
263 ret=1; 263 ret = 1;
264 break; 264 break;
265 case BIO_CTRL_PUSH: 265 case BIO_CTRL_PUSH:
266 case BIO_CTRL_POP: 266 case BIO_CTRL_POP:
267 default: 267 default:
268 ret=0; 268 ret = 0;
269 break; 269 break;
270 }
271 return(ret);
272 } 270 }
271 return (ret);
272}
273 273
274static int mem_gets(BIO *bp, char *buf, int size) 274static int
275 { 275mem_gets(BIO *bp, char *buf, int size)
276 int i,j; 276{
277 int ret= -1; 277 int i, j;
278 int ret = -1;
278 char *p; 279 char *p;
279 BUF_MEM *bm=(BUF_MEM *)bp->ptr; 280 BUF_MEM *bm = (BUF_MEM *)bp->ptr;
280 281
281 BIO_clear_retry_flags(bp); 282 BIO_clear_retry_flags(bp);
282 j=bm->length; 283 j = bm->length;
283 if ((size-1) < j) j=size-1; 284 if ((size - 1) < j)
284 if (j <= 0) 285 j = size - 1;
285 { 286 if (j <= 0) {
286 *buf='\0'; 287 *buf = '\0';
287 return 0; 288 return 0;
288 } 289 }
289 p=bm->data; 290 p = bm->data;
290 for (i=0; i<j; i++) 291 for (i = 0; i < j; i++) {
291 { 292 if (p[i] == '\n') {
292 if (p[i] == '\n')
293 {
294 i++; 293 i++;
295 break; 294 break;
296 }
297 } 295 }
296 }
298 297
299 /* 298 /*
300 * i is now the max num of bytes to copy, either j or up to 299 * i is now the max num of bytes to copy, either j or up to
301 * and including the first newline 300 * and including the first newline
302 */ 301 */
303 302
304 i=mem_read(bp,buf,i); 303 i = mem_read(bp, buf, i);
305 if (i > 0) buf[i]='\0'; 304 if (i > 0)
306 ret=i; 305 buf[i] = '\0';
307 return(ret); 306 ret = i;
308 } 307 return (ret);
308}
309 309
310static int mem_puts(BIO *bp, const char *str) 310static int
311 { 311mem_puts(BIO *bp, const char *str)
312 int n,ret; 312{
313 int n, ret;
313 314
314 n=strlen(str); 315 n = strlen(str);
315 ret=mem_write(bp,str,n); 316 ret = mem_write(bp, str, n);
316 /* memory semantics is that it will always work */ 317 /* memory semantics is that it will always work */
317 return(ret); 318 return (ret);
318 } 319}
319
diff --git a/src/lib/libcrypto/bio/bss_null.c b/src/lib/libcrypto/bio/bss_null.c
index 46b73339df..51aed2ac4b 100644
--- a/src/lib/libcrypto/bio/bss_null.c
+++ b/src/lib/libcrypto/bio/bss_null.c
@@ -68,8 +68,8 @@ static int null_gets(BIO *h, char *str, int size);
68static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); 68static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2);
69static int null_new(BIO *h); 69static int null_new(BIO *h);
70static int null_free(BIO *data); 70static int null_free(BIO *data);
71static BIO_METHOD null_method= 71
72 { 72static BIO_METHOD null_method = {
73 BIO_TYPE_NULL, 73 BIO_TYPE_NULL,
74 "NULL", 74 "NULL",
75 null_write, 75 null_write,
@@ -80,50 +80,56 @@ static BIO_METHOD null_method=
80 null_new, 80 null_new,
81 null_free, 81 null_free,
82 NULL, 82 NULL,
83 }; 83};
84 84
85BIO_METHOD *BIO_s_null(void) 85BIO_METHOD
86 { 86*BIO_s_null(void)
87 return(&null_method); 87{
88 } 88 return (&null_method);
89}
89 90
90static int null_new(BIO *bi) 91static int
91 { 92null_new(BIO *bi)
92 bi->init=1; 93{
93 bi->num=0; 94 bi->init = 1;
94 bi->ptr=(NULL); 95 bi->num = 0;
95 return(1); 96 bi->ptr = (NULL);
96 } 97 return (1);
98}
97 99
98static int null_free(BIO *a) 100static int
99 { 101null_free(BIO *a)
100 if (a == NULL) return(0); 102{
101 return(1); 103 if (a == NULL)
102 } 104 return (0);
103 105 return (1);
104static int null_read(BIO *b, char *out, int outl) 106}
105 {
106 return(0);
107 }
108 107
109static int null_write(BIO *b, const char *in, int inl) 108static int
110 { 109null_read(BIO *b, char *out, int outl)
111 return(inl); 110{
112 } 111 return (0);
112}
113
114static int
115null_write(BIO *b, const char *in, int inl)
116{
117 return (inl);
118}
113 119
114static long null_ctrl(BIO *b, int cmd, long num, void *ptr) 120static long
115 { 121null_ctrl(BIO *b, int cmd, long num, void *ptr)
116 long ret=1; 122{
123 long ret = 1;
117 124
118 switch (cmd) 125 switch (cmd) {
119 {
120 case BIO_CTRL_RESET: 126 case BIO_CTRL_RESET:
121 case BIO_CTRL_EOF: 127 case BIO_CTRL_EOF:
122 case BIO_CTRL_SET: 128 case BIO_CTRL_SET:
123 case BIO_CTRL_SET_CLOSE: 129 case BIO_CTRL_SET_CLOSE:
124 case BIO_CTRL_FLUSH: 130 case BIO_CTRL_FLUSH:
125 case BIO_CTRL_DUP: 131 case BIO_CTRL_DUP:
126 ret=1; 132 ret = 1;
127 break; 133 break;
128 case BIO_CTRL_GET_CLOSE: 134 case BIO_CTRL_GET_CLOSE:
129 case BIO_CTRL_INFO: 135 case BIO_CTRL_INFO:
@@ -131,20 +137,22 @@ static long null_ctrl(BIO *b, int cmd, long num, void *ptr)
131 case BIO_CTRL_PENDING: 137 case BIO_CTRL_PENDING:
132 case BIO_CTRL_WPENDING: 138 case BIO_CTRL_WPENDING:
133 default: 139 default:
134 ret=0; 140 ret = 0;
135 break; 141 break;
136 }
137 return(ret);
138 } 142 }
143 return (ret);
144}
139 145
140static int null_gets(BIO *bp, char *buf, int size) 146static int
141 { 147null_gets(BIO *bp, char *buf, int size)
142 return(0); 148{
143 } 149 return (0);
144 150}
145static int null_puts(BIO *bp, const char *str)
146 {
147 if (str == NULL) return(0);
148 return(strlen(str));
149 }
150 151
152static int
153null_puts(BIO *bp, const char *str)
154{
155 if (str == NULL)
156 return (0);
157 return (strlen(str));
158}
diff --git a/src/lib/libcrypto/bio/bss_rtcp.c b/src/lib/libcrypto/bio/bss_rtcp.c
index 7dae485564..84d01e58b4 100644
--- a/src/lib/libcrypto/bio/bss_rtcp.c
+++ b/src/lib/libcrypto/bio/bss_rtcp.c
@@ -73,31 +73,32 @@
73 73
74typedef unsigned short io_channel; 74typedef unsigned short io_channel;
75/*************************************************************************/ 75/*************************************************************************/
76struct io_status { short status, count; long flags; }; 76 struct io_status { short status, count;
77 long flags;
78};
77 79
78struct rpc_msg { /* Should have member alignment inhibited */ 80 struct rpc_msg { /* Should have member alignment inhibited */
79 char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ 81 char channel; /* 'A'-app data. 'R'-remote client 'G'-global */
80 char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ 82 char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */
81 unsigned short int length; /* Amount of data returned or max to return */ 83 unsigned short int length; /* Amount of data returned or max to return */
82 char data[4092]; /* variable data */ 84 char data[4092]; /* variable data */
83}; 85};
84#define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) 86#define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092)
85 87
86struct rpc_ctx { 88struct rpc_ctx {
87 int filled, pos; 89 int filled, pos;
88 struct rpc_msg msg; 90 struct rpc_msg msg;
89}; 91};
90 92
91static int rtcp_write(BIO *h,const char *buf,int num); 93static int rtcp_write(BIO *h, const char *buf, int num);
92static int rtcp_read(BIO *h,char *buf,int size); 94static int rtcp_read(BIO *h, char *buf, int size);
93static int rtcp_puts(BIO *h,const char *str); 95static int rtcp_puts(BIO *h, const char *str);
94static int rtcp_gets(BIO *h,char *str,int size); 96static int rtcp_gets(BIO *h, char *str, int size);
95static long rtcp_ctrl(BIO *h,int cmd,long arg1,void *arg2); 97static long rtcp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
96static int rtcp_new(BIO *h); 98static int rtcp_new(BIO *h);
97static int rtcp_free(BIO *data); 99static int rtcp_free(BIO *data);
98 100
99static BIO_METHOD rtcp_method= 101static BIO_METHOD rtcp_method = {
100 {
101 BIO_TYPE_FD, 102 BIO_TYPE_FD,
102 "RTCP", 103 "RTCP",
103 rtcp_write, 104 rtcp_write,
@@ -108,12 +109,13 @@ static BIO_METHOD rtcp_method=
108 rtcp_new, 109 rtcp_new,
109 rtcp_free, 110 rtcp_free,
110 NULL, 111 NULL,
111 }; 112};
112 113
113BIO_METHOD *BIO_s_rtcp(void) 114BIO_METHOD
114 { 115*BIO_s_rtcp(void)
115 return(&rtcp_method); 116{
116 } 117 return (&rtcp_method);
118}
117/*****************************************************************************/ 119/*****************************************************************************/
118/* Decnet I/O routines. 120/* Decnet I/O routines.
119 */ 121 */
@@ -123,25 +125,28 @@ BIO_METHOD *BIO_s_rtcp(void)
123#pragma message disable DOLLARID 125#pragma message disable DOLLARID
124#endif 126#endif
125 127
126static int get ( io_channel chan, char *buffer, int maxlen, int *length ) 128static int get(io_channel chan, char *buffer, int maxlen, int *length)
127{ 129{
128 int status; 130 int status;
129 struct io_status iosb; 131 struct io_status iosb;
130 status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0, 132 status = sys$qiow(0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen,
131 buffer, maxlen, 0, 0, 0, 0 ); 133 0, 0, 0, 0 );
132 if ( (status&1) == 1 ) status = iosb.status; 134 if ((status & 1) == 1)
133 if ( (status&1) == 1 ) *length = iosb.count; 135 status = iosb.status;
134 return status; 136 if ((status & 1) == 1 )
137 *length = iosb.count;
138 return status;
135} 139}
136 140
137static int put ( io_channel chan, char *buffer, int length ) 141static int put(io_channel chan, char *buffer, int length)
138{ 142{
139 int status; 143 int status;
140 struct io_status iosb; 144 struct io_status iosb;
141 status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, 145 status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer,
142 buffer, length, 0, 0, 0, 0 ); 146 length, 0, 0, 0, 0 );
143 if ( (status&1) == 1 ) status = iosb.status; 147 if ((status & 1) == 1)
144 return status; 148 status = iosb.status;
149 return status;
145} 150}
146 151
147#ifdef __DECC 152#ifdef __DECC
@@ -150,109 +155,127 @@ static int put ( io_channel chan, char *buffer, int length )
150 155
151/***************************************************************************/ 156/***************************************************************************/
152 157
153static int rtcp_new(BIO *bi) 158static int
159rtcp_new(BIO *bi)
154{ 160{
155 struct rpc_ctx *ctx; 161 struct rpc_ctx *ctx;
156 bi->init=1; 162 bi->init = 1;
157 bi->num=0; 163 bi->num = 0;
158 bi->flags = 0; 164 bi->flags = 0;
159 bi->ptr=OPENSSL_malloc(sizeof(struct rpc_ctx)); 165 bi->ptr = OPENSSL_malloc(sizeof(struct rpc_ctx));
160 ctx = (struct rpc_ctx *) bi->ptr; 166 ctx = (struct rpc_ctx *)bi->ptr;
161 ctx->filled = 0; 167 ctx->filled = 0;
162 ctx->pos = 0; 168 ctx->pos = 0;
163 return(1); 169 return (1);
164} 170}
165 171
166static int rtcp_free(BIO *a) 172static int
173rtcp_free(BIO *a)
167{ 174{
168 if (a == NULL) return(0); 175 if (a == NULL)
169 if ( a->ptr ) OPENSSL_free ( a->ptr ); 176 return (0);
177 if (a->ptr)
178 OPENSSL_free(a->ptr);
170 a->ptr = NULL; 179 a->ptr = NULL;
171 return(1); 180 return (1);
172} 181}
173 182
174static int rtcp_read(BIO *b, char *out, int outl) 183static int
184rtcp_read(BIO *b, char *out, int outl)
175{ 185{
176 int status, length; 186 int status, length;
177 struct rpc_ctx *ctx; 187 struct rpc_ctx *ctx;
178 /* 188 /*
179 * read data, return existing. 189 * read data, return existing.
180 */ 190 */
181 ctx = (struct rpc_ctx *) b->ptr; 191 ctx = (struct rpc_ctx *)b->ptr;
182 if ( ctx->pos < ctx->filled ) { 192 if (ctx->pos < ctx->filled) {
183 length = ctx->filled - ctx->pos; 193 length = ctx->filled - ctx->pos;
184 if ( length > outl ) length = outl; 194 if (length > outl)
185 memmove ( out, &ctx->msg.data[ctx->pos], length ); 195 length = outl;
186 ctx->pos += length; 196 memmove(out, &ctx->msg.data[ctx->pos], length);
187 return length; 197 ctx->pos += length;
188 } 198 return length;
189 /* 199 }
190 * Requst more data from R channel. 200 /*
191 */ 201 * Requst more data from R channel.
192 ctx->msg.channel = 'R'; 202 */
193 ctx->msg.function = 'G'; 203 ctx->msg.channel = 'R';
194 ctx->msg.length = sizeof(ctx->msg.data); 204 ctx->msg.function = 'G';
195 status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE ); 205 ctx->msg.length = sizeof(ctx->msg.data);
196 if ( (status&1) == 0 ) { 206 status = put(b->num, (char *)&ctx->msg, RPC_HDR_SIZE);
197 return -1; 207 if ((status & 1) == 0 ) {
198 } 208 return -1;
199 /* 209 }
200 * Read. 210 /*
201 */ 211 * Read.
202 ctx->pos = ctx->filled = 0; 212 */
203 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); 213 ctx->pos = ctx->filled = 0;
204 if ( (status&1) == 0 ) length = -1; 214 status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), &length);
205 if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) { 215 if ((status & 1) == 0)
206 length = -1; 216 length = -1;
207 } 217 if (ctx->msg.channel != 'R' || ctx->msg.function != 'C') {
208 ctx->filled = length - RPC_HDR_SIZE; 218 length = -1;
209 219 }
210 if ( ctx->pos < ctx->filled ) { 220 ctx->filled = length - RPC_HDR_SIZE;
211 length = ctx->filled - ctx->pos; 221
212 if ( length > outl ) length = outl; 222 if (ctx->pos < ctx->filled) {
213 memmove ( out, ctx->msg.data, length ); 223 length = ctx->filled - ctx->pos;
214 ctx->pos += length; 224 if (length > outl)
215 return length; 225 length = outl;
216 } 226 memmove(out, ctx->msg.data, length);
227 ctx->pos += length;
228 return length;
229 }
217 230
218 return length; 231 return length;
219} 232}
220 233
221static int rtcp_write(BIO *b, const char *in, int inl) 234static int
235rtcp_write(BIO *b, const char *in, int inl)
222{ 236{
223 int status, i, segment, length; 237 int status, i, segment, length;
224 struct rpc_ctx *ctx; 238 struct rpc_ctx *ctx;
225 /* 239 /*
226 * Output data, send in chunks no larger that sizeof(ctx->msg.data). 240 * Output data, send in chunks no larger that sizeof(ctx->msg.data).
227 */ 241 */
228 ctx = (struct rpc_ctx *) b->ptr; 242 ctx = (struct rpc_ctx *)b->ptr;
229 for ( i = 0; i < inl; i += segment ) { 243 for (i = 0; i < inl; i += segment) {
230 segment = inl - i; 244 segment = inl - i;
231 if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data); 245 if (segment > sizeof(ctx->msg.data))
232 ctx->msg.channel = 'R'; 246 segment = sizeof(ctx->msg.data);
233 ctx->msg.function = 'P'; 247 ctx->msg.channel = 'R';
234 ctx->msg.length = segment; 248 ctx->msg.function = 'P';
235 memmove ( ctx->msg.data, &in[i], segment ); 249 ctx->msg.length = segment;
236 status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE ); 250 memmove(ctx->msg.data, &in[i], segment);
237 if ((status&1) == 0 ) { i = -1; break; } 251 status = put(b->num, (char *) &ctx->msg,
252 segment + RPC_HDR_SIZE);
253 if ((status & 1) == 0) {
254 i = -1;
255 break;
256 }
238 257
239 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); 258 status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg),
240 if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; } 259 &length );
241 if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) { 260 if (((status&1) == 0) || (length < RPC_HDR_SIZE)) {
242 printf("unexpected response when confirming put %c %c\n", 261 i = -1;
243 ctx->msg.channel, ctx->msg.function ); 262 break;
263 }
264 if ((ctx->msg.channel != 'R') || (ctx->msg.function != 'C')) {
265 printf("unexpected response when confirming put %c %c\n",
266 ctx->msg.channel, ctx->msg.function );
244 267
268 }
245 } 269 }
246 } 270 return (i);
247 return(i);
248} 271}
249 272
250static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) 273static long
251 { 274rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
252 long ret=1; 275{
276 long ret = 1;
253 277
254 switch (cmd) 278 switch (cmd) {
255 {
256 case BIO_CTRL_RESET: 279 case BIO_CTRL_RESET:
257 case BIO_CTRL_EOF: 280 case BIO_CTRL_EOF:
258 ret = 1; 281 ret = 1;
@@ -260,11 +283,11 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
260 case BIO_C_SET_FD: 283 case BIO_C_SET_FD:
261 b->num = num; 284 b->num = num;
262 ret = 1; 285 ret = 1;
263 break; 286 break;
264 case BIO_CTRL_SET_CLOSE: 287 case BIO_CTRL_SET_CLOSE:
265 case BIO_CTRL_FLUSH: 288 case BIO_CTRL_FLUSH:
266 case BIO_CTRL_DUP: 289 case BIO_CTRL_DUP:
267 ret=1; 290 ret = 1;
268 break; 291 break;
269 case BIO_CTRL_GET_CLOSE: 292 case BIO_CTRL_GET_CLOSE:
270 case BIO_CTRL_INFO: 293 case BIO_CTRL_INFO:
@@ -272,23 +295,26 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
272 case BIO_CTRL_PENDING: 295 case BIO_CTRL_PENDING:
273 case BIO_CTRL_WPENDING: 296 case BIO_CTRL_WPENDING:
274 default: 297 default:
275 ret=0; 298 ret = 0;
276 break; 299 break;
277 }
278 return(ret);
279 }
280
281static int rtcp_gets(BIO *bp, char *buf, int size)
282 {
283 return(0);
284 } 300 }
301 return (ret);
302}
285 303
286static int rtcp_puts(BIO *bp, const char *str) 304static int
305rtcp_gets(BIO *bp, char *buf, int size)
287{ 306{
288 int length; 307 return (0);
289 if (str == NULL) return(0);
290 length = strlen ( str );
291 if ( length == 0 ) return (0);
292 return rtcp_write ( bp,str, length );
293} 308}
294 309
310static int
311rtcp_puts(BIO *bp, const char *str)
312{
313 int length;
314 if (str == NULL)
315 return (0);
316 length = strlen(str);
317 if (length == 0)
318 return (0);
319 return rtcp_write(bp, str, length);
320}
diff --git a/src/lib/libcrypto/bio/bss_sock.c b/src/lib/libcrypto/bio/bss_sock.c
index eb2965970c..f6d3bf7365 100644
--- a/src/lib/libcrypto/bio/bss_sock.c
+++ b/src/lib/libcrypto/bio/bss_sock.c
@@ -79,8 +79,7 @@ static int sock_new(BIO *h);
79static int sock_free(BIO *data); 79static int sock_free(BIO *data);
80int BIO_sock_should_retry(int s); 80int BIO_sock_should_retry(int s);
81 81
82static BIO_METHOD methods_sockp= 82static BIO_METHOD methods_sockp = {
83 {
84 BIO_TYPE_SOCKET, 83 BIO_TYPE_SOCKET,
85 "socket", 84 "socket",
86 sock_write, 85 sock_write,
@@ -91,152 +90,155 @@ static BIO_METHOD methods_sockp=
91 sock_new, 90 sock_new,
92 sock_free, 91 sock_free,
93 NULL, 92 NULL,
94 }; 93};
95 94
96BIO_METHOD *BIO_s_socket(void) 95BIO_METHOD
97 { 96*BIO_s_socket(void)
98 return(&methods_sockp); 97{
99 } 98 return (&methods_sockp);
99}
100 100
101BIO *BIO_new_socket(int fd, int close_flag) 101BIO
102 { 102*BIO_new_socket(int fd, int close_flag)
103{
103 BIO *ret; 104 BIO *ret;
104 105
105 ret=BIO_new(BIO_s_socket()); 106 ret = BIO_new(BIO_s_socket());
106 if (ret == NULL) return(NULL); 107 if (ret == NULL)
107 BIO_set_fd(ret,fd,close_flag); 108 return (NULL);
108 return(ret); 109 BIO_set_fd(ret, fd, close_flag);
109 } 110 return (ret);
111}
110 112
111static int sock_new(BIO *bi) 113static int
112 { 114sock_new(BIO *bi)
113 bi->init=0; 115{
114 bi->num=0; 116 bi->init = 0;
115 bi->ptr=NULL; 117 bi->num = 0;
116 bi->flags=0; 118 bi->ptr = NULL;
117 return(1); 119 bi->flags = 0;
118 } 120 return (1);
121}
119 122
120static int sock_free(BIO *a) 123static int
121 { 124sock_free(BIO *a)
122 if (a == NULL) return(0); 125{
123 if (a->shutdown) 126 if (a == NULL)
124 { 127 return (0);
125 if (a->init) 128 if (a->shutdown) {
126 { 129 if (a->init) {
127 shutdown(a->num, SHUT_RDWR); 130 shutdown(a->num, SHUT_RDWR);
128 close(a->num); 131 close(a->num);
129 }
130 a->init=0;
131 a->flags=0;
132 } 132 }
133 return(1); 133 a->init = 0;
134 a->flags = 0;
134 } 135 }
135 136 return (1);
136static int sock_read(BIO *b, char *out, int outl) 137}
137 {
138 int ret=0;
139 138
140 if (out != NULL) 139static int
141 { 140sock_read(BIO *b, char *out, int outl)
141{
142 int ret = 0;
143
144 if (out != NULL) {
142 errno = 0; 145 errno = 0;
143 ret=read(b->num,out,outl); 146 ret = read(b->num, out, outl);
144 BIO_clear_retry_flags(b); 147 BIO_clear_retry_flags(b);
145 if (ret <= 0) 148 if (ret <= 0) {
146 {
147 if (BIO_sock_should_retry(ret)) 149 if (BIO_sock_should_retry(ret))
148 BIO_set_retry_read(b); 150 BIO_set_retry_read(b);
149 }
150 } 151 }
151 return(ret);
152 } 152 }
153 return (ret);
154}
153 155
154static int sock_write(BIO *b, const char *in, int inl) 156static int
155 { 157sock_write(BIO *b, const char *in, int inl)
158{
156 int ret; 159 int ret;
157 160
158 errno = 0; 161 errno = 0;
159 ret=write(b->num,in,inl); 162 ret = write(b->num, in, inl);
160 BIO_clear_retry_flags(b); 163 BIO_clear_retry_flags(b);
161 if (ret <= 0) 164 if (ret <= 0) {
162 {
163 if (BIO_sock_should_retry(ret)) 165 if (BIO_sock_should_retry(ret))
164 BIO_set_retry_write(b); 166 BIO_set_retry_write(b);
165 }
166 return(ret);
167 } 167 }
168 return (ret);
169}
168 170
169static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) 171static long
170 { 172sock_ctrl(BIO *b, int cmd, long num, void *ptr)
171 long ret=1; 173{
174 long ret = 1;
172 int *ip; 175 int *ip;
173 176
174 switch (cmd) 177 switch (cmd) {
175 {
176 case BIO_C_SET_FD: 178 case BIO_C_SET_FD:
177 sock_free(b); 179 sock_free(b);
178 b->num= *((int *)ptr); 180 b->num= *((int *)ptr);
179 b->shutdown=(int)num; 181 b->shutdown = (int)num;
180 b->init=1; 182 b->init = 1;
181 break; 183 break;
182 case BIO_C_GET_FD: 184 case BIO_C_GET_FD:
183 if (b->init) 185 if (b->init) {
184 { 186 ip = (int *)ptr;
185 ip=(int *)ptr; 187 if (ip != NULL)
186 if (ip != NULL) *ip=b->num; 188 *ip = b->num;
187 ret=b->num; 189 ret = b->num;
188 } 190 } else
189 else 191 ret = -1;
190 ret= -1;
191 break; 192 break;
192 case BIO_CTRL_GET_CLOSE: 193 case BIO_CTRL_GET_CLOSE:
193 ret=b->shutdown; 194 ret = b->shutdown;
194 break; 195 break;
195 case BIO_CTRL_SET_CLOSE: 196 case BIO_CTRL_SET_CLOSE:
196 b->shutdown=(int)num; 197 b->shutdown = (int)num;
197 break; 198 break;
198 case BIO_CTRL_DUP: 199 case BIO_CTRL_DUP:
199 case BIO_CTRL_FLUSH: 200 case BIO_CTRL_FLUSH:
200 ret=1; 201 ret = 1;
201 break; 202 break;
202 default: 203 default:
203 ret=0; 204 ret = 0;
204 break; 205 break;
205 }
206 return(ret);
207 } 206 }
207 return (ret);
208}
208 209
209static int sock_puts(BIO *bp, const char *str) 210static int
210 { 211sock_puts(BIO *bp, const char *str)
211 int n,ret; 212{
213 int n, ret;
212 214
213 n=strlen(str); 215 n = strlen(str);
214 ret=sock_write(bp,str,n); 216 ret = sock_write(bp, str, n);
215 return(ret); 217 return (ret);
216 } 218}
217 219
218int BIO_sock_should_retry(int i) 220int
219 { 221BIO_sock_should_retry(int i)
222{
220 int err; 223 int err;
221 224
222 if ((i == 0) || (i == -1)) 225 if ((i == 0) || (i == -1)) {
223 { 226 err = errno;
224 err=errno;
225 227
226#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 228#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
227 if ((i == -1) && (err == 0)) 229 if ((i == -1) && (err == 0))
228 return(1); 230 return (1);
229#endif 231#endif
230 232
231 return(BIO_sock_non_fatal_error(err)); 233 return (BIO_sock_non_fatal_error(err));
232 }
233 return(0);
234 } 234 }
235 return (0);
236}
235 237
236int BIO_sock_non_fatal_error(int err) 238int
237 { 239BIO_sock_non_fatal_error(int err)
238 switch (err) 240{
239 { 241 switch (err) {
240#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) 242#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
241# if defined(WSAEWOULDBLOCK) 243# if defined(WSAEWOULDBLOCK)
242 case WSAEWOULDBLOCK: 244 case WSAEWOULDBLOCK:
@@ -284,12 +286,12 @@ int BIO_sock_non_fatal_error(int err)
284#ifdef EALREADY 286#ifdef EALREADY
285 case EALREADY: 287 case EALREADY:
286#endif 288#endif
287 return(1); 289 return (1);
288 /* break; */ 290 /* break; */
289 default: 291 default:
290 break; 292 break;
291 }
292 return(0);
293 } 293 }
294 return (0);
295}
294 296
295#endif /* #ifndef OPENSSL_NO_SOCK */ 297#endif /* #ifndef OPENSSL_NO_SOCK */
diff --git a/src/lib/libssl/src/crypto/bio/b_dump.c b/src/lib/libssl/src/crypto/bio/b_dump.c
index 492ee09275..bea94969a2 100644
--- a/src/lib/libssl/src/crypto/bio/b_dump.c
+++ b/src/lib/libssl/src/crypto/bio/b_dump.c
@@ -66,122 +66,125 @@
66 66
67#define TRUNCATE 67#define TRUNCATE
68#define DUMP_WIDTH 16 68#define DUMP_WIDTH 16
69#define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) 69#define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4))
70 70
71int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), 71int
72 void *u, const char *s, int len) 72BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
73 { 73 void *u, const char *s, int len)
74{
74 return BIO_dump_indent_cb(cb, u, s, len, 0); 75 return BIO_dump_indent_cb(cb, u, s, len, 0);
75 } 76}
76 77
77int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), 78int
78 void *u, const char *s, int len, int indent) 79BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
79 { 80 void *u, const char *s, int len, int indent)
80 int ret=0; 81{
81 char buf[288+1],tmp[20],str[128+1]; 82 int ret = 0;
82 int i,j,rows,trc; 83 char buf[288 + 1], tmp[20], str[128 + 1];
84 int i, j, rows, trc;
83 unsigned char ch; 85 unsigned char ch;
84 int dump_width; 86 int dump_width;
85 87
86 trc=0; 88 trc = 0;
87 89
88#ifdef TRUNCATE 90#ifdef TRUNCATE
89 for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) 91 for (; (len > 0) && ((s[len - 1] == ' ') || (s[len - 1] == '\0')); len--)
90 trc++; 92 trc++;
91#endif 93#endif
92 94
93 if (indent < 0) 95 if (indent < 0)
94 indent = 0; 96 indent = 0;
95 if (indent) 97 if (indent) {
96 { 98 if (indent > 128)
97 if (indent > 128) indent=128; 99 indent = 128;
98 memset(str,' ',indent); 100 memset(str, ' ', indent);
99 } 101 }
100 str[indent]='\0'; 102 str[indent] = '\0';
101 103
102 dump_width=DUMP_WIDTH_LESS_INDENT(indent); 104 dump_width = DUMP_WIDTH_LESS_INDENT(indent);
103 rows=(len/dump_width); 105 rows = (len / dump_width);
104 if ((rows*dump_width)<len) 106 if ((rows * dump_width) < len)
105 rows++; 107 rows++;
106 for(i=0;i<rows;i++) 108 for (i = 0; i < rows; i++) {
107 { 109 buf[0] = '\0'; /* start with empty string */
108 buf[0]='\0'; /* start with empty string */ 110 BUF_strlcpy(buf, str, sizeof buf);
109 BUF_strlcpy(buf,str,sizeof buf); 111 (void) snprintf(tmp, sizeof tmp, "%04x - ", i*dump_width);
110 (void) snprintf(tmp,sizeof tmp,"%04x - ",i*dump_width); 112 BUF_strlcat(buf, tmp, sizeof buf);
111 BUF_strlcat(buf,tmp,sizeof buf); 113 for (j = 0; j < dump_width; j++) {
112 for(j=0;j<dump_width;j++) 114 if (((i*dump_width) + j) >= len) {
113 { 115 BUF_strlcat(buf, " ", sizeof buf);
114 if (((i*dump_width)+j)>=len) 116 } else {
115 { 117 ch = ((unsigned char)*(s + i*dump_width + j)) & 0xff;
116 BUF_strlcat(buf," ",sizeof buf); 118 (void) snprintf(tmp, sizeof tmp, "%02x%c", ch,
117 } 119 j == 7 ? '-' : ' ');
118 else 120 BUF_strlcat(buf, tmp, sizeof buf);
119 {
120 ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
121 (void) snprintf(tmp,sizeof tmp,"%02x%c",ch,
122 j==7?'-':' ');
123 BUF_strlcat(buf,tmp,sizeof buf);
124 }
125 } 121 }
126 BUF_strlcat(buf," ",sizeof buf); 122 }
127 for(j=0;j<dump_width;j++) 123 BUF_strlcat(buf, " ", sizeof buf);
128 { 124 for (j = 0; j < dump_width; j++) {
129 if (((i*dump_width)+j)>=len) 125 if (((i*dump_width) + j) >= len)
130 break; 126 break;
131 ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; 127 ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff;
132#ifndef CHARSET_EBCDIC 128#ifndef CHARSET_EBCDIC
133 (void) snprintf(tmp,sizeof tmp,"%c", 129 (void) snprintf(tmp, sizeof tmp, "%c",
134 ((ch>=' ')&&(ch<='~'))?ch:'.'); 130 ((ch >= ' ') && (ch <= '~')) ? ch : '.');
135#else 131#else
136 (void) snprintf(tmp,sizeof tmp,"%c", 132 (void) snprintf(tmp, sizeof tmp, "%c",
137 ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) 133 ((ch >= os_toascii[' ']) && (ch <= os_toascii['~']))
138 ? os_toebcdic[ch] 134 ? os_toebcdic[ch] : '.');
139 : '.');
140#endif 135#endif
141 BUF_strlcat(buf,tmp,sizeof buf); 136 BUF_strlcat(buf, tmp, sizeof buf);
142 } 137 }
143 BUF_strlcat(buf,"\n",sizeof buf); 138 BUF_strlcat(buf, "\n", sizeof buf);
144 /* if this is the last call then update the ddt_dump thing so 139 /* if this is the last call then update the ddt_dump thing so
145 * that we will move the selection point in the debug window 140 * that we will move the selection point in the debug window
146 */ 141 */
147 ret+=cb((void *)buf,strlen(buf),u); 142 ret += cb((void *)buf, strlen(buf), u);
148 } 143 }
149#ifdef TRUNCATE 144#ifdef TRUNCATE
150 if (trc > 0) 145 if (trc > 0) {
151 { 146 (void) snprintf(buf, sizeof buf, "%s%04x - <SPACES/NULS>\n",
152 (void) snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, 147 str, len + trc);
153 len+trc); 148 ret += cb((void *)buf, strlen(buf), u);
154 ret+=cb((void *)buf,strlen(buf),u);
155 }
156#endif
157 return(ret);
158 } 149 }
150#endif
151 return (ret);
152}
159 153
160#ifndef OPENSSL_NO_FP_API 154#ifndef OPENSSL_NO_FP_API
161static int write_fp(const void *data, size_t len, void *fp) 155static int
162 { 156write_fp(const void *data, size_t len, void *fp)
157{
163 return UP_fwrite(data, len, 1, fp); 158 return UP_fwrite(data, len, 1, fp);
164 } 159}
165int BIO_dump_fp(FILE *fp, const char *s, int len) 160
166 { 161int
162BIO_dump_fp(FILE *fp, const char *s, int len)
163{
167 return BIO_dump_cb(write_fp, fp, s, len); 164 return BIO_dump_cb(write_fp, fp, s, len);
168 } 165}
169int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) 166
170 { 167int
168BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent)
169{
171 return BIO_dump_indent_cb(write_fp, fp, s, len, indent); 170 return BIO_dump_indent_cb(write_fp, fp, s, len, indent);
172 } 171}
173#endif 172#endif
174 173
175static int write_bio(const void *data, size_t len, void *bp) 174static int
176 { 175write_bio(const void *data, size_t len, void *bp)
176{
177 return BIO_write((BIO *)bp, (const char *)data, len); 177 return BIO_write((BIO *)bp, (const char *)data, len);
178 } 178}
179int BIO_dump(BIO *bp, const char *s, int len) 179
180 { 180int
181BIO_dump(BIO *bp, const char *s, int len)
182{
181 return BIO_dump_cb(write_bio, bp, s, len); 183 return BIO_dump_cb(write_bio, bp, s, len);
182 } 184}
183int BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
184 {
185 return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
186 }
187 185
186int
187BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
188{
189 return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
190}
diff --git a/src/lib/libssl/src/crypto/bio/b_print.c b/src/lib/libssl/src/crypto/bio/b_print.c
index 143a7cfefa..b3b0d45ee6 100644
--- a/src/lib/libssl/src/crypto/bio/b_print.c
+++ b/src/lib/libssl/src/crypto/bio/b_print.c
@@ -125,16 +125,15 @@
125#define LLONG long 125#define LLONG long
126#endif 126#endif
127 127
128static void fmtstr (char **, char **, size_t *, size_t *, 128static void fmtstr(char **, char **, size_t *, size_t *, const char *,
129 const char *, int, int, int); 129 int, int, int);
130static void fmtint (char **, char **, size_t *, size_t *, 130static void fmtint(char **, char **, size_t *, size_t *, LLONG, int,
131 LLONG, int, int, int, int); 131 int, int, int);
132static void fmtfp (char **, char **, size_t *, size_t *, 132static void fmtfp(char **, char **, size_t *, size_t *, LDOUBLE,
133 LDOUBLE, int, int, int); 133 int, int, int);
134static void doapr_outch (char **, char **, size_t *, size_t *, int); 134static void doapr_outch(char **, char **, size_t *, size_t *, int);
135static void _dopr(char **sbuffer, char **buffer, 135static void _dopr(char **sbuffer, char **buffer, size_t *maxlen,
136 size_t *maxlen, size_t *retlen, int *truncated, 136 size_t *retlen, int *truncated, const char *format, va_list args);
137 const char *format, va_list args);
138 137
139/* format read states */ 138/* format read states */
140#define DP_S_DEFAULT 0 139#define DP_S_DEFAULT 0
@@ -166,607 +165,576 @@ static void _dopr(char **sbuffer, char **buffer,
166#define OSSL_MAX(p,q) ((p >= q) ? p : q) 165#define OSSL_MAX(p,q) ((p >= q) ? p : q)
167 166
168static void 167static void
169_dopr( 168_dopr(char **sbuffer, char **buffer, size_t *maxlen, size_t *retlen,
170 char **sbuffer, 169 int *truncated, const char *format, va_list args)
171 char **buffer,
172 size_t *maxlen,
173 size_t *retlen,
174 int *truncated,
175 const char *format,
176 va_list args)
177{ 170{
178 char ch; 171 char ch;
179 LLONG value; 172 LLONG value;
180 LDOUBLE fvalue; 173 LDOUBLE fvalue;
181 char *strvalue; 174 char *strvalue;
182 int min; 175 int min;
183 int max; 176 int max;
184 int state; 177 int state;
185 int flags; 178 int flags;
186 int cflags; 179 int cflags;
187 size_t currlen; 180 size_t currlen;
188 181
189 state = DP_S_DEFAULT; 182 state = DP_S_DEFAULT;
190 flags = currlen = cflags = min = 0; 183 flags = currlen = cflags = min = 0;
191 max = -1; 184 max = -1;
192 ch = *format++; 185 ch = *format++;
193 186
194 while (state != DP_S_DONE) { 187 while (state != DP_S_DONE) {
195 if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) 188 if (ch == '\0' || (buffer == NULL && currlen >= *maxlen))
196 state = DP_S_DONE; 189 state = DP_S_DONE;
197 190
198 switch (state) { 191 switch (state) {
199 case DP_S_DEFAULT: 192 case DP_S_DEFAULT:
200 if (ch == '%') 193 if (ch == '%')
201 state = DP_S_FLAGS; 194 state = DP_S_FLAGS;
202 else 195 else
203 doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); 196 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
204 ch = *format++; 197 ch = *format++;
205 break; 198 break;
206 case DP_S_FLAGS: 199 case DP_S_FLAGS:
207 switch (ch) { 200 switch (ch) {
208 case '-': 201 case '-':
209 flags |= DP_F_MINUS; 202 flags |= DP_F_MINUS;
210 ch = *format++; 203 ch = *format++;
211 break; 204 break;
212 case '+': 205 case '+':
213 flags |= DP_F_PLUS; 206 flags |= DP_F_PLUS;
214 ch = *format++; 207 ch = *format++;
215 break; 208 break;
216 case ' ': 209 case ' ':
217 flags |= DP_F_SPACE; 210 flags |= DP_F_SPACE;
218 ch = *format++; 211 ch = *format++;
219 break; 212 break;
220 case '#': 213 case '#':
221 flags |= DP_F_NUM; 214 flags |= DP_F_NUM;
222 ch = *format++; 215 ch = *format++;
223 break; 216 break;
224 case '0': 217 case '0':
225 flags |= DP_F_ZERO; 218 flags |= DP_F_ZERO;
226 ch = *format++; 219 ch = *format++;
227 break; 220 break;
228 default: 221 default:
229 state = DP_S_MIN; 222 state = DP_S_MIN;
230 break; 223 break;
231 } 224 }
232 break; 225 break;
233 case DP_S_MIN: 226 case DP_S_MIN:
234 if (isdigit((unsigned char)ch)) { 227 if (isdigit((unsigned char)ch)) {
235 min = 10 * min + char_to_int(ch); 228 min = 10 * min + char_to_int(ch);
236 ch = *format++; 229 ch = *format++;
237 } else if (ch == '*') { 230 } else if (ch == '*') {
238 min = va_arg(args, int); 231 min = va_arg(args, int);
239 ch = *format++; 232 ch = *format++;
240 state = DP_S_DOT; 233 state = DP_S_DOT;
241 } else 234 } else
242 state = DP_S_DOT; 235 state = DP_S_DOT;
243 break; 236 break;
244 case DP_S_DOT: 237 case DP_S_DOT:
245 if (ch == '.') { 238 if (ch == '.') {
246 state = DP_S_MAX; 239 state = DP_S_MAX;
247 ch = *format++; 240 ch = *format++;
248 } else 241 } else
249 state = DP_S_MOD; 242 state = DP_S_MOD;
250 break; 243 break;
251 case DP_S_MAX: 244 case DP_S_MAX:
252 if (isdigit((unsigned char)ch)) { 245 if (isdigit((unsigned char)ch)) {
253 if (max < 0) 246 if (max < 0)
254 max = 0; 247 max = 0;
255 max = 10 * max + char_to_int(ch); 248 max = 10 * max + char_to_int(ch);
256 ch = *format++; 249 ch = *format++;
257 } else if (ch == '*') { 250 } else if (ch == '*') {
258 max = va_arg(args, int); 251 max = va_arg(args, int);
259 ch = *format++; 252 ch = *format++;
260 state = DP_S_MOD; 253 state = DP_S_MOD;
261 } else 254 } else
262 state = DP_S_MOD; 255 state = DP_S_MOD;
263 break; 256 break;
264 case DP_S_MOD: 257 case DP_S_MOD:
265 switch (ch) { 258 switch (ch) {
266 case 'h': 259 case 'h':
267 cflags = DP_C_SHORT; 260 cflags = DP_C_SHORT;
268 ch = *format++; 261 ch = *format++;
269 break; 262 break;
270 case 'l': 263 case 'l':
271 if (*format == 'l') { 264 if (*format == 'l') {
272 cflags = DP_C_LLONG; 265 cflags = DP_C_LLONG;
273 format++; 266 format++;
274 } else 267 } else
275 cflags = DP_C_LONG; 268 cflags = DP_C_LONG;
276 ch = *format++; 269 ch = *format++;
277 break; 270 break;
278 case 'q': 271 case 'q':
279 cflags = DP_C_LLONG; 272 cflags = DP_C_LLONG;
280 ch = *format++; 273 ch = *format++;
281 break; 274 break;
282 case 'L': 275 case 'L':
283 cflags = DP_C_LDOUBLE; 276 cflags = DP_C_LDOUBLE;
284 ch = *format++; 277 ch = *format++;
285 break; 278 break;
286 default: 279 default:
287 break; 280 break;
288 } 281 }
289 state = DP_S_CONV; 282 state = DP_S_CONV;
290 break; 283 break;
291 case DP_S_CONV: 284 case DP_S_CONV:
292 switch (ch) { 285 switch (ch) {
293 case 'd': 286 case 'd':
294 case 'i': 287 case 'i':
295 switch (cflags) { 288 switch (cflags) {
296 case DP_C_SHORT: 289 case DP_C_SHORT:
297 value = (short int)va_arg(args, int); 290 value = (short int)va_arg(args, int);
298 break; 291 break;
299 case DP_C_LONG: 292 case DP_C_LONG:
300 value = va_arg(args, long int); 293 value = va_arg(args, long int);
301 break; 294 break;
302 case DP_C_LLONG: 295 case DP_C_LLONG:
303 value = va_arg(args, LLONG); 296 value = va_arg(args, LLONG);
304 break; 297 break;
305 default: 298 default:
306 value = va_arg(args, int); 299 value = va_arg(args, int);
307 break; 300 break;
308 } 301 }
309 fmtint(sbuffer, buffer, &currlen, maxlen, 302 fmtint(sbuffer, buffer, &currlen, maxlen,
310 value, 10, min, max, flags); 303 value, 10, min, max, flags);
311 break; 304 break;
312 case 'X': 305 case 'X':
313 flags |= DP_F_UP; 306 flags |= DP_F_UP;
314 /* FALLTHROUGH */ 307 /* FALLTHROUGH */
315 case 'x': 308 case 'x':
316 case 'o': 309 case 'o':
317 case 'u': 310 case 'u':
318 flags |= DP_F_UNSIGNED; 311 flags |= DP_F_UNSIGNED;
319 switch (cflags) { 312 switch (cflags) {
320 case DP_C_SHORT: 313 case DP_C_SHORT:
321 value = (unsigned short int)va_arg(args, unsigned int); 314 value = (unsigned short int)va_arg(
322 break; 315 args, unsigned int);
323 case DP_C_LONG: 316 break;
324 value = (LLONG) va_arg(args, 317 case DP_C_LONG:
325 unsigned long int); 318 value = (LLONG)va_arg(args,
326 break; 319 unsigned long int);
327 case DP_C_LLONG: 320 break;
328 value = va_arg(args, unsigned LLONG); 321 case DP_C_LLONG:
329 break; 322 value = va_arg(args, unsigned LLONG);
330 default: 323 break;
331 value = (LLONG) va_arg(args, 324 default:
332 unsigned int); 325 value = (LLONG)va_arg(args,
333 break; 326 unsigned int);
334 } 327 break;
335 fmtint(sbuffer, buffer, &currlen, maxlen, value, 328 }
336 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), 329 fmtint(sbuffer, buffer, &currlen, maxlen, value,
337 min, max, flags); 330 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
338 break; 331 min, max, flags);
339 case 'f': 332 break;
340 if (cflags == DP_C_LDOUBLE) 333 case 'f':
341 fvalue = va_arg(args, LDOUBLE); 334 if (cflags == DP_C_LDOUBLE)
342 else 335 fvalue = va_arg(args, LDOUBLE);
343 fvalue = va_arg(args, double); 336 else
344 fmtfp(sbuffer, buffer, &currlen, maxlen, 337 fvalue = va_arg(args, double);
345 fvalue, min, max, flags); 338 fmtfp(sbuffer, buffer, &currlen, maxlen,
346 break; 339 fvalue, min, max, flags);
347 case 'E': 340 break;
348 flags |= DP_F_UP; 341 case 'E':
349 case 'e': 342 flags |= DP_F_UP;
350 if (cflags == DP_C_LDOUBLE) 343 case 'e':
351 fvalue = va_arg(args, LDOUBLE); 344 if (cflags == DP_C_LDOUBLE)
352 else 345 fvalue = va_arg(args, LDOUBLE);
353 fvalue = va_arg(args, double); 346 else
354 break; 347 fvalue = va_arg(args, double);
355 case 'G': 348 break;
356 flags |= DP_F_UP; 349 case 'G':
357 case 'g': 350 flags |= DP_F_UP;
358 if (cflags == DP_C_LDOUBLE) 351 case 'g':
359 fvalue = va_arg(args, LDOUBLE); 352 if (cflags == DP_C_LDOUBLE)
360 else 353 fvalue = va_arg(args, LDOUBLE);
361 fvalue = va_arg(args, double); 354 else
362 break; 355 fvalue = va_arg(args, double);
363 case 'c': 356 break;
364 doapr_outch(sbuffer, buffer, &currlen, maxlen, 357 case 'c':
365 va_arg(args, int)); 358 doapr_outch(sbuffer, buffer, &currlen, maxlen,
366 break; 359 va_arg(args, int));
367 case 's': 360 break;
368 strvalue = va_arg(args, char *); 361 case 's':
369 if (max < 0) { 362 strvalue = va_arg(args, char *);
370 if (buffer) 363 if (max < 0) {
371 max = INT_MAX; 364 if (buffer)
372 else 365 max = INT_MAX;
373 max = *maxlen; 366 else
367 max = *maxlen;
368 }
369 fmtstr(sbuffer, buffer, &currlen, maxlen,
370 strvalue, flags, min, max);
371 break;
372 case 'p':
373 value = (long)va_arg(args, void *);
374 fmtint(sbuffer, buffer, &currlen, maxlen,
375 value, 16, min, max, flags|DP_F_NUM);
376 break;
377 case 'n': /* XXX */
378 if (cflags == DP_C_SHORT) {
379 short int *num;
380 num = va_arg(args, short int *);
381 *num = currlen;
382 } else if (cflags == DP_C_LONG) { /* XXX */
383 long int *num;
384 num = va_arg(args, long int *);
385 *num = (long int) currlen;
386 } else if (cflags == DP_C_LLONG) { /* XXX */
387 LLONG *num;
388 num = va_arg(args, LLONG *);
389 *num = (LLONG) currlen;
390 } else {
391 int *num;
392 num = va_arg(args, int *);
393 *num = currlen;
394 }
395 break;
396 case '%':
397 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
398 break;
399 case 'w':
400 /* not supported yet, treat as next char */
401 ch = *format++;
402 break;
403 default:
404 /* unknown, skip */
405 break;
406 }
407 ch = *format++;
408 state = DP_S_DEFAULT;
409 flags = cflags = min = 0;
410 max = -1;
411 break;
412 case DP_S_DONE:
413 break;
414 default:
415 break;
374 } 416 }
375 fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, 417 }
376 flags, min, max); 418 *truncated = (currlen > *maxlen - 1);
377 break; 419 if (*truncated)
378 case 'p': 420 currlen = *maxlen - 1;
379 value = (long)va_arg(args, void *); 421 doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
380 fmtint(sbuffer, buffer, &currlen, maxlen, 422 *retlen = currlen - 1;
381 value, 16, min, max, flags|DP_F_NUM); 423 return;
382 break;
383 case 'n': /* XXX */
384 if (cflags == DP_C_SHORT) {
385 short int *num;
386 num = va_arg(args, short int *);
387 *num = currlen;
388 } else if (cflags == DP_C_LONG) { /* XXX */
389 long int *num;
390 num = va_arg(args, long int *);
391 *num = (long int) currlen;
392 } else if (cflags == DP_C_LLONG) { /* XXX */
393 LLONG *num;
394 num = va_arg(args, LLONG *);
395 *num = (LLONG) currlen;
396 } else {
397 int *num;
398 num = va_arg(args, int *);
399 *num = currlen;
400 }
401 break;
402 case '%':
403 doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
404 break;
405 case 'w':
406 /* not supported yet, treat as next char */
407 ch = *format++;
408 break;
409 default:
410 /* unknown, skip */
411 break;
412 }
413 ch = *format++;
414 state = DP_S_DEFAULT;
415 flags = cflags = min = 0;
416 max = -1;
417 break;
418 case DP_S_DONE:
419 break;
420 default:
421 break;
422 }
423 }
424 *truncated = (currlen > *maxlen - 1);
425 if (*truncated)
426 currlen = *maxlen - 1;
427 doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
428 *retlen = currlen - 1;
429 return;
430} 424}
431 425
432static void 426static void
433fmtstr( 427fmtstr(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
434 char **sbuffer, 428 const char *value, int flags, int min, int max)
435 char **buffer,
436 size_t *currlen,
437 size_t *maxlen,
438 const char *value,
439 int flags,
440 int min,
441 int max)
442{ 429{
443 int padlen, strln; 430 int padlen, strln;
444 int cnt = 0; 431 int cnt = 0;
445 432
446 if (value == 0) 433 if (value == 0)
447 value = "<NULL>"; 434 value = "<NULL>";
448 for (strln = 0; value[strln]; ++strln) 435 for (strln = 0; value[strln]; ++strln)
449 ; 436 ;
450 padlen = min - strln; 437 padlen = min - strln;
451 if (padlen < 0) 438 if (padlen < 0)
452 padlen = 0; 439 padlen = 0;
453 if (flags & DP_F_MINUS) 440 if (flags & DP_F_MINUS)
454 padlen = -padlen; 441 padlen = -padlen;
455 442
456 while ((padlen > 0) && (cnt < max)) { 443 while ((padlen > 0) && (cnt < max)) {
457 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 444 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
458 --padlen; 445 --padlen;
459 ++cnt; 446 ++cnt;
460 } 447 }
461 while (*value && (cnt < max)) { 448 while (*value && (cnt < max)) {
462 doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); 449 doapr_outch(sbuffer, buffer, currlen, maxlen, *value++);
463 ++cnt; 450 ++cnt;
464 } 451 }
465 while ((padlen < 0) && (cnt < max)) { 452 while ((padlen < 0) && (cnt < max)) {
466 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 453 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
467 ++padlen; 454 ++padlen;
468 ++cnt; 455 ++cnt;
469 } 456 }
470} 457}
471 458
472static void 459static void
473fmtint( 460fmtint(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
474 char **sbuffer, 461 LLONG value, int base, int min, int max, int flags)
475 char **buffer,
476 size_t *currlen,
477 size_t *maxlen,
478 LLONG value,
479 int base,
480 int min,
481 int max,
482 int flags)
483{ 462{
484 int signvalue = 0; 463 int signvalue = 0;
485 const char *prefix = ""; 464 const char *prefix = "";
486 unsigned LLONG uvalue; 465 unsigned LLONG uvalue;
487 char convert[DECIMAL_SIZE(value)+3]; 466 char convert[DECIMAL_SIZE(value) + 3];
488 int place = 0; 467 int place = 0;
489 int spadlen = 0; 468 int spadlen = 0;
490 int zpadlen = 0; 469 int zpadlen = 0;
491 int caps = 0; 470 int caps = 0;
492 471
493 if (max < 0) 472 if (max < 0)
494 max = 0; 473 max = 0;
495 uvalue = value; 474 uvalue = value;
496 if (!(flags & DP_F_UNSIGNED)) { 475 if (!(flags & DP_F_UNSIGNED)) {
497 if (value < 0) { 476 if (value < 0) {
498 signvalue = '-'; 477 signvalue = '-';
499 uvalue = -value; 478 uvalue = -value;
500 } else if (flags & DP_F_PLUS) 479 } else if (flags & DP_F_PLUS)
501 signvalue = '+'; 480 signvalue = '+';
502 else if (flags & DP_F_SPACE) 481 else if (flags & DP_F_SPACE)
503 signvalue = ' '; 482 signvalue = ' ';
504 } 483 }
505 if (flags & DP_F_NUM) { 484 if (flags & DP_F_NUM) {
506 if (base == 8) prefix = "0"; 485 if (base == 8)
507 if (base == 16) prefix = "0x"; 486 prefix = "0";
508 } 487 if (base == 16)
509 if (flags & DP_F_UP) 488 prefix = "0x";
510 caps = 1; 489 }
511 do { 490 if (flags & DP_F_UP)
512 convert[place++] = 491 caps = 1;
513 (caps ? "0123456789ABCDEF" : "0123456789abcdef") 492 do {
514 [uvalue % (unsigned) base]; 493 convert[place++] = (caps ? "0123456789ABCDEF" :
515 uvalue = (uvalue / (unsigned) base); 494 "0123456789abcdef")[uvalue % (unsigned) base];
516 } while (uvalue && (place < (int)sizeof(convert))); 495 uvalue = (uvalue / (unsigned) base);
517 if (place == sizeof(convert)) 496 } while (uvalue && (place < (int)sizeof(convert)));
518 place--; 497 if (place == sizeof(convert))
519 convert[place] = 0; 498 place--;
520 499 convert[place] = 0;
521 zpadlen = max - place; 500
522 spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix); 501 zpadlen = max - place;
523 if (zpadlen < 0) 502 spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) -
524 zpadlen = 0; 503 strlen(prefix);
525 if (spadlen < 0) 504 if (zpadlen < 0)
526 spadlen = 0; 505 zpadlen = 0;
527 if (flags & DP_F_ZERO) { 506 if (spadlen < 0)
528 zpadlen = OSSL_MAX(zpadlen, spadlen); 507 spadlen = 0;
529 spadlen = 0; 508 if (flags & DP_F_ZERO) {
530 } 509 zpadlen = OSSL_MAX(zpadlen, spadlen);
531 if (flags & DP_F_MINUS) 510 spadlen = 0;
532 spadlen = -spadlen; 511 }
533 512 if (flags & DP_F_MINUS)
534 /* spaces */ 513 spadlen = -spadlen;
535 while (spadlen > 0) { 514
536 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 515 /* spaces */
537 --spadlen; 516 while (spadlen > 0) {
538 } 517 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
539 518 --spadlen;
540 /* sign */ 519 }
541 if (signvalue) 520
542 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 521 /* sign */
543 522 if (signvalue)
544 /* prefix */ 523 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
545 while (*prefix) { 524
546 doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); 525 /* prefix */
547 prefix++; 526 while (*prefix) {
548 } 527 doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);
549 528 prefix++;
550 /* zeros */ 529 }
551 if (zpadlen > 0) { 530
552 while (zpadlen > 0) { 531 /* zeros */
553 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 532 if (zpadlen > 0) {
554 --zpadlen; 533 while (zpadlen > 0) {
555 } 534 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
556 } 535 --zpadlen;
557 /* digits */ 536 }
558 while (place > 0) 537 }
559 doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); 538 /* digits */
560 539 while (place > 0)
561 /* left justified spaces */ 540 doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]);
562 while (spadlen < 0) { 541
563 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 542 /* left justified spaces */
564 ++spadlen; 543 while (spadlen < 0) {
565 } 544 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
566 return; 545 ++spadlen;
546 }
547 return;
567} 548}
568 549
569static LDOUBLE 550static LDOUBLE
570abs_val(LDOUBLE value) 551abs_val(LDOUBLE value)
571{ 552{
572 LDOUBLE result = value; 553 LDOUBLE result = value;
573 if (value < 0) 554 if (value < 0)
574 result = -value; 555 result = -value;
575 return result; 556 return result;
576} 557}
577 558
578static LDOUBLE 559static LDOUBLE
579pow_10(int in_exp) 560pow_10(int in_exp)
580{ 561{
581 LDOUBLE result = 1; 562 LDOUBLE result = 1;
582 while (in_exp) { 563 while (in_exp) {
583 result *= 10; 564 result *= 10;
584 in_exp--; 565 in_exp--;
585 } 566 }
586 return result; 567 return result;
587} 568}
588 569
589static long 570static long
590roundv(LDOUBLE value) 571roundv(LDOUBLE value)
591{ 572{
592 long intpart; 573 long intpart;
593 intpart = (long) value; 574 intpart = (long) value;
594 value = value - intpart; 575 value = value - intpart;
595 if (value >= 0.5) 576 if (value >= 0.5)
596 intpart++; 577 intpart++;
597 return intpart; 578 return intpart;
598} 579}
599 580
600static void 581static void
601fmtfp( 582fmtfp(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
602 char **sbuffer, 583 LDOUBLE fvalue, int min, int max, int flags)
603 char **buffer,
604 size_t *currlen,
605 size_t *maxlen,
606 LDOUBLE fvalue,
607 int min,
608 int max,
609 int flags)
610{ 584{
611 int signvalue = 0; 585 int signvalue = 0;
612 LDOUBLE ufvalue; 586 LDOUBLE ufvalue;
613 char iconvert[20]; 587 char iconvert[20];
614 char fconvert[20]; 588 char fconvert[20];
615 int iplace = 0; 589 int iplace = 0;
616 int fplace = 0; 590 int fplace = 0;
617 int padlen = 0; 591 int padlen = 0;
618 int zpadlen = 0; 592 int zpadlen = 0;
619 int caps = 0; 593 int caps = 0;
620 long intpart; 594 long intpart;
621 long fracpart; 595 long fracpart;
622 long max10; 596 long max10;
623 597
624 if (max < 0) 598 if (max < 0)
625 max = 6; 599 max = 6;
626 ufvalue = abs_val(fvalue); 600 ufvalue = abs_val(fvalue);
627 if (fvalue < 0) 601 if (fvalue < 0)
628 signvalue = '-'; 602 signvalue = '-';
629 else if (flags & DP_F_PLUS) 603 else if (flags & DP_F_PLUS)
630 signvalue = '+'; 604 signvalue = '+';
631 else if (flags & DP_F_SPACE) 605 else if (flags & DP_F_SPACE)
632 signvalue = ' '; 606 signvalue = ' ';
633 607
634 intpart = (long)ufvalue; 608 intpart = (long)ufvalue;
635 609
636 /* sorry, we only support 9 digits past the decimal because of our 610 /* sorry, we only support 9 digits past the decimal because of our
637 conversion method */ 611 conversion method */
638 if (max > 9) 612 if (max > 9)
639 max = 9; 613 max = 9;
640 614
641 /* we "cheat" by converting the fractional part to integer by 615 /* we "cheat" by converting the fractional part to integer by
642 multiplying by a factor of 10 */ 616 multiplying by a factor of 10 */
643 max10 = roundv(pow_10(max)); 617 max10 = roundv(pow_10(max));
644 fracpart = roundv(pow_10(max) * (ufvalue - intpart)); 618 fracpart = roundv(pow_10(max) * (ufvalue - intpart));
645 619
646 if (fracpart >= max10) { 620 if (fracpart >= max10) {
647 intpart++; 621 intpart++;
648 fracpart -= max10; 622 fracpart -= max10;
649 } 623 }
650 624
651 /* convert integer part */ 625 /* convert integer part */
652 do { 626 do {
653 iconvert[iplace++] = 627 iconvert[iplace++] = (caps ? "0123456789ABCDEF" :
654 (caps ? "0123456789ABCDEF" 628 "0123456789abcdef")[intpart % 10];
655 : "0123456789abcdef")[intpart % 10]; 629 intpart = (intpart / 10);
656 intpart = (intpart / 10); 630 } while (intpart && (iplace < (int)sizeof(iconvert)));
657 } while (intpart && (iplace < (int)sizeof(iconvert))); 631 if (iplace == sizeof iconvert)
658 if (iplace == sizeof iconvert) 632 iplace--;
659 iplace--; 633 iconvert[iplace] = 0;
660 iconvert[iplace] = 0; 634
661 635 /* convert fractional part */
662 /* convert fractional part */ 636 do {
663 do { 637 fconvert[fplace++] = (caps ? "0123456789ABCDEF" :
664 fconvert[fplace++] = 638 "0123456789abcdef")[fracpart % 10];
665 (caps ? "0123456789ABCDEF" 639 fracpart = (fracpart / 10);
666 : "0123456789abcdef")[fracpart % 10]; 640 } while (fplace < max);
667 fracpart = (fracpart / 10); 641 if (fplace == sizeof fconvert)
668 } while (fplace < max); 642 fplace--;
669 if (fplace == sizeof fconvert) 643 fconvert[fplace] = 0;
670 fplace--; 644
671 fconvert[fplace] = 0; 645 /* -1 for decimal point, another -1 if we are printing a sign */
672 646 padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
673 /* -1 for decimal point, another -1 if we are printing a sign */ 647 zpadlen = max - fplace;
674 padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 648 if (zpadlen < 0)
675 zpadlen = max - fplace; 649 zpadlen = 0;
676 if (zpadlen < 0) 650 if (padlen < 0)
677 zpadlen = 0; 651 padlen = 0;
678 if (padlen < 0) 652 if (flags & DP_F_MINUS)
679 padlen = 0; 653 padlen = -padlen;
680 if (flags & DP_F_MINUS) 654
681 padlen = -padlen; 655 if ((flags & DP_F_ZERO) && (padlen > 0)) {
682 656 if (signvalue) {
683 if ((flags & DP_F_ZERO) && (padlen > 0)) { 657 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
684 if (signvalue) { 658 --padlen;
685 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 659 signvalue = 0;
686 --padlen; 660 }
687 signvalue = 0; 661 while (padlen > 0) {
688 } 662 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
689 while (padlen > 0) { 663 --padlen;
690 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 664 }
691 --padlen; 665 }
692 } 666 while (padlen > 0) {
693 } 667 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
694 while (padlen > 0) { 668 --padlen;
695 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 669 }
696 --padlen; 670 if (signvalue)
697 } 671 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
698 if (signvalue) 672
699 doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); 673 while (iplace > 0)
700 674 doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]);
701 while (iplace > 0) 675
702 doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); 676 /*
703 677 * Decimal point. This should probably use locale to find the correct
704 /* 678 * char to print out.
705 * Decimal point. This should probably use locale to find the correct 679 */
706 * char to print out. 680 if (max > 0 || (flags & DP_F_NUM)) {
707 */ 681 doapr_outch(sbuffer, buffer, currlen, maxlen, '.');
708 if (max > 0 || (flags & DP_F_NUM)) { 682
709 doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); 683 while (fplace > 0)
710 684 doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]);
711 while (fplace > 0) 685 }
712 doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); 686 while (zpadlen > 0) {
713 } 687 doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
714 while (zpadlen > 0) { 688 --zpadlen;
715 doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); 689 }
716 --zpadlen; 690
717 } 691 while (padlen < 0) {
718 692 doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
719 while (padlen < 0) { 693 ++padlen;
720 doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); 694 }
721 ++padlen;
722 }
723} 695}
724 696
725static void 697static void
726doapr_outch( 698doapr_outch(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen,
727 char **sbuffer,
728 char **buffer,
729 size_t *currlen,
730 size_t *maxlen,
731 int c) 699 int c)
732{ 700{
733 /* If we haven't at least one buffer, someone has doe a big booboo */ 701 /* If we haven't at least one buffer, someone has doe a big booboo */
734 assert(*sbuffer != NULL || buffer != NULL); 702 assert(*sbuffer != NULL || buffer != NULL);
735 703
736 if (buffer) { 704 if (buffer) {
737 while (*currlen >= *maxlen) { 705 while (*currlen >= *maxlen) {
738 if (*buffer == NULL) { 706 if (*buffer == NULL) {
739 if (*maxlen == 0) 707 if (*maxlen == 0)
740 *maxlen = 1024; 708 *maxlen = 1024;
741 *buffer = OPENSSL_malloc(*maxlen); 709 *buffer = OPENSSL_malloc(*maxlen);
742 if (*currlen > 0) { 710 if (*currlen > 0) {
743 assert(*sbuffer != NULL); 711 assert(*sbuffer != NULL);
744 memcpy(*buffer, *sbuffer, *currlen); 712 memcpy(*buffer, *sbuffer, *currlen);
713 }
714 *sbuffer = NULL;
715 } else {
716 *maxlen += 1024;
717 *buffer = OPENSSL_realloc(*buffer, *maxlen);
718 }
745 } 719 }
746 *sbuffer = NULL; 720 /* What to do if *buffer is NULL? */
747 } else { 721 assert(*sbuffer != NULL || *buffer != NULL);
748 *maxlen += 1024;
749 *buffer = OPENSSL_realloc(*buffer, *maxlen);
750 }
751 } 722 }
752 /* What to do if *buffer is NULL? */
753 assert(*sbuffer != NULL || *buffer != NULL);
754 }
755 723
756 if (*currlen < *maxlen) { 724 if (*currlen < *maxlen) {
757 if (*sbuffer) 725 if (*sbuffer)
758 (*sbuffer)[(*currlen)++] = (char)c; 726 (*sbuffer)[(*currlen)++] = (char)c;
759 else 727 else
760 (*buffer)[(*currlen)++] = (char)c; 728 (*buffer)[(*currlen)++] = (char)c;
761 } 729 }
762 730
763 return; 731 return;
764} 732}
765 733
766/***************************************************************************/ 734/***************************************************************************/
767 735
768int BIO_printf (BIO *bio, const char *format, ...) 736int BIO_printf (BIO *bio, const char *format, ...)
769 { 737{
770 va_list args; 738 va_list args;
771 int ret; 739 int ret;
772 740
@@ -775,15 +743,15 @@ int BIO_printf (BIO *bio, const char *format, ...)
775 ret = BIO_vprintf(bio, format, args); 743 ret = BIO_vprintf(bio, format, args);
776 744
777 va_end(args); 745 va_end(args);
778 return(ret); 746 return (ret);
779 } 747}
780 748
781int BIO_vprintf (BIO *bio, const char *format, va_list args) 749int BIO_vprintf (BIO *bio, const char *format, va_list args)
782 { 750{
783 int ret; 751 int ret;
784 size_t retlen; 752 size_t retlen;
785 char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable 753 char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable
786 in small-stack environments, like threads 754 in small - stack environments, like threads
787 or DOS programs. */ 755 or DOS programs. */
788 char *hugebufp = hugebuf; 756 char *hugebufp = hugebuf;
789 size_t hugebufsize = sizeof(hugebuf); 757 size_t hugebufsize = sizeof(hugebuf);
@@ -792,27 +760,25 @@ int BIO_vprintf (BIO *bio, const char *format, va_list args)
792 760
793 dynbuf = NULL; 761 dynbuf = NULL;
794 CRYPTO_push_info("doapr()"); 762 CRYPTO_push_info("doapr()");
795 _dopr(&hugebufp, &dynbuf, &hugebufsize, 763 _dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored,
796 &retlen, &ignored, format, args); 764 format, args);
797 if (dynbuf) 765 if (dynbuf) {
798 { 766 ret = BIO_write(bio, dynbuf, (int)retlen);
799 ret=BIO_write(bio, dynbuf, (int)retlen);
800 OPENSSL_free(dynbuf); 767 OPENSSL_free(dynbuf);
801 } 768 } else {
802 else 769 ret = BIO_write(bio, hugebuf, (int)retlen);
803 {
804 ret=BIO_write(bio, hugebuf, (int)retlen);
805 }
806 CRYPTO_pop_info();
807 return(ret);
808 } 770 }
771 CRYPTO_pop_info();
772 return (ret);
773}
809 774
810/* As snprintf is not available everywhere, we provide our own implementation. 775/* As snprintf is not available everywhere, we provide our own implementation.
811 * This function has nothing to do with BIOs, but it's closely related 776 * This function has nothing to do with BIOs, but it's closely related
812 * to BIO_printf, and we need *some* name prefix ... 777 * to BIO_printf, and we need *some* name prefix ...
813 * (XXX the function should be renamed, but to what?) */ 778 * (XXX the function should be renamed, but to what?) */
814int BIO_snprintf(char *buf, size_t n, const char *format, ...) 779int
815 { 780BIO_snprintf(char *buf, size_t n, const char *format, ...)
781{
816 va_list args; 782 va_list args;
817 int ret; 783 int ret;
818 784
@@ -821,11 +787,12 @@ int BIO_snprintf(char *buf, size_t n, const char *format, ...)
821 ret = BIO_vsnprintf(buf, n, format, args); 787 ret = BIO_vsnprintf(buf, n, format, args);
822 788
823 va_end(args); 789 va_end(args);
824 return(ret); 790 return (ret);
825 } 791}
826 792
827int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) 793int
828 { 794BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
795{
829 size_t retlen; 796 size_t retlen;
830 int truncated; 797 int truncated;
831 798
@@ -839,4 +806,4 @@ int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
839 return -1; 806 return -1;
840 else 807 else
841 return (retlen <= INT_MAX) ? (int)retlen : -1; 808 return (retlen <= INT_MAX) ? (int)retlen : -1;
842 } 809}
diff --git a/src/lib/libssl/src/crypto/bio/b_sock.c b/src/lib/libssl/src/crypto/bio/b_sock.c
index bd43307456..d739452580 100644
--- a/src/lib/libssl/src/crypto/bio/b_sock.c
+++ b/src/lib/libssl/src/crypto/bio/b_sock.c
@@ -85,7 +85,7 @@ NETDB_DEFINE_CONTEXT
85#endif 85#endif
86 86
87#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) 87#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
88static int wsa_init_done=0; 88static int wsa_init_done = 0;
89#endif 89#endif
90 90
91/* 91/*
@@ -100,36 +100,36 @@ static int wsa_init_done=0;
100#endif 100#endif
101 101
102#if 0 102#if 0
103static unsigned long BIO_ghbn_hits=0L; 103static unsigned long BIO_ghbn_hits = 0L;
104static unsigned long BIO_ghbn_miss=0L; 104static unsigned long BIO_ghbn_miss = 0L;
105 105
106#define GHBN_NUM 4 106#define GHBN_NUM 4
107static struct ghbn_cache_st 107static struct ghbn_cache_st {
108 {
109 char name[129]; 108 char name[129];
110 struct hostent *ent; 109 struct hostent *ent;
111 unsigned long order; 110 unsigned long order;
112 } ghbn_cache[GHBN_NUM]; 111} ghbn_cache[GHBN_NUM];
113#endif 112#endif
114 113
115static int get_ip(const char *str,unsigned char *ip); 114static int get_ip(const char *str, unsigned char *ip);
116#if 0 115#if 0
117static void ghbn_free(struct hostent *a); 116static void ghbn_free(struct hostent *a);
118static struct hostent *ghbn_dup(struct hostent *a); 117static struct hostent *ghbn_dup(struct hostent *a);
119#endif 118#endif
120int BIO_get_host_ip(const char *str, unsigned char *ip) 119
121 { 120int
121BIO_get_host_ip(const char *str, unsigned char *ip)
122{
122 int i; 123 int i;
123 int err = 1; 124 int err = 1;
124 int locked = 0; 125 int locked = 0;
125 struct hostent *he; 126 struct hostent *he;
126 127
127 i=get_ip(str,ip); 128 i = get_ip(str, ip);
128 if (i < 0) 129 if (i < 0) {
129 { 130 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS);
130 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
131 goto err; 131 goto err;
132 } 132 }
133 133
134 /* At this point, we have something that is most probably correct 134 /* At this point, we have something that is most probably correct
135 in some way, so let's init the socket. */ 135 in some way, so let's init the socket. */
@@ -138,172 +138,169 @@ int BIO_get_host_ip(const char *str, unsigned char *ip)
138 138
139 /* If the string actually contained an IP address, we need not do 139 /* If the string actually contained an IP address, we need not do
140 anything more */ 140 anything more */
141 if (i > 0) return(1); 141 if (i > 0)
142 return (1);
142 143
143 /* do a gethostbyname */ 144 /* do a gethostbyname */
144 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 145 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
145 locked = 1; 146 locked = 1;
146 he=BIO_gethostbyname(str); 147 he = BIO_gethostbyname(str);
147 if (he == NULL) 148 if (he == NULL) {
148 { 149 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP);
149 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
150 goto err; 150 goto err;
151 } 151 }
152 152
153 /* cast to short because of win16 winsock definition */ 153 /* cast to short because of win16 winsock definition */
154 if ((short)he->h_addrtype != AF_INET) 154 if ((short)he->h_addrtype != AF_INET) {
155 { 155 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
156 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
157 goto err; 156 goto err;
158 } 157 }
159 for (i=0; i<4; i++) 158 for (i = 0; i < 4; i++)
160 ip[i]=he->h_addr_list[0][i]; 159 ip[i] = he->h_addr_list[0][i];
161 err = 0; 160 err = 0;
162 161
163 err: 162err:
164 if (locked) 163 if (locked)
165 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 164 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
166 if (err) 165 if (err) {
167 { 166 ERR_add_error_data(2, "host=", str);
168 ERR_add_error_data(2,"host=",str);
169 return 0; 167 return 0;
170 } 168 } else
171 else
172 return 1; 169 return 1;
173 } 170}
174 171
175int BIO_get_port(const char *str, unsigned short *port_ptr) 172int
176 { 173BIO_get_port(const char *str, unsigned short *port_ptr)
174{
177 int i; 175 int i;
178 struct servent *s; 176 struct servent *s;
179 177
180 if (str == NULL) 178 if (str == NULL) {
181 { 179 BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED);
182 BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); 180 return (0);
183 return(0); 181 }
184 } 182 i = atoi(str);
185 i=atoi(str);
186 if (i != 0) 183 if (i != 0)
187 *port_ptr=(unsigned short)i; 184 *port_ptr = (unsigned short)i;
188 else 185 else {
189 {
190 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); 186 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
191 /* Note: under VMS with SOCKETSHR, it seems like the first 187 /* Note: under VMS with SOCKETSHR, it seems like the first
192 * parameter is 'char *', instead of 'const char *' 188 * parameter is 'char *', instead of 'const char *'
193 */ 189 */
194#ifndef CONST_STRICT 190#ifndef CONST_STRICT
195 s=getservbyname((char *)str,"tcp"); 191 s = getservbyname((char *)str, "tcp");
196#else 192#else
197 s=getservbyname(str,"tcp"); 193 s = getservbyname(str, "tcp");
198#endif 194#endif
199 if(s != NULL) 195 if (s != NULL)
200 *port_ptr=ntohs((unsigned short)s->s_port); 196 *port_ptr = ntohs((unsigned short)s->s_port);
201 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); 197 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
202 if(s == NULL) 198 if (s == NULL) {
203 { 199 if (strcmp(str, "http") == 0)
204 if (strcmp(str,"http") == 0) 200 *port_ptr = 80;
205 *port_ptr=80; 201 else if (strcmp(str, "telnet") == 0)
206 else if (strcmp(str,"telnet") == 0) 202 *port_ptr = 23;
207 *port_ptr=23; 203 else if (strcmp(str, "socks") == 0)
208 else if (strcmp(str,"socks") == 0) 204 *port_ptr = 1080;
209 *port_ptr=1080; 205 else if (strcmp(str, "https") == 0)
210 else if (strcmp(str,"https") == 0) 206 *port_ptr = 443;
211 *port_ptr=443; 207 else if (strcmp(str, "ssl") == 0)
212 else if (strcmp(str,"ssl") == 0) 208 *port_ptr = 443;
213 *port_ptr=443; 209 else if (strcmp(str, "ftp") == 0)
214 else if (strcmp(str,"ftp") == 0) 210 *port_ptr = 21;
215 *port_ptr=21; 211 else if (strcmp(str, "gopher") == 0)
216 else if (strcmp(str,"gopher") == 0) 212 *port_ptr = 70;
217 *port_ptr=70;
218#if 0 213#if 0
219 else if (strcmp(str,"wais") == 0) 214 else if (strcmp(str, "wais") == 0)
220 *port_ptr=21; 215 *port_ptr = 21;
221#endif 216#endif
222 else 217 else {
223 { 218 SYSerr(SYS_F_GETSERVBYNAME, errno);
224 SYSerr(SYS_F_GETSERVBYNAME,errno); 219 ERR_add_error_data(3, "service = '", str, "'");
225 ERR_add_error_data(3,"service='",str,"'"); 220 return (0);
226 return(0);
227 }
228 } 221 }
229 } 222 }
230 return(1);
231 } 223 }
224 return (1);
225}
232 226
233int BIO_sock_error(int sock) 227int
234 { 228BIO_sock_error(int sock)
235 int j,i; 229{
230 int j, i;
236 int size; 231 int size;
237 232
238#if defined(OPENSSL_SYS_BEOS_R5) 233#if defined(OPENSSL_SYS_BEOS_R5)
239 return 0; 234 return 0;
240#endif 235#endif
241 236
242 size=sizeof(int); 237 size = sizeof(int);
243 /* Note: under Windows the third parameter is of type (char *) 238 /* Note: under Windows the third parameter is of type (char *)
244 * whereas under other systems it is (void *) if you don't have 239 * whereas under other systems it is (void *) if you don't have
245 * a cast it will choke the compiler: if you do have a cast then 240 * a cast it will choke the compiler: if you do have a cast then
246 * you can either go for (char *) or (void *). 241 * you can either go for (char *) or (void *).
247 */ 242 */
248 i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); 243 i = getsockopt(sock, SOL_SOCKET, SO_ERROR,(void *)&j,(void *)&size);
249 if (i < 0) 244 if (i < 0)
250 return(1); 245 return (1);
251 else 246 else
252 return(j); 247 return (j);
253 } 248}
254 249
255#if 0 250#if 0
256long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) 251long
257 { 252BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
253{
258 int i; 254 int i;
259 char **p; 255 char **p;
260 256
261 switch (cmd) 257 switch (cmd) {
262 {
263 case BIO_GHBN_CTRL_HITS: 258 case BIO_GHBN_CTRL_HITS:
264 return(BIO_ghbn_hits); 259 return (BIO_ghbn_hits);
265 /* break; */ 260 /* break; */
266 case BIO_GHBN_CTRL_MISSES: 261 case BIO_GHBN_CTRL_MISSES:
267 return(BIO_ghbn_miss); 262 return (BIO_ghbn_miss);
268 /* break; */ 263 /* break; */
269 case BIO_GHBN_CTRL_CACHE_SIZE: 264 case BIO_GHBN_CTRL_CACHE_SIZE:
270 return(GHBN_NUM); 265 return (GHBN_NUM);
271 /* break; */ 266 /* break; */
272 case BIO_GHBN_CTRL_GET_ENTRY: 267 case BIO_GHBN_CTRL_GET_ENTRY:
273 if ((iarg >= 0) && (iarg <GHBN_NUM) && 268 if ((iarg >= 0) && (iarg < GHBN_NUM) &&
274 (ghbn_cache[iarg].order > 0)) 269 (ghbn_cache[iarg].order > 0)) {
275 { 270 p = (char **)parg;
276 p=(char **)parg; 271 if (p == NULL)
277 if (p == NULL) return(0); 272 return (0);
278 *p=ghbn_cache[iarg].name; 273 *p = ghbn_cache[iarg].name;
279 ghbn_cache[iarg].name[128]='\0'; 274 ghbn_cache[iarg].name[128] = '\0';
280 return(1); 275 return (1);
281 } 276 }
282 return(0); 277 return (0);
283 /* break; */ 278 /* break; */
284 case BIO_GHBN_CTRL_FLUSH: 279 case BIO_GHBN_CTRL_FLUSH:
285 for (i=0; i<GHBN_NUM; i++) 280 for (i = 0; i < GHBN_NUM; i++)
286 ghbn_cache[i].order=0; 281 ghbn_cache[i].order = 0;
287 break; 282 break;
288 default: 283 default:
289 return(0); 284 return (0);
290 }
291 return(1);
292 } 285 }
286 return (1);
287}
293#endif 288#endif
294 289
295#if 0 290#if 0
296static struct hostent *ghbn_dup(struct hostent *a) 291static struct hostent
297 { 292*ghbn_dup(struct hostent *a)
293{
298 struct hostent *ret; 294 struct hostent *ret;
299 int i,j; 295 int i, j;
300 296
301 MemCheck_off(); 297 MemCheck_off();
302 ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); 298 ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent));
303 if (ret == NULL) return(NULL); 299 if (ret == NULL)
304 memset(ret,0,sizeof(struct hostent)); 300 return (NULL);
301 memset(ret, 0, sizeof(struct hostent));
305 302
306 for (i=0; a->h_aliases[i] != NULL; i++) 303 for (i = 0; a->h_aliases[i] != NULL; i++)
307 ; 304 ;
308 i++; 305 i++;
309 ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); 306 ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *));
@@ -311,69 +308,66 @@ static struct hostent *ghbn_dup(struct hostent *a)
311 goto err; 308 goto err;
312 memset(ret->h_aliases, 0, i*sizeof(char *)); 309 memset(ret->h_aliases, 0, i*sizeof(char *));
313 310
314 for (i=0; a->h_addr_list[i] != NULL; i++) 311 for (i = 0; a->h_addr_list[i] != NULL; i++)
315 ; 312 ;
316 i++; 313 i++;
317 ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); 314 ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *));
318 if (ret->h_addr_list == NULL) 315 if (ret->h_addr_list == NULL)
319 goto err; 316 goto err;
320 memset(ret->h_addr_list, 0, i*sizeof(char *)); 317 memset(ret->h_addr_list, 0, i*sizeof(char *));
321 318
322 j=strlen(a->h_name)+1; 319 j = strlen(a->h_name) + 1;
323 if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; 320 if ((ret->h_name = OPENSSL_malloc(j)) == NULL) goto err;
324 memcpy((char *)ret->h_name,a->h_name,j); 321 memcpy((char *)ret->h_name, a->h_name, j);
325 for (i=0; a->h_aliases[i] != NULL; i++) 322 for (i = 0; a->h_aliases[i] != NULL; i++) {
326 { 323 j = strlen(a->h_aliases[i]) + 1;
327 j=strlen(a->h_aliases[i])+1; 324 if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL) goto err;
328 if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; 325 memcpy(ret->h_aliases[i], a->h_aliases[i], j);
329 memcpy(ret->h_aliases[i],a->h_aliases[i],j); 326 }
330 } 327 ret->h_length = a->h_length;
331 ret->h_length=a->h_length; 328 ret->h_addrtype = a->h_addrtype;
332 ret->h_addrtype=a->h_addrtype; 329 for (i = 0; a->h_addr_list[i] != NULL; i++) {
333 for (i=0; a->h_addr_list[i] != NULL; i++) 330 if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL)
334 {
335 if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL)
336 goto err; 331 goto err;
337 memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); 332 memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length);
338 } 333 }
339 if (0) 334 if (0) {
340 { 335err:
341err:
342 if (ret != NULL) 336 if (ret != NULL)
343 ghbn_free(ret); 337 ghbn_free(ret);
344 ret=NULL; 338 ret = NULL;
345 }
346 MemCheck_on();
347 return(ret);
348 } 339 }
340 MemCheck_on();
341 return (ret);
342}
349 343
350static void ghbn_free(struct hostent *a) 344static void
351 { 345ghbn_free(struct hostent *a)
346{
352 int i; 347 int i;
353 348
354 if(a == NULL) 349 if (a == NULL)
355 return; 350 return;
356 351
357 if (a->h_aliases != NULL) 352 if (a->h_aliases != NULL) {
358 { 353 for (i = 0; a->h_aliases[i] != NULL; i++)
359 for (i=0; a->h_aliases[i] != NULL; i++)
360 OPENSSL_free(a->h_aliases[i]); 354 OPENSSL_free(a->h_aliases[i]);
361 OPENSSL_free(a->h_aliases); 355 OPENSSL_free(a->h_aliases);
362 } 356 }
363 if (a->h_addr_list != NULL) 357 if (a->h_addr_list != NULL) {
364 { 358 for (i = 0; a->h_addr_list[i] != NULL; i++)
365 for (i=0; a->h_addr_list[i] != NULL; i++)
366 OPENSSL_free(a->h_addr_list[i]); 359 OPENSSL_free(a->h_addr_list[i]);
367 OPENSSL_free(a->h_addr_list); 360 OPENSSL_free(a->h_addr_list);
368 }
369 if (a->h_name != NULL) OPENSSL_free(a->h_name);
370 OPENSSL_free(a);
371 } 361 }
362 if (a->h_name != NULL)
363 OPENSSL_free(a->h_name);
364 OPENSSL_free(a);
365}
372 366
373#endif 367#endif
374 368
375struct hostent *BIO_gethostbyname(const char *name) 369struct hostent
376 { 370*BIO_gethostbyname(const char *name) {
377#if 1 371#if 1
378 /* Caching gethostbyname() results forever is wrong, 372 /* Caching gethostbyname() results forever is wrong,
379 * so we have to let the true gethostbyname() worry about this */ 373 * so we have to let the true gethostbyname() worry about this */
@@ -384,8 +378,8 @@ struct hostent *BIO_gethostbyname(const char *name)
384#endif 378#endif
385#else 379#else
386 struct hostent *ret; 380 struct hostent *ret;
387 int i,lowi=0,j; 381 int i, lowi = 0, j;
388 unsigned long low= (unsigned long)-1; 382 unsigned long low = (unsigned long) - 1;
389 383
390 384
391# if 0 385# if 0
@@ -395,42 +389,37 @@ struct hostent *BIO_gethostbyname(const char *name)
395 */ 389 */
396 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 390 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
397# endif 391# endif
398 j=strlen(name); 392 j = strlen(name);
399 if (j < 128) 393 if (j < 128) {
400 { 394 for (i = 0; i < GHBN_NUM; i++) {
401 for (i=0; i<GHBN_NUM; i++) 395 if (low > ghbn_cache[i].order) {
402 { 396 low = ghbn_cache[i].order;
403 if (low > ghbn_cache[i].order) 397 lowi = i;
404 { 398 }
405 low=ghbn_cache[i].order; 399 if (ghbn_cache[i].order > 0) {
406 lowi=i; 400 if (strncmp(name, ghbn_cache[i].name, 128) == 0)
407 }
408 if (ghbn_cache[i].order > 0)
409 {
410 if (strncmp(name,ghbn_cache[i].name,128) == 0)
411 break; 401 break;
412 }
413 } 402 }
414 } 403 }
415 else 404 } else
416 i=GHBN_NUM; 405 i = GHBN_NUM;
417 406
418 if (i == GHBN_NUM) /* no hit*/ 407 if (i == GHBN_NUM) /* no hit*/
419 { 408 {
420 BIO_ghbn_miss++; 409 BIO_ghbn_miss++;
421 /* Note: under VMS with SOCKETSHR, it seems like the first 410 /* Note: under VMS with SOCKETSHR, it seems like the first
422 * parameter is 'char *', instead of 'const char *' 411 * parameter is 'char *', instead of 'const char *'
423 */ 412 */
424# ifndef CONST_STRICT 413# ifndef CONST_STRICT
425 ret=gethostbyname((char *)name); 414 ret = gethostbyname((char *)name);
426# else 415# else
427 ret=gethostbyname(name); 416 ret = gethostbyname(name);
428# endif 417# endif
429 418
430 if (ret == NULL) 419 if (ret == NULL)
431 goto end; 420 goto end;
432 if (j > 128) /* too big to cache */ 421 if (j > 128) /* too big to cache */
433 { 422 {
434# if 0 423# if 0
435 /* If we were trying to make this function thread-safe (which 424 /* If we were trying to make this function thread-safe (which
436 * is bound to fail), we'd have to give up in this case 425 * is bound to fail), we'd have to give up in this case
@@ -438,118 +427,113 @@ struct hostent *BIO_gethostbyname(const char *name)
438 ret = NULL; 427 ret = NULL;
439# endif 428# endif
440 goto end; 429 goto end;
441 } 430 }
442 431
443 /* else add to cache */ 432 /* else add to cache */
444 if (ghbn_cache[lowi].ent != NULL) 433 if (ghbn_cache[lowi].ent != NULL)
445 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ 434 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
446 ghbn_cache[lowi].name[0] = '\0'; 435 ghbn_cache[lowi].name[0] = '\0';
447 436
448 if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) 437 if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) {
449 { 438 BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE);
450 BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE);
451 goto end; 439 goto end;
452 }
453 strncpy(ghbn_cache[lowi].name,name,128);
454 ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
455 } 440 }
456 else 441 strncpy(ghbn_cache[lowi].name, name, 128);
457 { 442 ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits;
443 } else {
458 BIO_ghbn_hits++; 444 BIO_ghbn_hits++;
459 ret= ghbn_cache[i].ent; 445 ret = ghbn_cache[i].ent;
460 ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; 446 ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits;
461 } 447 }
462end: 448end:
463# if 0 449# if 0
464 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 450 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
465# endif 451# endif
466 return(ret); 452 return (ret);
467#endif 453#endif
468 } 454}
469 455
470 456
471int BIO_sock_init(void) 457int
472 { 458BIO_sock_init(void)
459{
473#ifdef OPENSSL_SYS_WINDOWS 460#ifdef OPENSSL_SYS_WINDOWS
474 static struct WSAData wsa_state; 461 static struct WSAData wsa_state;
475 462
476 if (!wsa_init_done) 463 if (!wsa_init_done) {
477 {
478 int err; 464 int err;
479 465
480 wsa_init_done=1; 466 wsa_init_done = 1;
481 memset(&wsa_state,0,sizeof(wsa_state)); 467 memset(&wsa_state, 0, sizeof(wsa_state));
482 /* Not making wsa_state available to the rest of the 468 /* Not making wsa_state available to the rest of the
483 * code is formally wrong. But the structures we use 469 * code is formally wrong. But the structures we use
484 * are [beleived to be] invariable among Winsock DLLs, 470 * are [beleived to be] invariable among Winsock DLLs,
485 * while API availability is [expected to be] probed 471 * while API availability is [expected to be] probed
486 * at run-time with DSO_global_lookup. */ 472 * at run-time with DSO_global_lookup. */
487 if (WSAStartup(0x0202,&wsa_state)!=0) 473 if (WSAStartup(0x0202, &wsa_state) != 0) {
488 { 474 err = WSAGetLastError();
489 err=WSAGetLastError(); 475 SYSerr(SYS_F_WSASTARTUP, err);
490 SYSerr(SYS_F_WSASTARTUP,err); 476 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);
491 BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); 477 return (-1);
492 return(-1);
493 }
494 } 478 }
479 }
495#endif /* OPENSSL_SYS_WINDOWS */ 480#endif /* OPENSSL_SYS_WINDOWS */
496#ifdef WATT32 481#ifdef WATT32
497 extern int _watt_do_exit; 482 extern int _watt_do_exit;
498 _watt_do_exit = 0; /* don't make sock_init() call exit() */ 483 _watt_do_exit = 0;
484 /* don't make sock_init() call exit() */
499 if (sock_init()) 485 if (sock_init())
500 return (-1); 486 return (-1);
501#endif 487#endif
502 488
503#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 489#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
504 WORD wVerReq; 490 WORD wVerReq;
505 WSADATA wsaData; 491 WSADATA wsaData;
506 int err; 492 int err;
507 493
508 if (!wsa_init_done) 494 if (!wsa_init_done) {
509 { 495 wsa_init_done = 1;
510 wsa_init_done=1; 496 wVerReq = MAKEWORD( 2, 0 );
511 wVerReq = MAKEWORD( 2, 0 ); 497 err = WSAStartup(wVerReq, &wsaData);
512 err = WSAStartup(wVerReq,&wsaData); 498 if (err != 0) {
513 if (err != 0) 499 SYSerr(SYS_F_WSASTARTUP, err);
514 { 500 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);
515 SYSerr(SYS_F_WSASTARTUP,err); 501 return (-1);
516 BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
517 return(-1);
518 }
519 } 502 }
503 }
520#endif 504#endif
521 505
522 return(1); 506 return (1);
523 } 507}
524 508
525void BIO_sock_cleanup(void) 509void
526 { 510BIO_sock_cleanup(void)
511{
527#ifdef OPENSSL_SYS_WINDOWS 512#ifdef OPENSSL_SYS_WINDOWS
528 if (wsa_init_done) 513 if (wsa_init_done) {
529 { 514 wsa_init_done = 0;
530 wsa_init_done=0;
531#if 0 /* this call is claimed to be non-present in Winsock2 */ 515#if 0 /* this call is claimed to be non-present in Winsock2 */
532 WSACancelBlockingCall(); 516 WSACancelBlockingCall();
533#endif 517#endif
534 WSACleanup(); 518 WSACleanup();
535 } 519 }
536#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 520#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
537 if (wsa_init_done) 521 if (wsa_init_done) {
538 { 522 wsa_init_done = 0;
539 wsa_init_done=0; 523 WSACleanup();
540 WSACleanup();
541 }
542#endif
543 } 524 }
525#endif
526}
544 527
545#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 528#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000
546 529
547int BIO_socket_ioctl(int fd, long type, void *arg) 530int
548 { 531BIO_socket_ioctl(int fd, long type, void *arg)
532{
549 int i; 533 int i;
550 534
551#ifdef __DJGPP__ 535#ifdef __DJGPP__
552 i=ioctl(fd,type,(char *)arg); 536 i = ioctl(fd, type,(char *)arg);
553#else 537#else
554# if defined(OPENSSL_SYS_VMS) 538# if defined(OPENSSL_SYS_VMS)
555 /* 2011-02-18 SMS. 539 /* 2011-02-18 SMS.
@@ -574,402 +558,399 @@ int BIO_socket_ioctl(int fd, long type, void *arg)
574# define ARG arg 558# define ARG arg
575# endif /* defined(OPENSSL_SYS_VMS) [else] */ 559# endif /* defined(OPENSSL_SYS_VMS) [else] */
576 560
577 i=ioctl(fd,type,ARG); 561 i = ioctl(fd, type, ARG);
578#endif /* __DJGPP__ */ 562#endif /* __DJGPP__ */
579 if (i < 0) 563 if (i < 0)
580 SYSerr(SYS_F_IOCTLSOCKET,errno); 564 SYSerr(SYS_F_IOCTLSOCKET, errno);
581 return(i); 565 return (i);
582 } 566}
583#endif /* __VMS_VER */ 567#endif /* __VMS_VER */
584 568
585/* The reason I have implemented this instead of using sscanf is because 569/* The reason I have implemented this instead of using sscanf is because
586 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ 570 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
587static int get_ip(const char *str, unsigned char ip[4]) 571static int
588 { 572get_ip(const char *str, unsigned char ip[4])
573{
589 unsigned int tmp[4]; 574 unsigned int tmp[4];
590 int num=0,c,ok=0; 575 int num = 0, c, ok = 0;
591 576
592 tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; 577 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;
593 578
594 for (;;) 579 for (;;) {
595 {
596 c= *(str++); 580 c= *(str++);
597 if ((c >= '0') && (c <= '9')) 581 if ((c >= '0') && (c <= '9')) {
598 { 582 ok = 1;
599 ok=1; 583 tmp[num] = tmp[num]*10 + c-'0';
600 tmp[num]=tmp[num]*10+c-'0'; 584 if (tmp[num] > 255)
601 if (tmp[num] > 255) return(0); 585 return (0);
602 } 586 } else if (c == '.') {
603 else if (c == '.') 587 if (!ok)
604 { 588 return (-1);
605 if (!ok) return(-1); 589 if (num == 3)
606 if (num == 3) return(0); 590 return (0);
607 num++; 591 num++;
608 ok=0; 592 ok = 0;
609 } 593 } else if (c == '\0' && (num == 3) && ok)
610 else if (c == '\0' && (num == 3) && ok) 594 break;
611 break;
612 else 595 else
613 return(0); 596 return (0);
614 }
615 ip[0]=tmp[0];
616 ip[1]=tmp[1];
617 ip[2]=tmp[2];
618 ip[3]=tmp[3];
619 return(1);
620 } 597 }
621 598 ip[0] = tmp[0];
622int BIO_get_accept_socket(char *host, int bind_mode) 599 ip[1] = tmp[1];
623 { 600 ip[2] = tmp[2];
624 int ret=0; 601 ip[3] = tmp[3];
602 return (1);
603}
604
605int
606BIO_get_accept_socket(char *host, int bind_mode)
607{
608 int ret = 0;
625 union { 609 union {
626 struct sockaddr sa; 610 struct sockaddr sa;
627 struct sockaddr_in sa_in; 611 struct sockaddr_in sa_in;
628#if OPENSSL_USE_IPV6 612#if OPENSSL_USE_IPV6
629 struct sockaddr_in6 sa_in6; 613 struct sockaddr_in6 sa_in6;
630#endif 614#endif
631 } server,client; 615 } server, client;
632 int s=-1,cs,addrlen; 616 int s = -1, cs, addrlen;
633 unsigned char ip[4]; 617 unsigned char ip[4];
634 unsigned short port; 618 unsigned short port;
635 char *str=NULL,*e; 619 char *str = NULL, *e;
636 char *h,*p; 620 char *h, *p;
637 unsigned long l; 621 unsigned long l;
638 int err_num; 622 int err_num;
639 623
640 if (BIO_sock_init() != 1) return(-1); 624 if (BIO_sock_init() != 1)
625 return (-1);
641 626
642 if ((str=BUF_strdup(host)) == NULL) return(-1); 627 if ((str = BUF_strdup(host)) == NULL)
628 return (-1);
643 629
644 h=p=NULL; 630 h = p = NULL;
645 h=str; 631 h = str;
646 for (e=str; *e; e++) 632 for (e = str; *e; e++) {
647 { 633 if (*e == ':') {
648 if (*e == ':') 634 p = e;
649 { 635 } else if (*e == '/') {
650 p=e; 636 *e = '\0';
651 }
652 else if (*e == '/')
653 {
654 *e='\0';
655 break; 637 break;
656 }
657 } 638 }
658 if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ 639 }
659 else p=h,h=NULL; 640 if (p)
641 *p++='\0'; /* points at last ':', '::port' is special [see below] */
642 else
643 p = h, h = NULL;
660 644
661#ifdef EAI_FAMILY 645#ifdef EAI_FAMILY
662 do { 646 do {
663 static union { void *p; 647 static union {
664 int (WSAAPI *f)(const char *,const char *, 648 void *p;
665 const struct addrinfo *, 649 int (WSAAPI *f)(const char *, const char *,
666 struct addrinfo **); 650 const struct addrinfo *,
667 } p_getaddrinfo = {NULL}; 651 struct addrinfo **);
668 static union { void *p; 652 } p_getaddrinfo = {NULL};
653 static union {
654 void *p;
669 void (WSAAPI *f)(struct addrinfo *); 655 void (WSAAPI *f)(struct addrinfo *);
670 } p_freeaddrinfo = {NULL}; 656 } p_freeaddrinfo = {NULL};
671 struct addrinfo *res,hint; 657 struct addrinfo *res, hint;
672 658
673 if (p_getaddrinfo.p==NULL) 659 if (p_getaddrinfo.p == NULL) {
674 { 660 if ((p_getaddrinfo.p = DSO_global_lookup("getaddrinfo"))==NULL ||
675 if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || 661 (p_freeaddrinfo.p = DSO_global_lookup("freeaddrinfo"))==NULL)
676 (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) 662 p_getaddrinfo.p = (void*) - 1;
677 p_getaddrinfo.p=(void*)-1; 663 }
678 } 664 if (p_getaddrinfo.p == (void *) - 1) break;
679 if (p_getaddrinfo.p==(void *)-1) break; 665
680 666 /* '::port' enforces IPv6 wildcard listener. Some OSes,
681 /* '::port' enforces IPv6 wildcard listener. Some OSes, 667 * e.g. Solaris, default to IPv6 without any hint. Also
682 * e.g. Solaris, default to IPv6 without any hint. Also 668 * note that commonly IPv6 wildchard socket can service
683 * note that commonly IPv6 wildchard socket can service 669 * IPv4 connections just as well... */
684 * IPv4 connections just as well... */ 670 memset(&hint, 0, sizeof(hint));
685 memset(&hint,0,sizeof(hint)); 671 hint.ai_flags = AI_PASSIVE;
686 hint.ai_flags = AI_PASSIVE; 672 if (h) {
687 if (h) 673 if (strchr(h, ':')) {
688 { 674 if (h[1] == '\0')
689 if (strchr(h,':')) 675 h = NULL;
690 {
691 if (h[1]=='\0') h=NULL;
692#if OPENSSL_USE_IPV6 676#if OPENSSL_USE_IPV6
693 hint.ai_family = AF_INET6; 677 hint.ai_family = AF_INET6;
694#else 678#else
695 h=NULL; 679 h = NULL;
696#endif 680#endif
697 } 681 } else if (h[0] == '*' && h[1] == '\0') {
698 else if (h[0]=='*' && h[1]=='\0') 682 hint.ai_family = AF_INET;
699 { 683 h = NULL;
700 hint.ai_family = AF_INET;
701 h=NULL;
702 } 684 }
703 } 685 }
704 686
705 if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; 687 if ((*p_getaddrinfo.f)(h, p, &hint, &res))
688 break;
706 689
707 addrlen = res->ai_addrlen<=sizeof(server) ? 690 addrlen = res->ai_addrlen <= sizeof(server) ?
708 res->ai_addrlen : 691 res->ai_addrlen : sizeof(server);
709 sizeof(server); 692 memcpy(&server, res->ai_addr, addrlen);
710 memcpy(&server, res->ai_addr, addrlen);
711 693
712 (*p_freeaddrinfo.f)(res); 694 (*p_freeaddrinfo.f)(res);
713 goto again; 695 goto again;
714 } while (0); 696 } while (0);
715#endif 697#endif
716 698
717 if (!BIO_get_port(p,&port)) goto err; 699 if (!BIO_get_port(p, &port))
700 goto err;
718 701
719 memset((char *)&server,0,sizeof(server)); 702 memset((char *)&server, 0, sizeof(server));
720 server.sa_in.sin_family=AF_INET; 703 server.sa_in.sin_family = AF_INET;
721 server.sa_in.sin_port=htons(port); 704 server.sa_in.sin_port = htons(port);
722 addrlen = sizeof(server.sa_in); 705 addrlen = sizeof(server.sa_in);
723 706
724 if (h == NULL || strcmp(h,"*") == 0) 707 if (h == NULL || strcmp(h, "*") == 0)
725 server.sa_in.sin_addr.s_addr=INADDR_ANY; 708 server.sa_in.sin_addr.s_addr = INADDR_ANY;
726 else 709 else {
727 { 710 if (!BIO_get_host_ip(h, &(ip[0])))
728 if (!BIO_get_host_ip(h,&(ip[0]))) goto err; 711 goto err;
729 l=(unsigned long) 712 l = (unsigned long)
730 ((unsigned long)ip[0]<<24L)| 713 ((unsigned long)ip[0]<<24L)|
731 ((unsigned long)ip[1]<<16L)| 714 ((unsigned long)ip[1]<<16L)|
732 ((unsigned long)ip[2]<< 8L)| 715 ((unsigned long)ip[2]<< 8L)|
733 ((unsigned long)ip[3]); 716 ((unsigned long)ip[3]);
734 server.sa_in.sin_addr.s_addr=htonl(l); 717 server.sa_in.sin_addr.s_addr = htonl(l);
735 } 718 }
736 719
737again: 720again:
738 s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); 721 s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
739 if (s == -1) 722 if (s == -1) {
740 { 723 SYSerr(SYS_F_SOCKET, errno);
741 SYSerr(SYS_F_SOCKET,errno); 724 ERR_add_error_data(3, "port = '", host, "'");
742 ERR_add_error_data(3,"port='",host,"'"); 725 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET);
743 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
744 goto err; 726 goto err;
745 } 727 }
746 728
747#ifdef SO_REUSEADDR 729#ifdef SO_REUSEADDR
748 if (bind_mode == BIO_BIND_REUSEADDR) 730 if (bind_mode == BIO_BIND_REUSEADDR) {
749 { 731 int i = 1;
750 int i=1;
751 732
752 ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); 733 ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(char *)&i, sizeof(i));
753 bind_mode=BIO_BIND_NORMAL; 734 bind_mode = BIO_BIND_NORMAL;
754 } 735 }
755#endif 736#endif
756 if (bind(s,&server.sa,addrlen) == -1) 737 if (bind(s, &server.sa, addrlen) == -1) {
757 {
758#ifdef SO_REUSEADDR 738#ifdef SO_REUSEADDR
759 err_num=errno; 739 err_num = errno;
760 if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && 740 if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
761#ifdef OPENSSL_SYS_WINDOWS 741#ifdef OPENSSL_SYS_WINDOWS
762 /* Some versions of Windows define EADDRINUSE to 742 /* Some versions of Windows define EADDRINUSE to
763 * a dummy value. 743 * a dummy value.
764 */ 744 */
765 (err_num == WSAEADDRINUSE)) 745 (err_num == WSAEADDRINUSE))
766#else 746#else
767 (err_num == EADDRINUSE)) 747 (err_num == EADDRINUSE))
768#endif 748#endif
769 { 749 {
770 client = server; 750 client = server;
771 if (h == NULL || strcmp(h,"*") == 0) 751 if (h == NULL || strcmp(h, "*") == 0) {
772 {
773#if OPENSSL_USE_IPV6 752#if OPENSSL_USE_IPV6
774 if (client.sa.sa_family == AF_INET6) 753 if (client.sa.sa_family == AF_INET6) {
775 { 754 memset(&client.sa_in6.sin6_addr, 0, sizeof(client.sa_in6.sin6_addr));
776 memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); 755 client.sa_in6.sin6_addr.s6_addr[15] = 1;
777 client.sa_in6.sin6_addr.s6_addr[15]=1; 756 } else
778 } 757#endif
779 else 758 if (client.sa.sa_family == AF_INET) {
780#endif 759 client.sa_in.sin_addr.s_addr = htonl(0x7F000001);
781 if (client.sa.sa_family == AF_INET) 760 } else
782 { 761 goto err;
783 client.sa_in.sin_addr.s_addr=htonl(0x7F000001); 762 }
784 } 763 cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
785 else goto err; 764 if (cs != -1) {
786 }
787 cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
788 if (cs != -1)
789 {
790 int ii; 765 int ii;
791 ii=connect(cs,&client.sa,addrlen); 766 ii = connect(cs, &client.sa, addrlen);
792 close(cs); 767 close(cs);
793 if (ii == -1) 768 if (ii == -1) {
794 { 769 bind_mode = BIO_BIND_REUSEADDR;
795 bind_mode=BIO_BIND_REUSEADDR;
796 close(s); 770 close(s);
797 goto again; 771 goto again;
798 }
799 /* else error */
800 } 772 }
801 /* else error */ 773 /* else error */
802 } 774 }
775 /* else error */
776 }
803#endif 777#endif
804 SYSerr(SYS_F_BIND,err_num); 778 SYSerr(SYS_F_BIND, err_num);
805 ERR_add_error_data(3,"port='",host,"'"); 779 ERR_add_error_data(3, "port = '", host, "'");
806 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); 780 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_BIND_SOCKET);
807 goto err; 781 goto err;
808 } 782 }
809 if (listen(s,MAX_LISTEN) == -1) 783 if (listen(s, MAX_LISTEN) == -1) {
810 { 784 SYSerr(SYS_F_BIND, errno);
811 SYSerr(SYS_F_BIND,errno); 785 ERR_add_error_data(3, "port = '", host, "'");
812 ERR_add_error_data(3,"port='",host,"'"); 786 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_LISTEN_SOCKET);
813 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET);
814 goto err; 787 goto err;
815 } 788 }
816 ret=1; 789 ret = 1;
817err: 790err:
818 if (str != NULL) OPENSSL_free(str); 791 if (str != NULL)
819 if ((ret == 0) && (s != -1)) 792 OPENSSL_free(str);
820 { 793 if ((ret == 0) && (s != -1)) {
821 close(s); 794 close(s);
822 s= -1; 795 s = -1;
823 }
824 return(s);
825 } 796 }
797 return (s);
798}
826 799
827int BIO_accept(int sock, char **addr) 800int
828 { 801BIO_accept(int sock, char **addr)
829 int ret=-1; 802{
803 int ret = -1;
830 unsigned long l; 804 unsigned long l;
831 unsigned short port; 805 unsigned short port;
832 char *p; 806 char *p;
833 807
834 struct { 808 struct {
835 /* 809 /*
836 * As for following union. Trouble is that there are platforms 810 * As for following union. Trouble is that there are platforms
837 * that have socklen_t and there are platforms that don't, on 811 * that have socklen_t and there are platforms that don't, on
838 * some platforms socklen_t is int and on some size_t. So what 812 * some platforms socklen_t is int and on some size_t. So what
839 * one can do? One can cook #ifdef spaghetti, which is nothing 813 * one can do? One can cook #ifdef spaghetti, which is nothing
840 * but masochistic. Or one can do union between int and size_t. 814 * but masochistic. Or one can do union between int and size_t.
841 * One naturally does it primarily for 64-bit platforms where 815 * One naturally does it primarily for 64-bit platforms where
842 * sizeof(int) != sizeof(size_t). But would it work? Note that 816 * sizeof(int) != sizeof(size_t). But would it work? Note that
843 * if size_t member is initialized to 0, then later int member 817 * if size_t member is initialized to 0, then later int member
844 * assignment naturally does the job on little-endian platforms 818 * assignment naturally does the job on little-endian platforms
845 * regardless accept's expectations! What about big-endians? 819 * regardless accept's expectations! What about big-endians?
846 * If accept expects int*, then it works, and if size_t*, then 820 * If accept expects int*, then it works, and if size_t*, then
847 * length value would appear as unreasonably large. But this 821 * length value would appear as unreasonably large. But this
848 * won't prevent it from filling in the address structure. The 822 * won't prevent it from filling in the address structure. The
849 * trouble of course would be if accept returns more data than 823 * trouble of course would be if accept returns more data than
850 * actual buffer can accomodate and overwrite stack... That's 824 * actual buffer can accomodate and overwrite stack... That's
851 * where early OPENSSL_assert comes into picture. Besides, the 825 * where early OPENSSL_assert comes into picture. Besides, the
852 * only 64-bit big-endian platform found so far that expects 826 * only 64-bit big-endian platform found so far that expects
853 * size_t* is HP-UX, where stack grows towards higher address. 827 * size_t* is HP-UX, where stack grows towards higher address.
854 * <appro> 828 * <appro>
855 */ 829 */
856 union { size_t s; int i; } len; 830 union {
857 union { 831 size_t s;
858 struct sockaddr sa; 832 int i;
859 struct sockaddr_in sa_in; 833 } len;
834 union {
835 struct sockaddr sa;
836 struct sockaddr_in sa_in;
860#if OPENSSL_USE_IPV6 837#if OPENSSL_USE_IPV6
861 struct sockaddr_in6 sa_in6; 838 struct sockaddr_in6 sa_in6;
862#endif 839#endif
863 } from; 840 } from;
864 } sa; 841 } sa;
865 842
866 sa.len.s=0; 843 sa.len.s = 0;
867 sa.len.i=sizeof(sa.from); 844 sa.len.i = sizeof(sa.from);
868 memset(&sa.from,0,sizeof(sa.from)); 845 memset(&sa.from, 0, sizeof(sa.from));
869 ret=accept(sock,&sa.from.sa,(void *)&sa.len); 846 ret = accept(sock, &sa.from.sa,(void *)&sa.len);
870 if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) 847 if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) {
871 { 848 OPENSSL_assert(sa.len.s <= sizeof(sa.from));
872 OPENSSL_assert(sa.len.s<=sizeof(sa.from));
873 sa.len.i = (int)sa.len.s; 849 sa.len.i = (int)sa.len.s;
874 /* use sa.len.i from this point */ 850 /* use sa.len.i from this point */
875 } 851 }
876 if (ret == -1) 852 if (ret == -1) {
877 { 853 if (BIO_sock_should_retry(ret)) return -2;
878 if(BIO_sock_should_retry(ret)) return -2; 854 SYSerr(SYS_F_ACCEPT, errno);
879 SYSerr(SYS_F_ACCEPT,errno); 855 BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR);
880 BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR);
881 goto end; 856 goto end;
882 } 857 }
883 858
884 if (addr == NULL) goto end; 859 if (addr == NULL)
860 goto end;
885 861
886#ifdef EAI_FAMILY 862#ifdef EAI_FAMILY
887 do { 863 do {
888 char h[NI_MAXHOST],s[NI_MAXSERV]; 864 char h[NI_MAXHOST], s[NI_MAXSERV];
889 size_t nl; 865 size_t nl;
890 static union { void *p; 866 static union {
891 int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, 867 void *p;
892 char *,size_t,char *,size_t,int); 868 int (WSAAPI *f)(const struct sockaddr *,
893 } p_getnameinfo = {NULL}; 869 size_t/*socklen_t*/, char *, size_t,
894 /* 2nd argument to getnameinfo is specified to 870 char *, size_t, int);
895 * be socklen_t. Unfortunately there is a number 871 } p_getnameinfo = {NULL};
896 * of environments where socklen_t is not defined. 872 /* 2nd argument to getnameinfo is specified to
897 * As it's passed by value, it's safe to pass it 873 * be socklen_t. Unfortunately there is a number
898 * as size_t... <appro> */ 874 * of environments where socklen_t is not defined.
899 875 * As it's passed by value, it's safe to pass it
900 if (p_getnameinfo.p==NULL) 876 * as size_t... <appro> */
901 { 877
902 if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) 878 if (p_getnameinfo.p == NULL) {
903 p_getnameinfo.p=(void*)-1; 879 if ((p_getnameinfo.p = DSO_global_lookup("getnameinfo")) == NULL)
880 p_getnameinfo.p = (void*) - 1;
881 }
882 if (p_getnameinfo.p == (void *) - 1)
883 break;
884
885 if ((*p_getnameinfo.f)(&sa.from.sa, sa.len.i, h, sizeof(h),
886 s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV))
887 break;
888 nl = strlen(h) + strlen(s) + 2;
889 p = *addr;
890 if (p) {
891 *p = '\0';
892 p = OPENSSL_realloc(p, nl);
893 } else {
894 p = OPENSSL_malloc(nl);
895 }
896 if (p == NULL) {
897 BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE);
898 goto end;
904 } 899 }
905 if (p_getnameinfo.p==(void *)-1) break; 900 *addr = p;
906 901 (void) snprintf(*addr, nl, "%s:%s", h, s);
907 if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s),
908 NI_NUMERICHOST|NI_NUMERICSERV)) break;
909 nl = strlen(h)+strlen(s)+2;
910 p = *addr;
911 if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); }
912 else { p = OPENSSL_malloc(nl); }
913 if (p==NULL)
914 {
915 BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
916 goto end; 902 goto end;
917 } 903 } while (0);
918 *addr = p; 904#endif
919 (void) snprintf(*addr,nl,"%s:%s",h,s); 905 if (sa.from.sa.sa_family != AF_INET)
920 goto end; 906 goto end;
921 } while(0); 907 l = ntohl(sa.from.sa_in.sin_addr.s_addr);
922#endif 908 port = ntohs(sa.from.sa_in.sin_port);
923 if (sa.from.sa.sa_family != AF_INET) goto end; 909 if (*addr == NULL) {
924 l=ntohl(sa.from.sa_in.sin_addr.s_addr); 910 if ((p = OPENSSL_malloc(24)) == NULL) {
925 port=ntohs(sa.from.sa_in.sin_port); 911 BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE);
926 if (*addr == NULL)
927 {
928 if ((p=OPENSSL_malloc(24)) == NULL)
929 {
930 BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
931 goto end; 912 goto end;
932 }
933 *addr=p;
934 } 913 }
935 (void) snprintf(*addr,24,"%d.%d.%d.%d:%d", 914 *addr = p;
936 (unsigned char)(l>>24L)&0xff,
937 (unsigned char)(l>>16L)&0xff,
938 (unsigned char)(l>> 8L)&0xff,
939 (unsigned char)(l )&0xff,
940 port);
941end:
942 return(ret);
943 } 915 }
916 (void) snprintf(*addr, 24, "%d.%d.%d.%d:%d",
917 (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff,
918 (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port);
944 919
945int BIO_set_tcp_ndelay(int s, int on) 920end:
946 { 921 return (ret);
947 int ret=0; 922}
923
924int
925BIO_set_tcp_ndelay(int s, int on)
926{
927 int ret = 0;
948#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) 928#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
949 int opt; 929 int opt;
950 930
951#ifdef SOL_TCP 931#ifdef SOL_TCP
952 opt=SOL_TCP; 932 opt = SOL_TCP;
953#else 933#else
954#ifdef IPPROTO_TCP 934#ifdef IPPROTO_TCP
955 opt=IPPROTO_TCP; 935 opt = IPPROTO_TCP;
956#endif 936#endif
957#endif 937#endif
958 938
959 ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); 939 ret = setsockopt(s, opt, TCP_NODELAY,(char *)&on, sizeof(on));
960#endif 940#endif
961 return(ret == 0); 941 return (ret == 0);
962 } 942}
963 943
964int BIO_socket_nbio(int s, int mode) 944int
965 { 945BIO_socket_nbio(int s, int mode)
966 int ret= -1; 946{
947 int ret = -1;
967 int l; 948 int l;
968 949
969 l=mode; 950 l = mode;
970#ifdef FIONBIO 951#ifdef FIONBIO
971 ret=BIO_socket_ioctl(s,FIONBIO,&l); 952 ret = BIO_socket_ioctl(s, FIONBIO, &l);
972#endif 953#endif
973 return(ret == 0); 954 return (ret == 0);
974 } 955}
975#endif 956#endif
diff --git a/src/lib/libssl/src/crypto/bio/bf_buff.c b/src/lib/libssl/src/crypto/bio/bf_buff.c
index 4b5a132d8a..9518cf977e 100644
--- a/src/lib/libssl/src/crypto/bio/bf_buff.c
+++ b/src/lib/libssl/src/crypto/bio/bf_buff.c
@@ -61,7 +61,7 @@
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include <openssl/bio.h> 62#include <openssl/bio.h>
63 63
64static int buffer_write(BIO *h, const char *buf,int num); 64static int buffer_write(BIO *h, const char *buf, int num);
65static int buffer_read(BIO *h, char *buf, int size); 65static int buffer_read(BIO *h, char *buf, int size);
66static int buffer_puts(BIO *h, const char *str); 66static int buffer_puts(BIO *h, const char *str);
67static int buffer_gets(BIO *h, char *str, int size); 67static int buffer_gets(BIO *h, char *str, int size);
@@ -71,8 +71,7 @@ static int buffer_free(BIO *data);
71static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); 71static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
72#define DEFAULT_BUFFER_SIZE 4096 72#define DEFAULT_BUFFER_SIZE 4096
73 73
74static BIO_METHOD methods_buffer= 74static BIO_METHOD methods_buffer = {
75 {
76 BIO_TYPE_BUFFER, 75 BIO_TYPE_BUFFER,
77 "buffer", 76 "buffer",
78 buffer_write, 77 buffer_write,
@@ -83,430 +82,444 @@ static BIO_METHOD methods_buffer=
83 buffer_new, 82 buffer_new,
84 buffer_free, 83 buffer_free,
85 buffer_callback_ctrl, 84 buffer_callback_ctrl,
86 }; 85};
87 86
88BIO_METHOD *BIO_f_buffer(void) 87BIO_METHOD
89 { 88*BIO_f_buffer(void)
90 return(&methods_buffer); 89{
91 } 90 return (&methods_buffer);
91}
92 92
93static int buffer_new(BIO *bi) 93static int
94 { 94buffer_new(BIO *bi)
95{
95 BIO_F_BUFFER_CTX *ctx; 96 BIO_F_BUFFER_CTX *ctx;
96 97
97 ctx=(BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); 98 ctx = (BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX));
98 if (ctx == NULL) return(0); 99 if (ctx == NULL)
99 ctx->ibuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); 100 return (0);
100 if (ctx->ibuf == NULL) { OPENSSL_free(ctx); return(0); } 101 ctx->ibuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE);
101 ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); 102 if (ctx->ibuf == NULL) {
102 if (ctx->obuf == NULL) { OPENSSL_free(ctx->ibuf); OPENSSL_free(ctx); return(0); } 103 OPENSSL_free(ctx);
103 ctx->ibuf_size=DEFAULT_BUFFER_SIZE; 104 return (0);
104 ctx->obuf_size=DEFAULT_BUFFER_SIZE;
105 ctx->ibuf_len=0;
106 ctx->ibuf_off=0;
107 ctx->obuf_len=0;
108 ctx->obuf_off=0;
109
110 bi->init=1;
111 bi->ptr=(char *)ctx;
112 bi->flags=0;
113 return(1);
114 } 105 }
115 106 ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE);
116static int buffer_free(BIO *a) 107 if (ctx->obuf == NULL) {
117 { 108 OPENSSL_free(ctx->ibuf);
109 OPENSSL_free(ctx);
110 return (0);
111 }
112 ctx->ibuf_size = DEFAULT_BUFFER_SIZE;
113 ctx->obuf_size = DEFAULT_BUFFER_SIZE;
114 ctx->ibuf_len = 0;
115 ctx->ibuf_off = 0;
116 ctx->obuf_len = 0;
117 ctx->obuf_off = 0;
118
119 bi->init = 1;
120 bi->ptr = (char *)ctx;
121 bi->flags = 0;
122 return (1);
123}
124
125static int
126buffer_free(BIO *a)
127{
118 BIO_F_BUFFER_CTX *b; 128 BIO_F_BUFFER_CTX *b;
119 129
120 if (a == NULL) return(0); 130 if (a == NULL)
121 b=(BIO_F_BUFFER_CTX *)a->ptr; 131 return (0);
122 if (b->ibuf != NULL) OPENSSL_free(b->ibuf); 132 b = (BIO_F_BUFFER_CTX *)a->ptr;
123 if (b->obuf != NULL) OPENSSL_free(b->obuf); 133 if (b->ibuf != NULL)
134 OPENSSL_free(b->ibuf);
135 if (b->obuf != NULL)
136 OPENSSL_free(b->obuf);
124 OPENSSL_free(a->ptr); 137 OPENSSL_free(a->ptr);
125 a->ptr=NULL; 138 a->ptr = NULL;
126 a->init=0; 139 a->init = 0;
127 a->flags=0; 140 a->flags = 0;
128 return(1); 141 return (1);
129 } 142}
130 143
131static int buffer_read(BIO *b, char *out, int outl) 144static int
132 { 145buffer_read(BIO *b, char *out, int outl)
133 int i,num=0; 146{
147 int i, num = 0;
134 BIO_F_BUFFER_CTX *ctx; 148 BIO_F_BUFFER_CTX *ctx;
135 149
136 if (out == NULL) return(0); 150 if (out == NULL)
137 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 151 return (0);
152 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
138 153
139 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 154 if ((ctx == NULL) || (b->next_bio == NULL))
140 num=0; 155 return (0);
156 num = 0;
141 BIO_clear_retry_flags(b); 157 BIO_clear_retry_flags(b);
142 158
143start: 159start:
144 i=ctx->ibuf_len; 160 i = ctx->ibuf_len;
145 /* If there is stuff left over, grab it */ 161 /* If there is stuff left over, grab it */
146 if (i != 0) 162 if (i != 0) {
147 { 163 if (i > outl)
148 if (i > outl) i=outl; 164 i = outl;
149 memcpy(out,&(ctx->ibuf[ctx->ibuf_off]),i); 165 memcpy(out, &(ctx->ibuf[ctx->ibuf_off]), i);
150 ctx->ibuf_off+=i; 166 ctx->ibuf_off += i;
151 ctx->ibuf_len-=i; 167 ctx->ibuf_len -= i;
152 num+=i; 168 num += i;
153 if (outl == i) return(num); 169 if (outl == i)
154 outl-=i; 170 return (num);
155 out+=i; 171 outl -= i;
156 } 172 out += i;
173 }
157 174
158 /* We may have done a partial read. try to do more. 175 /* We may have done a partial read. try to do more.
159 * We have nothing in the buffer. 176 * We have nothing in the buffer.
160 * If we get an error and have read some data, just return it 177 * If we get an error and have read some data, just return it
161 * and let them retry to get the error again. 178 * and let them retry to get the error again.
162 * copy direct to parent address space */ 179 * copy direct to parent address space */
163 if (outl > ctx->ibuf_size) 180 if (outl > ctx->ibuf_size) {
164 { 181 for (;;) {
165 for (;;) 182 i = BIO_read(b->next_bio, out, outl);
166 { 183 if (i <= 0) {
167 i=BIO_read(b->next_bio,out,outl);
168 if (i <= 0)
169 {
170 BIO_copy_next_retry(b); 184 BIO_copy_next_retry(b);
171 if (i < 0) return((num > 0)?num:i); 185 if (i < 0)
172 if (i == 0) return(num); 186 return ((num > 0) ? num : i);
173 } 187 if (i == 0)
174 num+=i; 188 return (num);
175 if (outl == i) return(num);
176 out+=i;
177 outl-=i;
178 } 189 }
190 num += i;
191 if (outl == i)
192 return (num);
193 out += i;
194 outl -= i;
179 } 195 }
196 }
180 /* else */ 197 /* else */
181 198
182 /* we are going to be doing some buffering */ 199 /* we are going to be doing some buffering */
183 i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); 200 i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size);
184 if (i <= 0) 201 if (i <= 0) {
185 {
186 BIO_copy_next_retry(b); 202 BIO_copy_next_retry(b);
187 if (i < 0) return((num > 0)?num:i); 203 if (i < 0)
188 if (i == 0) return(num); 204 return ((num > 0) ? num : i);
189 } 205 if (i == 0)
190 ctx->ibuf_off=0; 206 return (num);
191 ctx->ibuf_len=i; 207 }
208 ctx->ibuf_off = 0;
209 ctx->ibuf_len = i;
192 210
193 /* Lets re-read using ourselves :-) */ 211 /* Lets re-read using ourselves :-) */
194 goto start; 212 goto start;
195 } 213}
196 214
197static int buffer_write(BIO *b, const char *in, int inl) 215static int
198 { 216buffer_write(BIO *b, const char *in, int inl)
199 int i,num=0; 217{
218 int i, num = 0;
200 BIO_F_BUFFER_CTX *ctx; 219 BIO_F_BUFFER_CTX *ctx;
201 220
202 if ((in == NULL) || (inl <= 0)) return(0); 221 if ((in == NULL) || (inl <= 0))
203 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 222 return (0);
204 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 223 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
224 if ((ctx == NULL) || (b->next_bio == NULL))
225 return (0);
205 226
206 BIO_clear_retry_flags(b); 227 BIO_clear_retry_flags(b);
207start: 228start:
208 i=ctx->obuf_size-(ctx->obuf_len+ctx->obuf_off); 229 i = ctx->obuf_size - (ctx->obuf_len + ctx->obuf_off);
209 /* add to buffer and return */ 230 /* add to buffer and return */
210 if (i >= inl) 231 if (i >= inl) {
211 { 232 memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, inl);
212 memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl); 233 ctx->obuf_len += inl;
213 ctx->obuf_len+=inl; 234 return (num + inl);
214 return(num+inl); 235 }
215 }
216 /* else */ 236 /* else */
217 /* stuff already in buffer, so add to it first, then flush */ 237 /* stuff already in buffer, so add to it first, then flush */
218 if (ctx->obuf_len != 0) 238 if (ctx->obuf_len != 0) {
219 {
220 if (i > 0) /* lets fill it up if we can */ 239 if (i > 0) /* lets fill it up if we can */
221 { 240 {
222 memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i); 241 memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, i);
223 in+=i; 242 in += i;
224 inl-=i; 243 inl -= i;
225 num+=i; 244 num += i;
226 ctx->obuf_len+=i; 245 ctx->obuf_len += i;
227 } 246 }
228 /* we now have a full buffer needing flushing */ 247 /* we now have a full buffer needing flushing */
229 for (;;) 248 for (;;) {
230 { 249 i = BIO_write(b->next_bio, &(ctx->obuf[ctx->obuf_off]),
231 i=BIO_write(b->next_bio,&(ctx->obuf[ctx->obuf_off]), 250 ctx->obuf_len);
232 ctx->obuf_len); 251 if (i <= 0) {
233 if (i <= 0)
234 {
235 BIO_copy_next_retry(b); 252 BIO_copy_next_retry(b);
236 253
237 if (i < 0) return((num > 0)?num:i); 254 if (i < 0)
238 if (i == 0) return(num); 255 return ((num > 0) ? num : i);
239 } 256 if (i == 0)
240 ctx->obuf_off+=i; 257 return (num);
241 ctx->obuf_len-=i;
242 if (ctx->obuf_len == 0) break;
243 } 258 }
259 ctx->obuf_off += i;
260 ctx->obuf_len -= i;
261 if (ctx->obuf_len == 0)
262 break;
244 } 263 }
264 }
245 /* we only get here if the buffer has been flushed and we 265 /* we only get here if the buffer has been flushed and we
246 * still have stuff to write */ 266 * still have stuff to write */
247 ctx->obuf_off=0; 267 ctx->obuf_off = 0;
248 268
249 /* we now have inl bytes to write */ 269 /* we now have inl bytes to write */
250 while (inl >= ctx->obuf_size) 270 while (inl >= ctx->obuf_size) {
251 { 271 i = BIO_write(b->next_bio, in, inl);
252 i=BIO_write(b->next_bio,in,inl); 272 if (i <= 0) {
253 if (i <= 0)
254 {
255 BIO_copy_next_retry(b); 273 BIO_copy_next_retry(b);
256 if (i < 0) return((num > 0)?num:i); 274 if (i < 0)
257 if (i == 0) return(num); 275 return ((num > 0) ? num : i);
258 } 276 if (i == 0)
259 num+=i; 277 return (num);
260 in+=i;
261 inl-=i;
262 if (inl == 0) return(num);
263 } 278 }
279 num += i;
280 in += i;
281 inl -= i;
282 if (inl == 0)
283 return (num);
284 }
264 285
265 /* copy the rest into the buffer since we have only a small 286 /* copy the rest into the buffer since we have only a small
266 * amount left */ 287 * amount left */
267 goto start; 288 goto start;
268 } 289}
269 290
270static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) 291static long
271 { 292buffer_ctrl(BIO *b, int cmd, long num, void *ptr)
293{
272 BIO *dbio; 294 BIO *dbio;
273 BIO_F_BUFFER_CTX *ctx; 295 BIO_F_BUFFER_CTX *ctx;
274 long ret=1; 296 long ret = 1;
275 char *p1,*p2; 297 char *p1, *p2;
276 int r,i,*ip; 298 int r, i, *ip;
277 int ibs,obs; 299 int ibs, obs;
278 300
279 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 301 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
280 302
281 switch (cmd) 303 switch (cmd) {
282 {
283 case BIO_CTRL_RESET: 304 case BIO_CTRL_RESET:
284 ctx->ibuf_off=0; 305 ctx->ibuf_off = 0;
285 ctx->ibuf_len=0; 306 ctx->ibuf_len = 0;
286 ctx->obuf_off=0; 307 ctx->obuf_off = 0;
287 ctx->obuf_len=0; 308 ctx->obuf_len = 0;
288 if (b->next_bio == NULL) return(0); 309 if (b->next_bio == NULL)
289 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 310 return (0);
311 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
290 break; 312 break;
291 case BIO_CTRL_INFO: 313 case BIO_CTRL_INFO:
292 ret=(long)ctx->obuf_len; 314 ret = (long)ctx->obuf_len;
293 break; 315 break;
294 case BIO_C_GET_BUFF_NUM_LINES: 316 case BIO_C_GET_BUFF_NUM_LINES:
295 ret=0; 317 ret = 0;
296 p1=ctx->ibuf; 318 p1 = ctx->ibuf;
297 for (i=0; i<ctx->ibuf_len; i++) 319 for (i = 0; i < ctx->ibuf_len; i++) {
298 { 320 if (p1[ctx->ibuf_off + i] == '\n')
299 if (p1[ctx->ibuf_off + i] == '\n') ret++; 321 ret++;
300 } 322 }
301 break; 323 break;
302 case BIO_CTRL_WPENDING: 324 case BIO_CTRL_WPENDING:
303 ret=(long)ctx->obuf_len; 325 ret = (long)ctx->obuf_len;
304 if (ret == 0) 326 if (ret == 0) {
305 { 327 if (b->next_bio == NULL)
306 if (b->next_bio == NULL) return(0); 328 return (0);
307 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 329 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
308 } 330 }
309 break; 331 break;
310 case BIO_CTRL_PENDING: 332 case BIO_CTRL_PENDING:
311 ret=(long)ctx->ibuf_len; 333 ret = (long)ctx->ibuf_len;
312 if (ret == 0) 334 if (ret == 0) {
313 { 335 if (b->next_bio == NULL)
314 if (b->next_bio == NULL) return(0); 336 return (0);
315 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 337 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
316 } 338 }
317 break; 339 break;
318 case BIO_C_SET_BUFF_READ_DATA: 340 case BIO_C_SET_BUFF_READ_DATA:
319 if (num > ctx->ibuf_size) 341 if (num > ctx->ibuf_size) {
320 { 342 p1 = OPENSSL_malloc((int)num);
321 p1=OPENSSL_malloc((int)num); 343 if (p1 == NULL)
322 if (p1 == NULL) goto malloc_error; 344 goto malloc_error;
323 if (ctx->ibuf != NULL) OPENSSL_free(ctx->ibuf); 345 if (ctx->ibuf != NULL)
324 ctx->ibuf=p1; 346 OPENSSL_free(ctx->ibuf);
325 } 347 ctx->ibuf = p1;
326 ctx->ibuf_off=0; 348 }
327 ctx->ibuf_len=(int)num; 349 ctx->ibuf_off = 0;
328 memcpy(ctx->ibuf,ptr,(int)num); 350 ctx->ibuf_len = (int)num;
329 ret=1; 351 memcpy(ctx->ibuf, ptr,(int)num);
352 ret = 1;
330 break; 353 break;
331 case BIO_C_SET_BUFF_SIZE: 354 case BIO_C_SET_BUFF_SIZE:
332 if (ptr != NULL) 355 if (ptr != NULL) {
333 { 356 ip = (int *)ptr;
334 ip=(int *)ptr; 357 if (*ip == 0) {
335 if (*ip == 0) 358 ibs = (int)num;
336 { 359 obs = ctx->obuf_size;
337 ibs=(int)num;
338 obs=ctx->obuf_size;
339 }
340 else /* if (*ip == 1) */
341 {
342 ibs=ctx->ibuf_size;
343 obs=(int)num;
344 }
345 }
346 else
347 {
348 ibs=(int)num;
349 obs=(int)num;
350 } 360 }
351 p1=ctx->ibuf; 361 else /* if (*ip == 1) */
352 p2=ctx->obuf;
353 if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size))
354 { 362 {
355 p1=(char *)OPENSSL_malloc((int)num); 363 ibs = ctx->ibuf_size;
356 if (p1 == NULL) goto malloc_error; 364 obs = (int)num;
357 } 365 }
358 if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) 366 } else {
359 { 367 ibs = (int)num;
360 p2=(char *)OPENSSL_malloc((int)num); 368 obs = (int)num;
361 if (p2 == NULL) 369 }
362 { 370 p1 = ctx->ibuf;
363 if (p1 != ctx->ibuf) OPENSSL_free(p1); 371 p2 = ctx->obuf;
372 if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) {
373 p1 = (char *)OPENSSL_malloc((int)num);
374 if (p1 == NULL)
375 goto malloc_error;
376 }
377 if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) {
378 p2 = (char *)OPENSSL_malloc((int)num);
379 if (p2 == NULL) {
380 if (p1 != ctx->ibuf)
381 OPENSSL_free(p1);
364 goto malloc_error; 382 goto malloc_error;
365 }
366 } 383 }
367 if (ctx->ibuf != p1) 384 }
368 { 385 if (ctx->ibuf != p1) {
369 OPENSSL_free(ctx->ibuf); 386 OPENSSL_free(ctx->ibuf);
370 ctx->ibuf=p1; 387 ctx->ibuf = p1;
371 ctx->ibuf_off=0; 388 ctx->ibuf_off = 0;
372 ctx->ibuf_len=0; 389 ctx->ibuf_len = 0;
373 ctx->ibuf_size=ibs; 390 ctx->ibuf_size = ibs;
374 } 391 }
375 if (ctx->obuf != p2) 392 if (ctx->obuf != p2) {
376 {
377 OPENSSL_free(ctx->obuf); 393 OPENSSL_free(ctx->obuf);
378 ctx->obuf=p2; 394 ctx->obuf = p2;
379 ctx->obuf_off=0; 395 ctx->obuf_off = 0;
380 ctx->obuf_len=0; 396 ctx->obuf_len = 0;
381 ctx->obuf_size=obs; 397 ctx->obuf_size = obs;
382 } 398 }
383 break; 399 break;
384 case BIO_C_DO_STATE_MACHINE: 400 case BIO_C_DO_STATE_MACHINE:
385 if (b->next_bio == NULL) return(0); 401 if (b->next_bio == NULL)
402 return (0);
386 BIO_clear_retry_flags(b); 403 BIO_clear_retry_flags(b);
387 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 404 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
388 BIO_copy_next_retry(b); 405 BIO_copy_next_retry(b);
389 break; 406 break;
390 407
391 case BIO_CTRL_FLUSH: 408 case BIO_CTRL_FLUSH:
392 if (b->next_bio == NULL) return(0); 409 if (b->next_bio == NULL)
393 if (ctx->obuf_len <= 0) 410 return (0);
394 { 411 if (ctx->obuf_len <= 0) {
395 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 412 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
396 break; 413 break;
397 } 414 }
398 415
399 for (;;) 416 for (;;) {
400 {
401 BIO_clear_retry_flags(b); 417 BIO_clear_retry_flags(b);
402 if (ctx->obuf_len > 0) 418 if (ctx->obuf_len > 0) {
403 { 419 r = BIO_write(b->next_bio,
404 r=BIO_write(b->next_bio, 420 &(ctx->obuf[ctx->obuf_off]),
405 &(ctx->obuf[ctx->obuf_off]), 421 ctx->obuf_len);
406 ctx->obuf_len);
407#if 0 422#if 0
408fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r); 423 fprintf(stderr, "FLUSH [%3d] %3d -> %3d\n", ctx->obuf_off, ctx->obuf_len, r);
409#endif 424#endif
410 BIO_copy_next_retry(b); 425 BIO_copy_next_retry(b);
411 if (r <= 0) return((long)r); 426 if (r <= 0)
412 ctx->obuf_off+=r; 427 return ((long)r);
413 ctx->obuf_len-=r; 428 ctx->obuf_off += r;
414 } 429 ctx->obuf_len -= r;
415 else 430 } else {
416 { 431 ctx->obuf_len = 0;
417 ctx->obuf_len=0; 432 ctx->obuf_off = 0;
418 ctx->obuf_off=0; 433 ret = 1;
419 ret=1;
420 break; 434 break;
421 }
422 } 435 }
423 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 436 }
437 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
424 break; 438 break;
425 case BIO_CTRL_DUP: 439 case BIO_CTRL_DUP:
426 dbio=(BIO *)ptr; 440 dbio = (BIO *)ptr;
427 if ( !BIO_set_read_buffer_size(dbio,ctx->ibuf_size) || 441 if (!BIO_set_read_buffer_size(dbio, ctx->ibuf_size) ||
428 !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) 442 !BIO_set_write_buffer_size(dbio, ctx->obuf_size))
429 ret=0; 443 ret = 0;
430 break; 444 break;
431 default: 445 default:
432 if (b->next_bio == NULL) return(0); 446 if (b->next_bio == NULL)
433 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 447 return (0);
448 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
434 break; 449 break;
435 }
436 return(ret);
437malloc_error:
438 BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE);
439 return(0);
440 } 450 }
441 451 return (ret);
442static long buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 452malloc_error:
443 { 453 BIOerr(BIO_F_BUFFER_CTRL, ERR_R_MALLOC_FAILURE);
444 long ret=1; 454 return (0);
445 455}
446 if (b->next_bio == NULL) return(0); 456
447 switch (cmd) 457static long
448 { 458buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
459{
460 long ret = 1;
461
462 if (b->next_bio == NULL)
463 return (0);
464 switch (cmd) {
449 default: 465 default:
450 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 466 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
451 break; 467 break;
452 }
453 return(ret);
454 } 468 }
469 return (ret);
470}
455 471
456static int buffer_gets(BIO *b, char *buf, int size) 472static int
457 { 473buffer_gets(BIO *b, char *buf, int size)
474{
458 BIO_F_BUFFER_CTX *ctx; 475 BIO_F_BUFFER_CTX *ctx;
459 int num=0,i,flag; 476 int num = 0, i, flag;
460 char *p; 477 char *p;
461 478
462 ctx=(BIO_F_BUFFER_CTX *)b->ptr; 479 ctx = (BIO_F_BUFFER_CTX *)b->ptr;
463 size--; /* reserve space for a '\0' */ 480 size--; /* reserve space for a '\0' */
464 BIO_clear_retry_flags(b); 481 BIO_clear_retry_flags(b);
465 482
466 for (;;) 483 for (;;) {
467 { 484 if (ctx->ibuf_len > 0) {
468 if (ctx->ibuf_len > 0) 485 p = &(ctx->ibuf[ctx->ibuf_off]);
469 { 486 flag = 0;
470 p= &(ctx->ibuf[ctx->ibuf_off]); 487 for (i = 0; (i < ctx->ibuf_len) && (i < size); i++) {
471 flag=0; 488 *(buf++) = p[i];
472 for (i=0; (i<ctx->ibuf_len) && (i<size); i++) 489 if (p[i] == '\n') {
473 { 490 flag = 1;
474 *(buf++)=p[i];
475 if (p[i] == '\n')
476 {
477 flag=1;
478 i++; 491 i++;
479 break; 492 break;
480 }
481 }
482 num+=i;
483 size-=i;
484 ctx->ibuf_len-=i;
485 ctx->ibuf_off+=i;
486 if (flag || size == 0)
487 {
488 *buf='\0';
489 return(num);
490 } 493 }
491 } 494 }
495 num += i;
496 size -= i;
497 ctx->ibuf_len -= i;
498 ctx->ibuf_off += i;
499 if (flag || size == 0) {
500 *buf = '\0';
501 return (num);
502 }
503 }
492 else /* read another chunk */ 504 else /* read another chunk */
493 { 505 {
494 i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); 506 i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size);
495 if (i <= 0) 507 if (i <= 0) {
496 {
497 BIO_copy_next_retry(b); 508 BIO_copy_next_retry(b);
498 *buf='\0'; 509 *buf = '\0';
499 if (i < 0) return((num > 0)?num:i); 510 if (i < 0)
500 if (i == 0) return(num); 511 return ((num > 0) ? num : i);
501 } 512 if (i == 0)
502 ctx->ibuf_len=i; 513 return (num);
503 ctx->ibuf_off=0;
504 } 514 }
515 ctx->ibuf_len = i;
516 ctx->ibuf_off = 0;
505 } 517 }
506 } 518 }
519}
507 520
508static int buffer_puts(BIO *b, const char *str) 521static int
509 { 522buffer_puts(BIO *b, const char *str)
510 return(buffer_write(b,str,strlen(str))); 523{
511 } 524 return (buffer_write(b, str, strlen(str)));
512 525}
diff --git a/src/lib/libssl/src/crypto/bio/bf_lbuf.c b/src/lib/libssl/src/crypto/bio/bf_lbuf.c
index ec0f7eb0b7..838839f1bf 100644
--- a/src/lib/libssl/src/crypto/bio/bf_lbuf.c
+++ b/src/lib/libssl/src/crypto/bio/bf_lbuf.c
@@ -62,7 +62,7 @@
62#include <openssl/bio.h> 62#include <openssl/bio.h>
63#include <openssl/evp.h> 63#include <openssl/evp.h>
64 64
65static int linebuffer_write(BIO *h, const char *buf,int num); 65static int linebuffer_write(BIO *h, const char *buf, int num);
66static int linebuffer_read(BIO *h, char *buf, int size); 66static int linebuffer_read(BIO *h, char *buf, int size);
67static int linebuffer_puts(BIO *h, const char *str); 67static int linebuffer_puts(BIO *h, const char *str);
68static int linebuffer_gets(BIO *h, char *str, int size); 68static int linebuffer_gets(BIO *h, char *str, int size);
@@ -76,8 +76,7 @@ static long linebuffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
76 76
77/* #define DEBUG */ 77/* #define DEBUG */
78 78
79static BIO_METHOD methods_linebuffer= 79static BIO_METHOD methods_linebuffer = {
80 {
81 BIO_TYPE_LINEBUFFER, 80 BIO_TYPE_LINEBUFFER,
82 "linebuffer", 81 "linebuffer",
83 linebuffer_write, 82 linebuffer_write,
@@ -88,310 +87,313 @@ static BIO_METHOD methods_linebuffer=
88 linebuffer_new, 87 linebuffer_new,
89 linebuffer_free, 88 linebuffer_free,
90 linebuffer_callback_ctrl, 89 linebuffer_callback_ctrl,
91 }; 90};
92 91
93BIO_METHOD *BIO_f_linebuffer(void) 92BIO_METHOD
94 { 93*BIO_f_linebuffer(void)
95 return(&methods_linebuffer); 94{
96 } 95 return (&methods_linebuffer);
96}
97 97
98typedef struct bio_linebuffer_ctx_struct 98typedef struct bio_linebuffer_ctx_struct {
99 {
100 char *obuf; /* the output char array */ 99 char *obuf; /* the output char array */
101 int obuf_size; /* how big is the output buffer */ 100 int obuf_size; /* how big is the output buffer */
102 int obuf_len; /* how many bytes are in it */ 101 int obuf_len; /* how many bytes are in it */
103 } BIO_LINEBUFFER_CTX; 102} BIO_LINEBUFFER_CTX;
104 103
105static int linebuffer_new(BIO *bi) 104static int
106 { 105linebuffer_new(BIO *bi)
106{
107 BIO_LINEBUFFER_CTX *ctx; 107 BIO_LINEBUFFER_CTX *ctx;
108 108
109 ctx=(BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); 109 ctx = (BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX));
110 if (ctx == NULL) return(0); 110 if (ctx == NULL)
111 ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); 111 return (0);
112 if (ctx->obuf == NULL) { OPENSSL_free(ctx); return(0); } 112 ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE);
113 ctx->obuf_size=DEFAULT_LINEBUFFER_SIZE; 113 if (ctx->obuf == NULL) {
114 ctx->obuf_len=0; 114 OPENSSL_free(ctx);
115 115 return (0);
116 bi->init=1;
117 bi->ptr=(char *)ctx;
118 bi->flags=0;
119 return(1);
120 } 116 }
117 ctx->obuf_size = DEFAULT_LINEBUFFER_SIZE;
118 ctx->obuf_len = 0;
119
120 bi->init = 1;
121 bi->ptr = (char *)ctx;
122 bi->flags = 0;
123 return (1);
124}
121 125
122static int linebuffer_free(BIO *a) 126static int
123 { 127linebuffer_free(BIO *a)
128{
124 BIO_LINEBUFFER_CTX *b; 129 BIO_LINEBUFFER_CTX *b;
125 130
126 if (a == NULL) return(0); 131 if (a == NULL)
127 b=(BIO_LINEBUFFER_CTX *)a->ptr; 132 return (0);
128 if (b->obuf != NULL) OPENSSL_free(b->obuf); 133 b = (BIO_LINEBUFFER_CTX *)a->ptr;
134 if (b->obuf != NULL)
135 OPENSSL_free(b->obuf);
129 OPENSSL_free(a->ptr); 136 OPENSSL_free(a->ptr);
130 a->ptr=NULL; 137 a->ptr = NULL;
131 a->init=0; 138 a->init = 0;
132 a->flags=0; 139 a->flags = 0;
133 return(1); 140 return (1);
134 } 141}
135 142
136static int linebuffer_read(BIO *b, char *out, int outl) 143static int
137 { 144linebuffer_read(BIO *b, char *out, int outl)
138 int ret=0; 145{
139 146 int ret = 0;
140 if (out == NULL) return(0); 147
141 if (b->next_bio == NULL) return(0); 148 if (out == NULL)
142 ret=BIO_read(b->next_bio,out,outl); 149 return (0);
150 if (b->next_bio == NULL)
151 return (0);
152 ret = BIO_read(b->next_bio, out, outl);
143 BIO_clear_retry_flags(b); 153 BIO_clear_retry_flags(b);
144 BIO_copy_next_retry(b); 154 BIO_copy_next_retry(b);
145 return(ret); 155 return (ret);
146 } 156}
147 157
148static int linebuffer_write(BIO *b, const char *in, int inl) 158static int
149 { 159linebuffer_write(BIO *b, const char *in, int inl)
150 int i,num=0,foundnl; 160{
161 int i, num = 0, foundnl;
151 BIO_LINEBUFFER_CTX *ctx; 162 BIO_LINEBUFFER_CTX *ctx;
152 163
153 if ((in == NULL) || (inl <= 0)) return(0); 164 if ((in == NULL) || (inl <= 0))
154 ctx=(BIO_LINEBUFFER_CTX *)b->ptr; 165 return (0);
155 if ((ctx == NULL) || (b->next_bio == NULL)) return(0); 166 ctx = (BIO_LINEBUFFER_CTX *)b->ptr;
167 if ((ctx == NULL) || (b->next_bio == NULL))
168 return (0);
156 169
157 BIO_clear_retry_flags(b); 170 BIO_clear_retry_flags(b);
158 171
159 do 172 do {
160 {
161 const char *p; 173 const char *p;
162 174
163 for(p = in; p < in + inl && *p != '\n'; p++) 175 for (p = in; p < in + inl && *p != '\n'; p++)
164 ; 176 ;
165 if (*p == '\n') 177 if (*p == '\n') {
166 {
167 p++; 178 p++;
168 foundnl = 1; 179 foundnl = 1;
169 } 180 } else
170 else
171 foundnl = 0; 181 foundnl = 0;
172 182
173 /* If a NL was found and we already have text in the save 183 /* If a NL was found and we already have text in the save
174 buffer, concatenate them and write */ 184 buffer, concatenate them and write */
175 while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) 185 while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) &&
176 && ctx->obuf_len > 0) 186 ctx->obuf_len > 0) {
177 {
178 int orig_olen = ctx->obuf_len; 187 int orig_olen = ctx->obuf_len;
179 188
180 i = ctx->obuf_size - ctx->obuf_len; 189 i = ctx->obuf_size - ctx->obuf_len;
181 if (p - in > 0) 190 if (p - in > 0) {
182 { 191 if (i >= p - in) {
183 if (i >= p - in)
184 {
185 memcpy(&(ctx->obuf[ctx->obuf_len]), 192 memcpy(&(ctx->obuf[ctx->obuf_len]),
186 in,p - in); 193 in, p - in);
187 ctx->obuf_len += p - in; 194 ctx->obuf_len += p - in;
188 inl -= p - in; 195 inl -= p - in;
189 num += p - in; 196 num += p - in;
190 in = p; 197 in = p;
191 } 198 } else {
192 else
193 {
194 memcpy(&(ctx->obuf[ctx->obuf_len]), 199 memcpy(&(ctx->obuf[ctx->obuf_len]),
195 in,i); 200 in, i);
196 ctx->obuf_len += i; 201 ctx->obuf_len += i;
197 inl -= i; 202 inl -= i;
198 in += i; 203 in += i;
199 num += i; 204 num += i;
200 }
201 } 205 }
206 }
202 207
203#if 0 208#if 0
204BIO_write(b->next_bio, "<*<", 3); 209 BIO_write(b->next_bio, "<*<", 3);
205#endif 210#endif
206 i=BIO_write(b->next_bio, 211 i = BIO_write(b->next_bio, ctx->obuf, ctx->obuf_len);
207 ctx->obuf, ctx->obuf_len); 212 if (i <= 0) {
208 if (i <= 0)
209 {
210 ctx->obuf_len = orig_olen; 213 ctx->obuf_len = orig_olen;
211 BIO_copy_next_retry(b); 214 BIO_copy_next_retry(b);
212
213#if 0 215#if 0
214BIO_write(b->next_bio, ">*>", 3); 216 BIO_write(b->next_bio, ">*>", 3);
215#endif 217#endif
216 if (i < 0) return((num > 0)?num:i); 218 if (i < 0)
217 if (i == 0) return(num); 219 return ((num > 0) ? num : i);
218 } 220 if (i == 0)
221 return (num);
222 }
219#if 0 223#if 0
220BIO_write(b->next_bio, ">*>", 3); 224 BIO_write(b->next_bio, ">*>", 3);
221#endif 225#endif
222 if (i < ctx->obuf_len) 226 if (i < ctx->obuf_len)
223 memmove(ctx->obuf, ctx->obuf + i, 227 memmove(ctx->obuf, ctx->obuf + i,
224 ctx->obuf_len - i); 228 ctx->obuf_len - i);
225 ctx->obuf_len-=i; 229 ctx->obuf_len -= i;
226 } 230 }
227 231
228 /* Now that the save buffer is emptied, let's write the input 232 /* Now that the save buffer is emptied, let's write the input
229 buffer if a NL was found and there is anything to write. */ 233 buffer if a NL was found and there is anything to write. */
230 if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) 234 if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) {
231 {
232#if 0 235#if 0
233BIO_write(b->next_bio, "<*<", 3); 236 BIO_write(b->next_bio, "<*<", 3);
234#endif 237#endif
235 i=BIO_write(b->next_bio,in,p - in); 238 i = BIO_write(b->next_bio, in, p - in);
236 if (i <= 0) 239 if (i <= 0) {
237 {
238 BIO_copy_next_retry(b); 240 BIO_copy_next_retry(b);
239#if 0 241#if 0
240BIO_write(b->next_bio, ">*>", 3); 242 BIO_write(b->next_bio, ">*>", 3);
241#endif 243#endif
242 if (i < 0) return((num > 0)?num:i); 244 if (i < 0)
243 if (i == 0) return(num); 245 return ((num > 0) ? num : i);
244 } 246 if (i == 0)
247 return (num);
248 }
245#if 0 249#if 0
246BIO_write(b->next_bio, ">*>", 3); 250 BIO_write(b->next_bio, ">*>", 3);
247#endif 251#endif
248 num+=i; 252 num += i;
249 in+=i; 253 in += i;
250 inl-=i; 254 inl -= i;
251 }
252 } 255 }
253 while(foundnl && inl > 0); 256 } while (foundnl && inl > 0);
254 /* We've written as much as we can. The rest of the input buffer, if 257 /* We've written as much as we can. The rest of the input buffer, if
255 any, is text that doesn't and with a NL and therefore needs to be 258 any, is text that doesn't and with a NL and therefore needs to be
256 saved for the next trip. */ 259 saved for the next trip. */
257 if (inl > 0) 260 if (inl > 0) {
258 {
259 memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); 261 memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl);
260 ctx->obuf_len += inl; 262 ctx->obuf_len += inl;
261 num += inl; 263 num += inl;
262 }
263 return num;
264 } 264 }
265 return num;
266}
265 267
266static long linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) 268static long
267 { 269linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr)
270{
268 BIO *dbio; 271 BIO *dbio;
269 BIO_LINEBUFFER_CTX *ctx; 272 BIO_LINEBUFFER_CTX *ctx;
270 long ret=1; 273 long ret = 1;
271 char *p; 274 char *p;
272 int r; 275 int r;
273 int obs; 276 int obs;
274 277
275 ctx=(BIO_LINEBUFFER_CTX *)b->ptr; 278 ctx = (BIO_LINEBUFFER_CTX *)b->ptr;
276 279
277 switch (cmd) 280 switch (cmd) {
278 {
279 case BIO_CTRL_RESET: 281 case BIO_CTRL_RESET:
280 ctx->obuf_len=0; 282 ctx->obuf_len = 0;
281 if (b->next_bio == NULL) return(0); 283 if (b->next_bio == NULL)
282 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 284 return (0);
285 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
283 break; 286 break;
284 case BIO_CTRL_INFO: 287 case BIO_CTRL_INFO:
285 ret=(long)ctx->obuf_len; 288 ret = (long)ctx->obuf_len;
286 break; 289 break;
287 case BIO_CTRL_WPENDING: 290 case BIO_CTRL_WPENDING:
288 ret=(long)ctx->obuf_len; 291 ret = (long)ctx->obuf_len;
289 if (ret == 0) 292 if (ret == 0) {
290 { 293 if (b->next_bio == NULL)
291 if (b->next_bio == NULL) return(0); 294 return (0);
292 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 295 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
293 } 296 }
294 break; 297 break;
295 case BIO_C_SET_BUFF_SIZE: 298 case BIO_C_SET_BUFF_SIZE:
296 obs=(int)num; 299 obs = (int)num;
297 p=ctx->obuf; 300 p = ctx->obuf;
298 if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) 301 if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) {
299 { 302 p = (char *)OPENSSL_malloc((int)num);
300 p=(char *)OPENSSL_malloc((int)num);
301 if (p == NULL) 303 if (p == NULL)
302 goto malloc_error; 304 goto malloc_error;
303 } 305 }
304 if (ctx->obuf != p) 306 if (ctx->obuf != p) {
305 { 307 if (ctx->obuf_len > obs) {
306 if (ctx->obuf_len > obs)
307 {
308 ctx->obuf_len = obs; 308 ctx->obuf_len = obs;
309 } 309 }
310 memcpy(p, ctx->obuf, ctx->obuf_len); 310 memcpy(p, ctx->obuf, ctx->obuf_len);
311 OPENSSL_free(ctx->obuf); 311 OPENSSL_free(ctx->obuf);
312 ctx->obuf=p; 312 ctx->obuf = p;
313 ctx->obuf_size=obs; 313 ctx->obuf_size = obs;
314 } 314 }
315 break; 315 break;
316 case BIO_C_DO_STATE_MACHINE: 316 case BIO_C_DO_STATE_MACHINE:
317 if (b->next_bio == NULL) return(0); 317 if (b->next_bio == NULL)
318 return (0);
318 BIO_clear_retry_flags(b); 319 BIO_clear_retry_flags(b);
319 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 320 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
320 BIO_copy_next_retry(b); 321 BIO_copy_next_retry(b);
321 break; 322 break;
322 323
323 case BIO_CTRL_FLUSH: 324 case BIO_CTRL_FLUSH:
324 if (b->next_bio == NULL) return(0); 325 if (b->next_bio == NULL)
325 if (ctx->obuf_len <= 0) 326 return (0);
326 { 327 if (ctx->obuf_len <= 0) {
327 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 328 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
328 break; 329 break;
329 } 330 }
330 331
331 for (;;) 332 for (;;) {
332 {
333 BIO_clear_retry_flags(b); 333 BIO_clear_retry_flags(b);
334 if (ctx->obuf_len > 0) 334 if (ctx->obuf_len > 0) {
335 { 335 r = BIO_write(b->next_bio,
336 r=BIO_write(b->next_bio, 336 ctx->obuf, ctx->obuf_len);
337 ctx->obuf, ctx->obuf_len);
338#if 0 337#if 0
339fprintf(stderr,"FLUSH %3d -> %3d\n",ctx->obuf_len,r); 338 fprintf(stderr, "FLUSH %3d -> %3d\n", ctx->obuf_len, r);
340#endif 339#endif
341 BIO_copy_next_retry(b); 340 BIO_copy_next_retry(b);
342 if (r <= 0) return((long)r); 341 if (r <= 0)
342 return ((long)r);
343 if (r < ctx->obuf_len) 343 if (r < ctx->obuf_len)
344 memmove(ctx->obuf, ctx->obuf + r, 344 memmove(ctx->obuf, ctx->obuf + r,
345 ctx->obuf_len - r); 345 ctx->obuf_len - r);
346 ctx->obuf_len-=r; 346 ctx->obuf_len -= r;
347 } 347 } else {
348 else 348 ctx->obuf_len = 0;
349 { 349 ret = 1;
350 ctx->obuf_len=0;
351 ret=1;
352 break; 350 break;
353 }
354 } 351 }
355 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 352 }
353 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
356 break; 354 break;
357 case BIO_CTRL_DUP: 355 case BIO_CTRL_DUP:
358 dbio=(BIO *)ptr; 356 dbio = (BIO *)ptr;
359 if ( !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) 357 if (!BIO_set_write_buffer_size(dbio, ctx->obuf_size))
360 ret=0; 358 ret = 0;
361 break; 359 break;
362 default: 360 default:
363 if (b->next_bio == NULL) return(0); 361 if (b->next_bio == NULL)
364 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 362 return (0);
363 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
365 break; 364 break;
366 }
367 return(ret);
368malloc_error:
369 BIOerr(BIO_F_LINEBUFFER_CTRL,ERR_R_MALLOC_FAILURE);
370 return(0);
371 } 365 }
366 return (ret);
367malloc_error:
368 BIOerr(BIO_F_LINEBUFFER_CTRL, ERR_R_MALLOC_FAILURE);
369 return (0);
370}
372 371
373static long linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 372static long
374 { 373linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
375 long ret=1; 374{
375 long ret = 1;
376 376
377 if (b->next_bio == NULL) return(0); 377 if (b->next_bio == NULL)
378 switch (cmd) 378 return (0);
379 { 379 switch (cmd) {
380 default: 380 default:
381 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 381 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
382 break; 382 break;
383 }
384 return(ret);
385 } 383 }
384 return (ret);
385}
386 386
387static int linebuffer_gets(BIO *b, char *buf, int size) 387static int
388 { 388linebuffer_gets(BIO *b, char *buf, int size)
389 if (b->next_bio == NULL) return(0); 389{
390 return(BIO_gets(b->next_bio,buf,size)); 390 if (b->next_bio == NULL)
391 } 391 return (0);
392 392 return (BIO_gets(b->next_bio, buf, size));
393static int linebuffer_puts(BIO *b, const char *str) 393}
394 {
395 return(linebuffer_write(b,str,strlen(str)));
396 }
397 394
395static int
396linebuffer_puts(BIO *b, const char *str)
397{
398 return (linebuffer_write(b, str, strlen(str)));
399}
diff --git a/src/lib/libssl/src/crypto/bio/bf_nbio.c b/src/lib/libssl/src/crypto/bio/bf_nbio.c
index 028616c064..76f8f31950 100644
--- a/src/lib/libssl/src/crypto/bio/bf_nbio.c
+++ b/src/lib/libssl/src/crypto/bio/bf_nbio.c
@@ -65,23 +65,22 @@
65/* BIO_put and BIO_get both add to the digest, 65/* BIO_put and BIO_get both add to the digest,
66 * BIO_gets returns the digest */ 66 * BIO_gets returns the digest */
67 67
68static int nbiof_write(BIO *h,const char *buf,int num); 68static int nbiof_write(BIO *h, const char *buf, int num);
69static int nbiof_read(BIO *h,char *buf,int size); 69static int nbiof_read(BIO *h, char *buf, int size);
70static int nbiof_puts(BIO *h,const char *str); 70static int nbiof_puts(BIO *h, const char *str);
71static int nbiof_gets(BIO *h,char *str,int size); 71static int nbiof_gets(BIO *h, char *str, int size);
72static long nbiof_ctrl(BIO *h,int cmd,long arg1,void *arg2); 72static long nbiof_ctrl(BIO *h, int cmd, long arg1, void *arg2);
73static int nbiof_new(BIO *h); 73static int nbiof_new(BIO *h);
74static int nbiof_free(BIO *data); 74static int nbiof_free(BIO *data);
75static long nbiof_callback_ctrl(BIO *h,int cmd,bio_info_cb *fp); 75static long nbiof_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
76typedef struct nbio_test_st 76
77 { 77typedef struct nbio_test_st {
78 /* only set if we sent a 'should retry' error */ 78 /* only set if we sent a 'should retry' error */
79 int lrn; 79 int lrn;
80 int lwn; 80 int lwn;
81 } NBIO_TEST; 81} NBIO_TEST;
82 82
83static BIO_METHOD methods_nbiof= 83static BIO_METHOD methods_nbiof = {
84 {
85 BIO_TYPE_NBIO_TEST, 84 BIO_TYPE_NBIO_TEST,
86 "non-blocking IO test filter", 85 "non-blocking IO test filter",
87 nbiof_write, 86 nbiof_write,
@@ -92,162 +91,170 @@ static BIO_METHOD methods_nbiof=
92 nbiof_new, 91 nbiof_new,
93 nbiof_free, 92 nbiof_free,
94 nbiof_callback_ctrl, 93 nbiof_callback_ctrl,
95 }; 94};
96 95
97BIO_METHOD *BIO_f_nbio_test(void) 96BIO_METHOD
98 { 97*BIO_f_nbio_test(void)
99 return(&methods_nbiof); 98{
100 } 99 return (&methods_nbiof);
100}
101 101
102static int nbiof_new(BIO *bi) 102static int
103 { 103nbiof_new(BIO *bi)
104{
104 NBIO_TEST *nt; 105 NBIO_TEST *nt;
105 106
106 if (!(nt=(NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) return(0); 107 if (!(nt = (NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST))))
107 nt->lrn= -1; 108 return (0);
108 nt->lwn= -1; 109 nt->lrn = -1;
109 bi->ptr=(char *)nt; 110 nt->lwn = -1;
110 bi->init=1; 111 bi->ptr = (char *)nt;
111 bi->flags=0; 112 bi->init = 1;
112 return(1); 113 bi->flags = 0;
113 } 114 return (1);
115}
114 116
115static int nbiof_free(BIO *a) 117static int
116 { 118nbiof_free(BIO *a)
117 if (a == NULL) return(0); 119{
120 if (a == NULL)
121 return (0);
118 if (a->ptr != NULL) 122 if (a->ptr != NULL)
119 OPENSSL_free(a->ptr); 123 OPENSSL_free(a->ptr);
120 a->ptr=NULL; 124 a->ptr = NULL;
121 a->init=0; 125 a->init = 0;
122 a->flags=0; 126 a->flags = 0;
123 return(1); 127 return (1);
124 } 128}
125 129
126static int nbiof_read(BIO *b, char *out, int outl) 130static int
127 { 131nbiof_read(BIO *b, char *out, int outl)
128 int ret=0; 132{
133 int ret = 0;
129#if 1 134#if 1
130 int num; 135 int num;
131 unsigned char n; 136 unsigned char n;
132#endif 137#endif
133 138
134 if (out == NULL) return(0); 139 if (out == NULL)
135 if (b->next_bio == NULL) return(0); 140 return (0);
141 if (b->next_bio == NULL)
142 return (0);
136 143
137 BIO_clear_retry_flags(b); 144 BIO_clear_retry_flags(b);
138#if 1 145#if 1
139 RAND_pseudo_bytes(&n,1); 146 RAND_pseudo_bytes(&n, 1);
140 num=(n&0x07); 147 num = (n & 0x07);
141 148
142 if (outl > num) outl=num; 149 if (outl > num)
150 outl = num;
143 151
144 if (num == 0) 152 if (num == 0) {
145 { 153 ret = -1;
146 ret= -1;
147 BIO_set_retry_read(b); 154 BIO_set_retry_read(b);
148 } 155 } else
149 else
150#endif 156#endif
151 { 157 {
152 ret=BIO_read(b->next_bio,out,outl); 158 ret = BIO_read(b->next_bio, out, outl);
153 if (ret < 0) 159 if (ret < 0)
154 BIO_copy_next_retry(b); 160 BIO_copy_next_retry(b);
155 }
156 return(ret);
157 } 161 }
162 return (ret);
163}
158 164
159static int nbiof_write(BIO *b, const char *in, int inl) 165static int
160 { 166nbiof_write(BIO *b, const char *in, int inl)
167{
161 NBIO_TEST *nt; 168 NBIO_TEST *nt;
162 int ret=0; 169 int ret = 0;
163 int num; 170 int num;
164 unsigned char n; 171 unsigned char n;
165 172
166 if ((in == NULL) || (inl <= 0)) return(0); 173 if ((in == NULL) || (inl <= 0))
167 if (b->next_bio == NULL) return(0); 174 return (0);
168 nt=(NBIO_TEST *)b->ptr; 175 if (b->next_bio == NULL)
176 return (0);
177 nt = (NBIO_TEST *)b->ptr;
169 178
170 BIO_clear_retry_flags(b); 179 BIO_clear_retry_flags(b);
171 180
172#if 1 181#if 1
173 if (nt->lwn > 0) 182 if (nt->lwn > 0) {
174 { 183 num = nt->lwn;
175 num=nt->lwn; 184 nt->lwn = 0;
176 nt->lwn=0; 185 } else {
177 } 186 RAND_pseudo_bytes(&n, 1);
178 else 187 num = (n&7);
179 { 188 }
180 RAND_pseudo_bytes(&n,1);
181 num=(n&7);
182 }
183 189
184 if (inl > num) inl=num; 190 if (inl > num)
191 inl = num;
185 192
186 if (num == 0) 193 if (num == 0) {
187 { 194 ret = -1;
188 ret= -1;
189 BIO_set_retry_write(b); 195 BIO_set_retry_write(b);
190 } 196 } else
191 else
192#endif 197#endif
193 { 198 {
194 ret=BIO_write(b->next_bio,in,inl); 199 ret = BIO_write(b->next_bio, in, inl);
195 if (ret < 0) 200 if (ret < 0) {
196 {
197 BIO_copy_next_retry(b); 201 BIO_copy_next_retry(b);
198 nt->lwn=inl; 202 nt->lwn = inl;
199 }
200 } 203 }
201 return(ret);
202 } 204 }
205 return (ret);
206}
203 207
204static long nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) 208static long
205 { 209nbiof_ctrl(BIO *b, int cmd, long num, void *ptr)
210{
206 long ret; 211 long ret;
207 212
208 if (b->next_bio == NULL) return(0); 213 if (b->next_bio == NULL)
209 switch (cmd) 214 return (0);
210 { 215 switch (cmd) {
211 case BIO_C_DO_STATE_MACHINE: 216 case BIO_C_DO_STATE_MACHINE:
212 BIO_clear_retry_flags(b); 217 BIO_clear_retry_flags(b);
213 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 218 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
214 BIO_copy_next_retry(b); 219 BIO_copy_next_retry(b);
215 break; 220 break;
216 case BIO_CTRL_DUP: 221 case BIO_CTRL_DUP:
217 ret=0L; 222 ret = 0L;
218 break; 223 break;
219 default: 224 default:
220 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 225 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
221 break; 226 break;
222 }
223 return(ret);
224 } 227 }
228 return (ret);
229}
225 230
226static long nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 231static long
227 { 232nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
228 long ret=1; 233{
234 long ret = 1;
229 235
230 if (b->next_bio == NULL) return(0); 236 if (b->next_bio == NULL)
231 switch (cmd) 237 return (0);
232 { 238 switch (cmd) {
233 default: 239 default:
234 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 240 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
235 break; 241 break;
236 }
237 return(ret);
238 }
239
240static int nbiof_gets(BIO *bp, char *buf, int size)
241 {
242 if (bp->next_bio == NULL) return(0);
243 return(BIO_gets(bp->next_bio,buf,size));
244 }
245
246
247static int nbiof_puts(BIO *bp, const char *str)
248 {
249 if (bp->next_bio == NULL) return(0);
250 return(BIO_puts(bp->next_bio,str));
251 } 242 }
243 return (ret);
244}
252 245
246static int
247nbiof_gets(BIO *bp, char *buf, int size)
248{
249 if (bp->next_bio == NULL)
250 return (0);
251 return (BIO_gets(bp->next_bio, buf, size));
252}
253 253
254static int
255nbiof_puts(BIO *bp, const char *str)
256{
257 if (bp->next_bio == NULL)
258 return (0);
259 return (BIO_puts(bp->next_bio, str));
260}
diff --git a/src/lib/libssl/src/crypto/bio/bf_null.c b/src/lib/libssl/src/crypto/bio/bf_null.c
index c1bf39a904..354731c0c7 100644
--- a/src/lib/libssl/src/crypto/bio/bf_null.c
+++ b/src/lib/libssl/src/crypto/bio/bf_null.c
@@ -72,8 +72,8 @@ static long nullf_ctrl(BIO *h, int cmd, long arg1, void *arg2);
72static int nullf_new(BIO *h); 72static int nullf_new(BIO *h);
73static int nullf_free(BIO *data); 73static int nullf_free(BIO *data);
74static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); 74static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
75static BIO_METHOD methods_nullf= 75
76 { 76static BIO_METHOD methods_nullf = {
77 BIO_TYPE_NULL_FILTER, 77 BIO_TYPE_NULL_FILTER,
78 "NULL filter", 78 "NULL filter",
79 nullf_write, 79 nullf_write,
@@ -84,100 +84,113 @@ static BIO_METHOD methods_nullf=
84 nullf_new, 84 nullf_new,
85 nullf_free, 85 nullf_free,
86 nullf_callback_ctrl, 86 nullf_callback_ctrl,
87 }; 87};
88 88
89BIO_METHOD *BIO_f_null(void) 89BIO_METHOD
90 { 90*BIO_f_null(void)
91 return(&methods_nullf); 91{
92 } 92 return (&methods_nullf);
93 93}
94static int nullf_new(BIO *bi) 94
95 { 95static int
96 bi->init=1; 96nullf_new(BIO *bi)
97 bi->ptr=NULL; 97{
98 bi->flags=0; 98 bi->init = 1;
99 return(1); 99 bi->ptr = NULL;
100 } 100 bi->flags = 0;
101 101 return (1);
102static int nullf_free(BIO *a) 102}
103 { 103
104 if (a == NULL) return(0); 104static int
105nullf_free(BIO *a)
106{
107 if (a == NULL)
108 return (0);
105/* a->ptr=NULL; 109/* a->ptr=NULL;
106 a->init=0; 110 a->init=0;
107 a->flags=0;*/ 111 a->flags=0;*/
108 return(1); 112 return (1);
109 } 113}
110 114
111static int nullf_read(BIO *b, char *out, int outl) 115static int
112 { 116nullf_read(BIO *b, char *out, int outl)
113 int ret=0; 117{
114 118 int ret = 0;
115 if (out == NULL) return(0); 119
116 if (b->next_bio == NULL) return(0); 120 if (out == NULL)
117 ret=BIO_read(b->next_bio,out,outl); 121 return (0);
122 if (b->next_bio == NULL)
123 return (0);
124 ret = BIO_read(b->next_bio, out, outl);
118 BIO_clear_retry_flags(b); 125 BIO_clear_retry_flags(b);
119 BIO_copy_next_retry(b); 126 BIO_copy_next_retry(b);
120 return(ret); 127 return (ret);
121 } 128}
122 129
123static int nullf_write(BIO *b, const char *in, int inl) 130static int
124 { 131nullf_write(BIO *b, const char *in, int inl)
125 int ret=0; 132{
126 133 int ret = 0;
127 if ((in == NULL) || (inl <= 0)) return(0); 134
128 if (b->next_bio == NULL) return(0); 135 if ((in == NULL) || (inl <= 0))
129 ret=BIO_write(b->next_bio,in,inl); 136 return (0);
137 if (b->next_bio == NULL)
138 return (0);
139 ret = BIO_write(b->next_bio, in, inl);
130 BIO_clear_retry_flags(b); 140 BIO_clear_retry_flags(b);
131 BIO_copy_next_retry(b); 141 BIO_copy_next_retry(b);
132 return(ret); 142 return (ret);
133 } 143}
134 144
135static long nullf_ctrl(BIO *b, int cmd, long num, void *ptr) 145static long
136 { 146nullf_ctrl(BIO *b, int cmd, long num, void *ptr)
147{
137 long ret; 148 long ret;
138 149
139 if (b->next_bio == NULL) return(0); 150 if (b->next_bio == NULL)
140 switch(cmd) 151 return (0);
141 { 152 switch (cmd) {
142 case BIO_C_DO_STATE_MACHINE: 153 case BIO_C_DO_STATE_MACHINE:
143 BIO_clear_retry_flags(b); 154 BIO_clear_retry_flags(b);
144 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 155 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
145 BIO_copy_next_retry(b); 156 BIO_copy_next_retry(b);
146 break; 157 break;
147 case BIO_CTRL_DUP: 158 case BIO_CTRL_DUP:
148 ret=0L; 159 ret = 0L;
149 break; 160 break;
150 default: 161 default:
151 ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 162 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
152 }
153 return(ret);
154 } 163 }
164 return (ret);
165}
155 166
156static long nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 167static long
157 { 168nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
158 long ret=1; 169{
170 long ret = 1;
159 171
160 if (b->next_bio == NULL) return(0); 172 if (b->next_bio == NULL)
161 switch (cmd) 173 return (0);
162 { 174 switch (cmd) {
163 default: 175 default:
164 ret=BIO_callback_ctrl(b->next_bio,cmd,fp); 176 ret = BIO_callback_ctrl(b->next_bio, cmd, fp);
165 break; 177 break;
166 }
167 return(ret);
168 } 178 }
169 179 return (ret);
170static int nullf_gets(BIO *bp, char *buf, int size) 180}
171 { 181
172 if (bp->next_bio == NULL) return(0); 182static int
173 return(BIO_gets(bp->next_bio,buf,size)); 183nullf_gets(BIO *bp, char *buf, int size)
174 } 184{
175 185 if (bp->next_bio == NULL)
176 186 return (0);
177static int nullf_puts(BIO *bp, const char *str) 187 return (BIO_gets(bp->next_bio, buf, size));
178 { 188}
179 if (bp->next_bio == NULL) return(0); 189
180 return(BIO_puts(bp->next_bio,str)); 190static int
181 } 191nullf_puts(BIO *bp, const char *str)
182 192{
183 193 if (bp->next_bio == NULL)
194 return (0);
195 return (BIO_puts(bp->next_bio, str));
196}
diff --git a/src/lib/libssl/src/crypto/bio/bio.h b/src/lib/libssl/src/crypto/bio/bio.h
index 05699ab212..4f1d02ada5 100644
--- a/src/lib/libssl/src/crypto/bio/bio.h
+++ b/src/lib/libssl/src/crypto/bio/bio.h
@@ -151,7 +151,7 @@ extern "C" {
151 151
152#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ 152#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */
153#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ 153#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */
154 154
155/* #ifdef IP_MTU_DISCOVER */ 155/* #ifdef IP_MTU_DISCOVER */
156#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ 156#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */
157/* #endif */ 157/* #endif */
@@ -282,9 +282,10 @@ void BIO_clear_flags(BIO *b, int flags);
282#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) 282#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN))
283#define BIO_cb_post(a) ((a)&BIO_CB_RETURN) 283#define BIO_cb_post(a) ((a)&BIO_CB_RETURN)
284 284
285long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long); 285long (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *,
286void BIO_set_callback(BIO *b, 286 int, long, long);
287 long (*callback)(struct bio_st *,int,const char *,int, long,long)); 287void BIO_set_callback(BIO *b,
288 long (*callback)(struct bio_st *, int, const char *, int, long, long));
288char *BIO_get_callback_arg(const BIO *b); 289char *BIO_get_callback_arg(const BIO *b);
289void BIO_set_callback_arg(BIO *b, char *arg); 290void BIO_set_callback_arg(BIO *b, char *arg);
290 291
@@ -293,8 +294,7 @@ int BIO_method_type(const BIO *b);
293 294
294typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); 295typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long);
295 296
296typedef struct bio_method_st 297typedef struct bio_method_st {
297 {
298 int type; 298 int type;
299 const char *name; 299 const char *name;
300 int (*bwrite)(BIO *, const char *, int); 300 int (*bwrite)(BIO *, const char *, int);
@@ -304,14 +304,13 @@ typedef struct bio_method_st
304 long (*ctrl)(BIO *, int, long, void *); 304 long (*ctrl)(BIO *, int, long, void *);
305 int (*create)(BIO *); 305 int (*create)(BIO *);
306 int (*destroy)(BIO *); 306 int (*destroy)(BIO *);
307 long (*callback_ctrl)(BIO *, int, bio_info_cb *); 307 long (*callback_ctrl)(BIO *, int, bio_info_cb *);
308 } BIO_METHOD; 308} BIO_METHOD;
309 309
310struct bio_st 310struct bio_st {
311 {
312 BIO_METHOD *method; 311 BIO_METHOD *method;
313 /* bio, mode, argp, argi, argl, ret */ 312 /* bio, mode, argp, argi, argl, ret */
314 long (*callback)(struct bio_st *,int,const char *,int, long,long); 313 long (*callback)(struct bio_st *, int, const char *, int, long, long);
315 char *cb_arg; /* first argument for the callback */ 314 char *cb_arg; /* first argument for the callback */
316 315
317 int init; 316 int init;
@@ -327,12 +326,11 @@ struct bio_st
327 unsigned long num_write; 326 unsigned long num_write;
328 327
329 CRYPTO_EX_DATA ex_data; 328 CRYPTO_EX_DATA ex_data;
330 }; 329};
331 330
332DECLARE_STACK_OF(BIO) 331DECLARE_STACK_OF(BIO)
333 332
334typedef struct bio_f_buffer_ctx_struct 333typedef struct bio_f_buffer_ctx_struct {
335 {
336 /* Buffers are setup like this: 334 /* Buffers are setup like this:
337 * 335 *
338 * <---------------------- size -----------------------> 336 * <---------------------- size ----------------------->
@@ -346,30 +344,28 @@ typedef struct bio_f_buffer_ctx_struct
346 int ibuf_size; /* how big is the input buffer */ 344 int ibuf_size; /* how big is the input buffer */
347 int obuf_size; /* how big is the output buffer */ 345 int obuf_size; /* how big is the output buffer */
348 346
349 char *ibuf; /* the char array */ 347 char *ibuf; /* the char array */
350 int ibuf_len; /* how many bytes are in it */ 348 int ibuf_len; /* how many bytes are in it */
351 int ibuf_off; /* write/read offset */ 349 int ibuf_off; /* write/read offset */
352 350
353 char *obuf; /* the char array */ 351 char *obuf; /* the char array */
354 int obuf_len; /* how many bytes are in it */ 352 int obuf_len; /* how many bytes are in it */
355 int obuf_off; /* write/read offset */ 353 int obuf_off; /* write/read offset */
356 } BIO_F_BUFFER_CTX; 354} BIO_F_BUFFER_CTX;
357 355
358/* Prefix and suffix callback in ASN1 BIO */ 356/* Prefix and suffix callback in ASN1 BIO */
359typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); 357typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg);
360 358
361#ifndef OPENSSL_NO_SCTP 359#ifndef OPENSSL_NO_SCTP
362/* SCTP parameter structs */ 360/* SCTP parameter structs */
363struct bio_dgram_sctp_sndinfo 361struct bio_dgram_sctp_sndinfo {
364 {
365 uint16_t snd_sid; 362 uint16_t snd_sid;
366 uint16_t snd_flags; 363 uint16_t snd_flags;
367 uint32_t snd_ppid; 364 uint32_t snd_ppid;
368 uint32_t snd_context; 365 uint32_t snd_context;
369 }; 366};
370 367
371struct bio_dgram_sctp_rcvinfo 368struct bio_dgram_sctp_rcvinfo {
372 {
373 uint16_t rcv_sid; 369 uint16_t rcv_sid;
374 uint16_t rcv_ssn; 370 uint16_t rcv_ssn;
375 uint16_t rcv_flags; 371 uint16_t rcv_flags;
@@ -377,13 +373,12 @@ struct bio_dgram_sctp_rcvinfo
377 uint32_t rcv_tsn; 373 uint32_t rcv_tsn;
378 uint32_t rcv_cumtsn; 374 uint32_t rcv_cumtsn;
379 uint32_t rcv_context; 375 uint32_t rcv_context;
380 }; 376};
381 377
382struct bio_dgram_sctp_prinfo 378struct bio_dgram_sctp_prinfo {
383 {
384 uint16_t pr_policy; 379 uint16_t pr_policy;
385 uint32_t pr_value; 380 uint32_t pr_value;
386 }; 381};
387#endif 382#endif
388 383
389/* connect BIO stuff */ 384/* connect BIO stuff */
@@ -519,7 +514,7 @@ struct bio_dgram_sctp_prinfo
519/* If you are wondering why this isn't defined, its because CONST_STRICT is 514/* If you are wondering why this isn't defined, its because CONST_STRICT is
520 * purely a compile-time kludge to allow const to be checked. 515 * purely a compile-time kludge to allow const to be checked.
521 */ 516 */
522int BIO_read_filename(BIO *b,const char *name); 517int BIO_read_filename(BIO *b, const char *name);
523#else 518#else
524#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ 519#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
525 BIO_CLOSE|BIO_FP_READ,(char *)name) 520 BIO_CLOSE|BIO_FP_READ,(char *)name)
@@ -611,22 +606,27 @@ int BIO_ctrl_reset_read_request(BIO *b);
611/* These two aren't currently implemented */ 606/* These two aren't currently implemented */
612/* int BIO_get_ex_num(BIO *bio); */ 607/* int BIO_get_ex_num(BIO *bio); */
613/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ 608/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */
614int BIO_set_ex_data(BIO *bio,int idx,void *data); 609int BIO_set_ex_data(BIO *bio, int idx, void *data);
615void *BIO_get_ex_data(BIO *bio,int idx); 610void *BIO_get_ex_data(BIO *bio, int idx);
616int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 611int
617 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); 612BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
613CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
618unsigned long BIO_number_read(BIO *bio); 614unsigned long BIO_number_read(BIO *bio);
619unsigned long BIO_number_written(BIO *bio); 615unsigned long BIO_number_written(BIO *bio);
620 616
621/* For BIO_f_asn1() */ 617/* For BIO_f_asn1() */
622int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, 618int
623 asn1_ps_func *prefix_free); 619BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix,
624int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, 620asn1_ps_func *prefix_free);
625 asn1_ps_func **pprefix_free); 621int
626int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, 622BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix,
627 asn1_ps_func *suffix_free); 623asn1_ps_func **pprefix_free);
628int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, 624int
629 asn1_ps_func **psuffix_free); 625BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix,
626asn1_ps_func *suffix_free);
627int
628BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix,
629asn1_ps_func **psuffix_free);
630 630
631# ifndef OPENSSL_NO_FP_API 631# ifndef OPENSSL_NO_FP_API
632BIO_METHOD *BIO_s_file(void ); 632BIO_METHOD *BIO_s_file(void );
@@ -635,22 +635,23 @@ BIO *BIO_new_fp(FILE *stream, int close_flag);
635# define BIO_s_file_internal BIO_s_file 635# define BIO_s_file_internal BIO_s_file
636# endif 636# endif
637BIO * BIO_new(BIO_METHOD *type); 637BIO * BIO_new(BIO_METHOD *type);
638int BIO_set(BIO *a,BIO_METHOD *type); 638int BIO_set(BIO *a, BIO_METHOD *type);
639int BIO_free(BIO *a); 639int BIO_free(BIO *a);
640void BIO_vfree(BIO *a); 640void BIO_vfree(BIO *a);
641int BIO_read(BIO *b, void *data, int len); 641int BIO_read(BIO *b, void *data, int len);
642int BIO_gets(BIO *bp,char *buf, int size); 642int BIO_gets(BIO *bp, char *buf, int size);
643int BIO_write(BIO *b, const void *data, int len); 643int BIO_write(BIO *b, const void *data, int len);
644int BIO_puts(BIO *bp,const char *buf); 644int BIO_puts(BIO *bp, const char *buf);
645int BIO_indent(BIO *b,int indent,int max); 645int BIO_indent(BIO *b, int indent, int max);
646long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); 646long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg);
647long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); 647long BIO_callback_ctrl(BIO *b, int cmd,
648char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); 648 void (*fp)(struct bio_st *, int, const char *, int, long, long));
649long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); 649char * BIO_ptr_ctrl(BIO *bp, int cmd, long larg);
650BIO * BIO_push(BIO *b,BIO *append); 650long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg);
651BIO * BIO_push(BIO *b, BIO *append);
651BIO * BIO_pop(BIO *b); 652BIO * BIO_pop(BIO *b);
652void BIO_free_all(BIO *a); 653void BIO_free_all(BIO *a);
653BIO * BIO_find_type(BIO *b,int bio_type); 654BIO * BIO_find_type(BIO *b, int bio_type);
654BIO * BIO_next(BIO *b); 655BIO * BIO_next(BIO *b);
655BIO * BIO_get_retry_BIO(BIO *bio, int *reason); 656BIO * BIO_get_retry_BIO(BIO *bio, int *reason);
656int BIO_get_retry_reason(BIO *bio); 657int BIO_get_retry_reason(BIO *bio);
@@ -661,8 +662,8 @@ int BIO_nread(BIO *bio, char **buf, int num);
661int BIO_nwrite0(BIO *bio, char **buf); 662int BIO_nwrite0(BIO *bio, char **buf);
662int BIO_nwrite(BIO *bio, char **buf, int num); 663int BIO_nwrite(BIO *bio, char **buf, int num);
663 664
664long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, 665long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi,
665 long argl,long ret); 666 long argl, long ret);
666 667
667BIO_METHOD *BIO_s_mem(void); 668BIO_METHOD *BIO_s_mem(void);
668BIO *BIO_new_mem_buf(void *buf, int len); 669BIO *BIO_new_mem_buf(void *buf, int len);
@@ -696,12 +697,14 @@ int BIO_dgram_non_fatal_error(int error);
696 697
697int BIO_fd_should_retry(int i); 698int BIO_fd_should_retry(int i);
698int BIO_fd_non_fatal_error(int error); 699int BIO_fd_non_fatal_error(int error);
699int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), 700int
700 void *u, const char *s, int len); 701BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
701int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), 702void *u, const char *s, int len);
702 void *u, const char *s, int len, int indent); 703int
703int BIO_dump(BIO *b,const char *bytes,int len); 704BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
704int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); 705void *u, const char *s, int len, int indent);
706int BIO_dump(BIO *b, const char *bytes, int len);
707int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent);
705#ifndef OPENSSL_NO_FP_API 708#ifndef OPENSSL_NO_FP_API
706int BIO_dump_fp(FILE *fp, const char *s, int len); 709int BIO_dump_fp(FILE *fp, const char *s, int len);
707int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); 710int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent);
@@ -717,23 +720,24 @@ struct hostent *BIO_gethostbyname(const char *name);
717 */ 720 */
718int BIO_sock_error(int sock); 721int BIO_sock_error(int sock);
719int BIO_socket_ioctl(int fd, long type, void *arg); 722int BIO_socket_ioctl(int fd, long type, void *arg);
720int BIO_socket_nbio(int fd,int mode); 723int BIO_socket_nbio(int fd, int mode);
721int BIO_get_port(const char *str, unsigned short *port_ptr); 724int BIO_get_port(const char *str, unsigned short *port_ptr);
722int BIO_get_host_ip(const char *str, unsigned char *ip); 725int BIO_get_host_ip(const char *str, unsigned char *ip);
723int BIO_get_accept_socket(char *host_port,int mode); 726int BIO_get_accept_socket(char *host_port, int mode);
724int BIO_accept(int sock,char **ip_port); 727int BIO_accept(int sock, char **ip_port);
725int BIO_sock_init(void ); 728int BIO_sock_init(void );
726void BIO_sock_cleanup(void); 729void BIO_sock_cleanup(void);
727int BIO_set_tcp_ndelay(int sock,int turn_on); 730int BIO_set_tcp_ndelay(int sock, int turn_on);
728 731
729BIO *BIO_new_socket(int sock, int close_flag); 732BIO *BIO_new_socket(int sock, int close_flag);
730BIO *BIO_new_dgram(int fd, int close_flag); 733BIO *BIO_new_dgram(int fd, int close_flag);
731#ifndef OPENSSL_NO_SCTP 734#ifndef OPENSSL_NO_SCTP
732BIO *BIO_new_dgram_sctp(int fd, int close_flag); 735BIO *BIO_new_dgram_sctp(int fd, int close_flag);
733int BIO_dgram_is_sctp(BIO *bio); 736int BIO_dgram_is_sctp(BIO *bio);
734int BIO_dgram_sctp_notification_cb(BIO *b, 737int
735 void (*handle_notifications)(BIO *bio, void *context, void *buf), 738BIO_dgram_sctp_notification_cb(BIO *b,
736 void *context); 739 void (*handle_notifications)(BIO *bio, void *context, void *buf),
740void *context);
737int BIO_dgram_sctp_wait_for_dry(BIO *b); 741int BIO_dgram_sctp_wait_for_dry(BIO *b);
738int BIO_dgram_sctp_msg_waiting(BIO *b); 742int BIO_dgram_sctp_msg_waiting(BIO *b);
739#endif 743#endif
@@ -741,8 +745,9 @@ BIO *BIO_new_fd(int fd, int close_flag);
741BIO *BIO_new_connect(char *host_port); 745BIO *BIO_new_connect(char *host_port);
742BIO *BIO_new_accept(char *host_port); 746BIO *BIO_new_accept(char *host_port);
743 747
744int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, 748int
745 BIO **bio2, size_t writebuf2); 749BIO_new_bio_pair(BIO **bio1, size_t writebuf1,
750BIO **bio2, size_t writebuf2);
746/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. 751/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints.
747 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. 752 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL.
748 * Size 0 uses default value. 753 * Size 0 uses default value.
@@ -757,14 +762,18 @@ void BIO_copy_next_retry(BIO *b);
757#else 762#else
758# define __bio_h__attr__(x) 763# define __bio_h__attr__(x)
759#endif 764#endif
760int BIO_printf(BIO *bio, const char *format, ...) 765int
761 __bio_h__attr__((__format__(__printf__,2,3))); 766BIO_printf(BIO *bio, const char *format, ...)
762int BIO_vprintf(BIO *bio, const char *format, va_list args) 767__bio_h__attr__((__format__(__printf__, 2, 3)));
763 __bio_h__attr__((__format__(__printf__,2,0))); 768int
764int BIO_snprintf(char *buf, size_t n, const char *format, ...) 769BIO_vprintf(BIO *bio, const char *format, va_list args)
765 __bio_h__attr__((__format__(__printf__,3,4))); 770__bio_h__attr__((__format__(__printf__, 2, 0)));
766int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) 771int
767 __bio_h__attr__((__format__(__printf__,3,0))); 772BIO_snprintf(char *buf, size_t n, const char *format, ...)
773__bio_h__attr__((__format__(__printf__, 3, 4)));
774int
775BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
776__bio_h__attr__((__format__(__printf__, 3, 0)));
768#undef __bio_h__attr__ 777#undef __bio_h__attr__
769 778
770/* BEGIN ERROR CODES */ 779/* BEGIN ERROR CODES */
diff --git a/src/lib/libssl/src/crypto/bio/bio_cb.c b/src/lib/libssl/src/crypto/bio/bio_cb.c
index 78c8974ab4..3e110f3751 100644
--- a/src/lib/libssl/src/crypto/bio/bio_cb.c
+++ b/src/lib/libssl/src/crypto/bio/bio_cb.c
@@ -63,81 +63,85 @@
63#include <openssl/bio.h> 63#include <openssl/bio.h>
64#include <openssl/err.h> 64#include <openssl/err.h>
65 65
66long BIO_debug_callback(BIO *bio, int cmd, const char *argp, 66long
67 int argi, long argl, long ret) 67BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, long argl,
68 { 68 long ret)
69{
69 BIO *b; 70 BIO *b;
70 char buf[256]; 71 char buf[256];
71 char *p; 72 char *p;
72 long r=1; 73 long r = 1;
73 size_t p_maxlen; 74 size_t p_maxlen;
74 75
75 if (BIO_CB_RETURN & cmd) 76 if (BIO_CB_RETURN & cmd)
76 r=ret; 77 r = ret;
77 78
78 (void) snprintf(buf,sizeof buf,"BIO[%08lX]:",(unsigned long)bio); 79 (void) snprintf(buf, sizeof buf, "BIO[%08lX]:", (unsigned long)bio);
79 p= &(buf[14]); 80 p = &(buf[14]);
80 p_maxlen = sizeof buf - 14; 81 p_maxlen = sizeof buf - 14;
81 switch (cmd) 82 switch (cmd) {
82 {
83 case BIO_CB_FREE: 83 case BIO_CB_FREE:
84 (void) snprintf(p,p_maxlen,"Free - %s\n",bio->method->name); 84 (void) snprintf(p, p_maxlen, "Free - %s\n", bio->method->name);
85 break; 85 break;
86 case BIO_CB_READ: 86 case BIO_CB_READ:
87 if (bio->method->type & BIO_TYPE_DESCRIPTOR) 87 if (bio->method->type & BIO_TYPE_DESCRIPTOR)
88 (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s fd=%d\n", 88 (void) snprintf(p, p_maxlen,
89 bio->num,(unsigned long)argi, 89 "read(%d,%lu) - %s fd=%d\n",
90 bio->method->name,bio->num); 90 bio->num,(unsigned long)argi,
91 bio->method->name, bio->num);
91 else 92 else
92 (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s\n", 93 (void) snprintf(p, p_maxlen, "read(%d,%lu) - %s\n",
93 bio->num,(unsigned long)argi, 94 bio->num, (unsigned long)argi, bio->method->name);
94 bio->method->name);
95 break; 95 break;
96 case BIO_CB_WRITE: 96 case BIO_CB_WRITE:
97 if (bio->method->type & BIO_TYPE_DESCRIPTOR) 97 if (bio->method->type & BIO_TYPE_DESCRIPTOR)
98 (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s fd=%d\n", 98 (void) snprintf(p, p_maxlen,
99 bio->num,(unsigned long)argi, 99 "write(%d,%lu) - %s fd=%d\n",
100 bio->method->name,bio->num); 100 bio->num, (unsigned long)argi,
101 bio->method->name, bio->num);
101 else 102 else
102 (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s\n", 103 (void) snprintf(p, p_maxlen, "write(%d,%lu) - %s\n",
103 bio->num,(unsigned long)argi, 104 bio->num, (unsigned long)argi, bio->method->name);
104 bio->method->name);
105 break; 105 break;
106 case BIO_CB_PUTS: 106 case BIO_CB_PUTS:
107 (void) snprintf(p,p_maxlen,"puts() - %s\n",bio->method->name); 107 (void) snprintf(p, p_maxlen,
108 "puts() - %s\n", bio->method->name);
108 break; 109 break;
109 case BIO_CB_GETS: 110 case BIO_CB_GETS:
110 (void) snprintf(p,p_maxlen,"gets(%lu) - %s\n",(unsigned long)argi,bio->method->name); 111 (void) snprintf(p, p_maxlen, "gets(%lu) - %s\n",
112 (unsigned long)argi, bio->method->name);
111 break; 113 break;
112 case BIO_CB_CTRL: 114 case BIO_CB_CTRL:
113 (void) snprintf(p,p_maxlen,"ctrl(%lu) - %s\n",(unsigned long)argi,bio->method->name); 115 (void) snprintf(p, p_maxlen, "ctrl(%lu) - %s\n",
116 (unsigned long)argi, bio->method->name);
114 break; 117 break;
115 case BIO_CB_RETURN|BIO_CB_READ: 118 case BIO_CB_RETURN|BIO_CB_READ:
116 (void) snprintf(p,p_maxlen,"read return %ld\n",ret); 119 (void) snprintf(p, p_maxlen, "read return %ld\n", ret);
117 break; 120 break;
118 case BIO_CB_RETURN|BIO_CB_WRITE: 121 case BIO_CB_RETURN|BIO_CB_WRITE:
119 (void) snprintf(p,p_maxlen,"write return %ld\n",ret); 122 (void) snprintf(p, p_maxlen, "write return %ld\n", ret);
120 break; 123 break;
121 case BIO_CB_RETURN|BIO_CB_GETS: 124 case BIO_CB_RETURN|BIO_CB_GETS:
122 (void) snprintf(p,p_maxlen,"gets return %ld\n",ret); 125 (void) snprintf(p, p_maxlen, "gets return %ld\n", ret);
123 break; 126 break;
124 case BIO_CB_RETURN|BIO_CB_PUTS: 127 case BIO_CB_RETURN|BIO_CB_PUTS:
125 (void) snprintf(p,p_maxlen,"puts return %ld\n",ret); 128 (void) snprintf(p, p_maxlen, "puts return %ld\n", ret);
126 break; 129 break;
127 case BIO_CB_RETURN|BIO_CB_CTRL: 130 case BIO_CB_RETURN|BIO_CB_CTRL:
128 (void) snprintf(p,p_maxlen,"ctrl return %ld\n",ret); 131 (void) snprintf(p, p_maxlen, "ctrl return %ld\n", ret);
129 break; 132 break;
130 default: 133 default:
131 (void) snprintf(p,p_maxlen,"bio callback - unknown type (%d)\n",cmd); 134 (void) snprintf(p, p_maxlen,
135 "bio callback - unknown type (%d)\n", cmd);
132 break; 136 break;
133 } 137 }
134 138
135 b=(BIO *)bio->cb_arg; 139 b = (BIO *)bio->cb_arg;
136 if (b != NULL) 140 if (b != NULL)
137 BIO_write(b,buf,strlen(buf)); 141 BIO_write(b, buf, strlen(buf));
138#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) 142#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)
139 else 143 else
140 fputs(buf,stderr); 144 fputs(buf, stderr);
141#endif 145#endif
142 return(r); 146 return (r);
143 } 147}
diff --git a/src/lib/libssl/src/crypto/bio/bio_err.c b/src/lib/libssl/src/crypto/bio/bio_err.c
index 0dbfbd80d3..86e9a3082b 100644
--- a/src/lib/libssl/src/crypto/bio/bio_err.c
+++ b/src/lib/libssl/src/crypto/bio/bio_err.c
@@ -68,88 +68,85 @@
68#define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) 68#define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0)
69#define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) 69#define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason)
70 70
71static ERR_STRING_DATA BIO_str_functs[]= 71static ERR_STRING_DATA BIO_str_functs[]= {
72 { 72 {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"},
73{ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, 73 {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"},
74{ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, 74 {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"},
75{ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, 75 {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"},
76{ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, 76 {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"},
77{ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, 77 {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"},
78{ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, 78 {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"},
79{ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, 79 {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"},
80{ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, 80 {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"},
81{ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, 81 {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"},
82{ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, 82 {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"},
83{ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, 83 {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"},
84{ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, 84 {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"},
85{ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, 85 {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"},
86{ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, 86 {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"},
87{ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, 87 {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"},
88{ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, 88 {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"},
89{ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, 89 {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"},
90{ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, 90 {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"},
91{ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, 91 {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"},
92{ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, 92 {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"},
93{ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, 93 {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"},
94{ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, 94 {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"},
95{ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, 95 {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"},
96{ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, 96 {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"},
97{ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, 97 {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"},
98{ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, 98 {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"},
99{ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, 99 {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"},
100{ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, 100 {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"},
101{ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, 101 {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"},
102{ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, 102 {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"},
103{ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, 103 {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"},
104{ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, 104 {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"},
105{ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, 105 {0, NULL}
106{0,NULL} 106};
107 };
108 107
109static ERR_STRING_DATA BIO_str_reasons[]= 108static ERR_STRING_DATA BIO_str_reasons[]= {
110 { 109 {ERR_REASON(BIO_R_ACCEPT_ERROR) , "accept error"},
111{ERR_REASON(BIO_R_ACCEPT_ERROR) ,"accept error"}, 110 {ERR_REASON(BIO_R_BAD_FOPEN_MODE) , "bad fopen mode"},
112{ERR_REASON(BIO_R_BAD_FOPEN_MODE) ,"bad fopen mode"}, 111 {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) , "bad hostname lookup"},
113{ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) ,"bad hostname lookup"}, 112 {ERR_REASON(BIO_R_BROKEN_PIPE) , "broken pipe"},
114{ERR_REASON(BIO_R_BROKEN_PIPE) ,"broken pipe"}, 113 {ERR_REASON(BIO_R_CONNECT_ERROR) , "connect error"},
115{ERR_REASON(BIO_R_CONNECT_ERROR) ,"connect error"}, 114 {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) , "EOF on memory BIO"},
116{ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) ,"EOF on memory BIO"}, 115 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) , "error setting nbio"},
117{ERR_REASON(BIO_R_ERROR_SETTING_NBIO) ,"error setting nbio"}, 116 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET), "error setting nbio on accepted socket"},
118{ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET),"error setting nbio on accepted socket"}, 117 {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET), "error setting nbio on accept socket"},
119{ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET),"error setting nbio on accept socket"}, 118 {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET), "gethostbyname addr is not af inet"},
120{ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET),"gethostbyname addr is not af inet"}, 119 {ERR_REASON(BIO_R_INVALID_ARGUMENT) , "invalid argument"},
121{ERR_REASON(BIO_R_INVALID_ARGUMENT) ,"invalid argument"}, 120 {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) , "invalid ip address"},
122{ERR_REASON(BIO_R_INVALID_IP_ADDRESS) ,"invalid ip address"}, 121 {ERR_REASON(BIO_R_IN_USE) , "in use"},
123{ERR_REASON(BIO_R_IN_USE) ,"in use"}, 122 {ERR_REASON(BIO_R_KEEPALIVE) , "keepalive"},
124{ERR_REASON(BIO_R_KEEPALIVE) ,"keepalive"}, 123 {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) , "nbio connect error"},
125{ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) ,"nbio connect error"}, 124 {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED), "no accept port specified"},
126{ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED),"no accept port specified"}, 125 {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) , "no hostname specified"},
127{ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) ,"no hostname specified"}, 126 {ERR_REASON(BIO_R_NO_PORT_DEFINED) , "no port defined"},
128{ERR_REASON(BIO_R_NO_PORT_DEFINED) ,"no port defined"}, 127 {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) , "no port specified"},
129{ERR_REASON(BIO_R_NO_PORT_SPECIFIED) ,"no port specified"}, 128 {ERR_REASON(BIO_R_NO_SUCH_FILE) , "no such file"},
130{ERR_REASON(BIO_R_NO_SUCH_FILE) ,"no such file"}, 129 {ERR_REASON(BIO_R_NULL_PARAMETER) , "null parameter"},
131{ERR_REASON(BIO_R_NULL_PARAMETER) ,"null parameter"}, 130 {ERR_REASON(BIO_R_TAG_MISMATCH) , "tag mismatch"},
132{ERR_REASON(BIO_R_TAG_MISMATCH) ,"tag mismatch"}, 131 {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) , "unable to bind socket"},
133{ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) ,"unable to bind socket"}, 132 {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET), "unable to create socket"},
134{ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET),"unable to create socket"}, 133 {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET), "unable to listen socket"},
135{ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET),"unable to listen socket"}, 134 {ERR_REASON(BIO_R_UNINITIALIZED) , "uninitialized"},
136{ERR_REASON(BIO_R_UNINITIALIZED) ,"uninitialized"}, 135 {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) , "unsupported method"},
137{ERR_REASON(BIO_R_UNSUPPORTED_METHOD) ,"unsupported method"}, 136 {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO), "write to read only BIO"},
138{ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO),"write to read only BIO"}, 137 {ERR_REASON(BIO_R_WSASTARTUP) , "WSAStartup"},
139{ERR_REASON(BIO_R_WSASTARTUP) ,"WSAStartup"}, 138 {0, NULL}
140{0,NULL} 139};
141 };
142 140
143#endif 141#endif
144 142
145void ERR_load_BIO_strings(void) 143void
146 { 144ERR_load_BIO_strings(void)
145{
147#ifndef OPENSSL_NO_ERR 146#ifndef OPENSSL_NO_ERR
148 147 if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) {
149 if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) 148 ERR_load_strings(0, BIO_str_functs);
150 { 149 ERR_load_strings(0, BIO_str_reasons);
151 ERR_load_strings(0,BIO_str_functs);
152 ERR_load_strings(0,BIO_str_reasons);
153 }
154#endif
155 } 150 }
151#endif
152}
diff --git a/src/lib/libssl/src/crypto/bio/bio_lib.c b/src/lib/libssl/src/crypto/bio/bio_lib.c
index 9c9646afa8..9e8fb7913a 100644
--- a/src/lib/libssl/src/crypto/bio/bio_lib.c
+++ b/src/lib/libssl/src/crypto/bio/bio_lib.c
@@ -63,539 +63,571 @@
63#include <openssl/bio.h> 63#include <openssl/bio.h>
64#include <openssl/stack.h> 64#include <openssl/stack.h>
65 65
66BIO *BIO_new(BIO_METHOD *method) 66BIO
67 { 67*BIO_new(BIO_METHOD *method)
68 BIO *ret=NULL; 68{
69 69 BIO *ret = NULL;
70 ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); 70
71 if (ret == NULL) 71 ret = (BIO *)OPENSSL_malloc(sizeof(BIO));
72 { 72 if (ret == NULL) {
73 BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); 73 BIOerr(BIO_F_BIO_NEW, ERR_R_MALLOC_FAILURE);
74 return(NULL); 74 return (NULL);
75 } 75 }
76 if (!BIO_set(ret,method)) 76 if (!BIO_set(ret, method)) {
77 {
78 OPENSSL_free(ret); 77 OPENSSL_free(ret);
79 ret=NULL; 78 ret = NULL;
80 }
81 return(ret);
82 } 79 }
80 return (ret);
81}
83 82
84int BIO_set(BIO *bio, BIO_METHOD *method) 83int
85 { 84BIO_set(BIO *bio, BIO_METHOD *method)
86 bio->method=method; 85{
87 bio->callback=NULL; 86 bio->method = method;
88 bio->cb_arg=NULL; 87 bio->callback = NULL;
89 bio->init=0; 88 bio->cb_arg = NULL;
90 bio->shutdown=1; 89 bio->init = 0;
91 bio->flags=0; 90 bio->shutdown = 1;
92 bio->retry_reason=0; 91 bio->flags = 0;
93 bio->num=0; 92 bio->retry_reason = 0;
94 bio->ptr=NULL; 93 bio->num = 0;
95 bio->prev_bio=NULL; 94 bio->ptr = NULL;
96 bio->next_bio=NULL; 95 bio->prev_bio = NULL;
97 bio->references=1; 96 bio->next_bio = NULL;
98 bio->num_read=0L; 97 bio->references = 1;
99 bio->num_write=0L; 98 bio->num_read = 0L;
99 bio->num_write = 0L;
100 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); 100 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
101 if (method->create != NULL) 101 if (method->create != NULL)
102 if (!method->create(bio)) 102 if (!method->create(bio)) {
103 {
104 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, 103 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio,
105 &bio->ex_data); 104 &bio->ex_data);
106 return(0); 105 return (0);
107 } 106 }
108 return(1); 107 return (1);
109 } 108}
110 109
111int BIO_free(BIO *a) 110int
112 { 111BIO_free(BIO *a)
112{
113 int i; 113 int i;
114 114
115 if (a == NULL) return(0); 115 if (a == NULL)
116 return (0);
116 117
117 i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); 118 i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO);
118#ifdef REF_PRINT 119#ifdef REF_PRINT
119 REF_PRINT("BIO",a); 120 REF_PRINT("BIO", a);
120#endif 121#endif
121 if (i > 0) return(1); 122 if (i > 0)
123 return (1);
122#ifdef REF_CHECK 124#ifdef REF_CHECK
123 if (i < 0) 125 if (i < 0) {
124 { 126 fprintf(stderr, "BIO_free, bad reference count\n");
125 fprintf(stderr,"BIO_free, bad reference count\n");
126 abort(); 127 abort();
127 } 128 }
128#endif 129#endif
129 if ((a->callback != NULL) && 130 if ((a->callback != NULL) &&
130 ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) 131 ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0))
131 return(i); 132 return (i);
132 133
133 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); 134 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data);
134 135
135 if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); 136 if ((a->method == NULL) || (a->method->destroy == NULL))
137 return (1);
136 a->method->destroy(a); 138 a->method->destroy(a);
137 OPENSSL_free(a); 139 OPENSSL_free(a);
138 return(1); 140 return (1);
139 } 141}
140 142
141void BIO_vfree(BIO *a) 143void
142 { BIO_free(a); } 144BIO_vfree(BIO *a)
145{
146 BIO_free(a);
147}
143 148
144void BIO_clear_flags(BIO *b, int flags) 149void
145 { 150BIO_clear_flags(BIO *b, int flags)
151{
146 b->flags &= ~flags; 152 b->flags &= ~flags;
147 } 153}
148 154
149int BIO_test_flags(const BIO *b, int flags) 155int
150 { 156BIO_test_flags(const BIO *b, int flags)
157{
151 return (b->flags & flags); 158 return (b->flags & flags);
152 } 159}
153 160
154void BIO_set_flags(BIO *b, int flags) 161void
155 { 162BIO_set_flags(BIO *b, int flags)
163{
156 b->flags |= flags; 164 b->flags |= flags;
157 } 165}
158 166
159long (*BIO_get_callback(const BIO *b))(struct bio_st *,int,const char *,int, long,long) 167long
160 { 168(*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, int,
169 long, long)
170{
161 return b->callback; 171 return b->callback;
162 } 172}
163 173
164void BIO_set_callback(BIO *b, long (*cb)(struct bio_st *,int,const char *,int, long,long)) 174void
165 { 175BIO_set_callback(BIO *b, long (*cb)(struct bio_st *, int, const char *, int,
176 long, long))
177{
166 b->callback = cb; 178 b->callback = cb;
167 } 179}
168 180
169void BIO_set_callback_arg(BIO *b, char *arg) 181void
170 { 182BIO_set_callback_arg(BIO *b, char *arg)
183{
171 b->cb_arg = arg; 184 b->cb_arg = arg;
172 } 185}
173 186
174char * BIO_get_callback_arg(const BIO *b) 187char *
175 { 188BIO_get_callback_arg(const BIO *b)
189{
176 return b->cb_arg; 190 return b->cb_arg;
177 } 191}
178 192
179const char * BIO_method_name(const BIO *b) 193const char *
180 { 194BIO_method_name(const BIO *b)
195{
181 return b->method->name; 196 return b->method->name;
182 } 197}
183 198
184int BIO_method_type(const BIO *b) 199int
185 { 200BIO_method_type(const BIO *b)
201{
186 return b->method->type; 202 return b->method->type;
187 } 203}
188
189 204
190int BIO_read(BIO *b, void *out, int outl) 205int
191 { 206BIO_read(BIO *b, void *out, int outl)
207{
192 int i; 208 int i;
193 long (*cb)(BIO *,int,const char *,int,long,long); 209 long (*cb)(BIO *, int, const char *, int, long, long);
194 210
195 if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) 211 if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) {
196 { 212 BIOerr(BIO_F_BIO_READ, BIO_R_UNSUPPORTED_METHOD);
197 BIOerr(BIO_F_BIO_READ,BIO_R_UNSUPPORTED_METHOD); 213 return (-2);
198 return(-2); 214 }
199 }
200 215
201 cb=b->callback; 216 cb = b->callback;
202 if ((cb != NULL) && 217 if ((cb != NULL) &&
203 ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) 218 ((i = (int)cb(b, BIO_CB_READ, out, outl, 0L, 1L)) <= 0))
204 return(i); 219 return (i);
205 220
206 if (!b->init) 221 if (!b->init) {
207 { 222 BIOerr(BIO_F_BIO_READ, BIO_R_UNINITIALIZED);
208 BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); 223 return (-2);
209 return(-2); 224 }
210 }
211 225
212 i=b->method->bread(b,out,outl); 226 i = b->method->bread(b, out, outl);
213 227
214 if (i > 0) b->num_read+=(unsigned long)i; 228 if (i > 0)
229 b->num_read += (unsigned long)i;
215 230
216 if (cb != NULL) 231 if (cb != NULL)
217 i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, 232 i = (int)cb(b, BIO_CB_READ|BIO_CB_RETURN, out, outl,
218 0L,(long)i); 233 0L, (long)i);
219 return(i); 234 return (i);
220 } 235}
221 236
222int BIO_write(BIO *b, const void *in, int inl) 237int
223 { 238BIO_write(BIO *b, const void *in, int inl)
239{
224 int i; 240 int i;
225 long (*cb)(BIO *,int,const char *,int,long,long); 241 long (*cb)(BIO *, int, const char *, int, long, long);
226 242
227 if (b == NULL) 243 if (b == NULL)
228 return(0); 244 return (0);
229 245
230 cb=b->callback; 246 cb = b->callback;
231 if ((b->method == NULL) || (b->method->bwrite == NULL)) 247 if ((b->method == NULL) || (b->method->bwrite == NULL)) {
232 { 248 BIOerr(BIO_F_BIO_WRITE, BIO_R_UNSUPPORTED_METHOD);
233 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); 249 return (-2);
234 return(-2); 250 }
235 }
236 251
237 if ((cb != NULL) && 252 if ((cb != NULL) &&
238 ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) 253 ((i = (int)cb(b, BIO_CB_WRITE, in, inl, 0L, 1L)) <= 0))
239 return(i); 254 return (i);
240 255
241 if (!b->init) 256 if (!b->init) {
242 { 257 BIOerr(BIO_F_BIO_WRITE, BIO_R_UNINITIALIZED);
243 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); 258 return (-2);
244 return(-2); 259 }
245 }
246 260
247 i=b->method->bwrite(b,in,inl); 261 i = b->method->bwrite(b, in, inl);
248 262
249 if (i > 0) b->num_write+=(unsigned long)i; 263 if (i > 0)
264 b->num_write += (unsigned long)i;
250 265
251 if (cb != NULL) 266 if (cb != NULL)
252 i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, 267 i = (int)cb(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl,
253 0L,(long)i); 268 0L, (long)i);
254 return(i); 269 return (i);
255 } 270}
256 271
257int BIO_puts(BIO *b, const char *in) 272int
258 { 273BIO_puts(BIO *b, const char *in)
274{
259 int i; 275 int i;
260 long (*cb)(BIO *,int,const char *,int,long,long); 276 long (*cb)(BIO *, int, const char *, int, long, long);
261 277
262 if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) 278 if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) {
263 { 279 BIOerr(BIO_F_BIO_PUTS, BIO_R_UNSUPPORTED_METHOD);
264 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNSUPPORTED_METHOD); 280 return (-2);
265 return(-2); 281 }
266 }
267 282
268 cb=b->callback; 283 cb = b->callback;
269 284
270 if ((cb != NULL) && 285 if ((cb != NULL) &&
271 ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) 286 ((i = (int)cb(b, BIO_CB_PUTS, in, 0, 0L, 1L)) <= 0))
272 return(i); 287 return (i);
273 288
274 if (!b->init) 289 if (!b->init) {
275 { 290 BIOerr(BIO_F_BIO_PUTS, BIO_R_UNINITIALIZED);
276 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); 291 return (-2);
277 return(-2); 292 }
278 }
279 293
280 i=b->method->bputs(b,in); 294 i = b->method->bputs(b, in);
281 295
282 if (i > 0) b->num_write+=(unsigned long)i; 296 if (i > 0)
297 b->num_write += (unsigned long)i;
283 298
284 if (cb != NULL) 299 if (cb != NULL)
285 i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, 300 i = (int)cb(b, BIO_CB_PUTS|BIO_CB_RETURN, in, 0, 0L, (long)i);
286 0L,(long)i); 301 return (i);
287 return(i); 302}
288 }
289 303
290int BIO_gets(BIO *b, char *in, int inl) 304int
291 { 305BIO_gets(BIO *b, char *in, int inl)
306{
292 int i; 307 int i;
293 long (*cb)(BIO *,int,const char *,int,long,long); 308 long (*cb)(BIO *, int, const char *, int, long, long);
294 309
295 if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) 310 if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) {
296 { 311 BIOerr(BIO_F_BIO_GETS, BIO_R_UNSUPPORTED_METHOD);
297 BIOerr(BIO_F_BIO_GETS,BIO_R_UNSUPPORTED_METHOD); 312 return (-2);
298 return(-2); 313 }
299 }
300 314
301 cb=b->callback; 315 cb = b->callback;
302 316
303 if ((cb != NULL) && 317 if ((cb != NULL) &&
304 ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) 318 ((i = (int)cb(b, BIO_CB_GETS, in, inl, 0L, 1L)) <= 0))
305 return(i); 319 return (i);
306 320
307 if (!b->init) 321 if (!b->init) {
308 { 322 BIOerr(BIO_F_BIO_GETS, BIO_R_UNINITIALIZED);
309 BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); 323 return (-2);
310 return(-2); 324 }
311 }
312 325
313 i=b->method->bgets(b,in,inl); 326 i = b->method->bgets(b, in, inl);
314 327
315 if (cb != NULL) 328 if (cb != NULL)
316 i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, 329 i = (int)cb(b, BIO_CB_GETS|BIO_CB_RETURN, in, inl, 0L, (long)i);
317 0L,(long)i); 330 return (i);
318 return(i); 331}
319 }
320 332
321int BIO_indent(BIO *b,int indent,int max) 333int
322 { 334BIO_indent(BIO *b, int indent, int max)
323 if(indent < 0) 335{
324 indent=0; 336 if (indent < 0)
325 if(indent > max) 337 indent = 0;
326 indent=max; 338 if (indent > max)
327 while(indent--) 339 indent = max;
328 if(BIO_puts(b," ") != 1) 340 while (indent--)
329 return 0; 341 if (BIO_puts(b, " ") != 1)
342 return 0;
330 return 1; 343 return 1;
331 } 344}
332 345
333long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) 346long
334 { 347BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg)
348{
335 int i; 349 int i;
336 350
337 i=iarg; 351 i = iarg;
338 return(BIO_ctrl(b,cmd,larg,(char *)&i)); 352 return (BIO_ctrl(b, cmd, larg,(char *)&i));
339 } 353}
340 354
341char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) 355char
342 { 356*BIO_ptr_ctrl(BIO *b, int cmd, long larg)
343 char *p=NULL; 357{
358 char *p = NULL;
344 359
345 if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) 360 if (BIO_ctrl(b, cmd, larg,(char *)&p) <= 0)
346 return(NULL); 361 return (NULL);
347 else 362 else
348 return(p); 363 return (p);
349 } 364}
350 365
351long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) 366long
352 { 367BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
368{
353 long ret; 369 long ret;
354 long (*cb)(BIO *,int,const char *,int,long,long); 370 long (*cb)(BIO *, int, const char *, int, long, long);
355 371
356 if (b == NULL) return(0); 372 if (b == NULL)
373 return (0);
357 374
358 if ((b->method == NULL) || (b->method->ctrl == NULL)) 375 if ((b->method == NULL) || (b->method->ctrl == NULL)) {
359 { 376 BIOerr(BIO_F_BIO_CTRL, BIO_R_UNSUPPORTED_METHOD);
360 BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); 377 return (-2);
361 return(-2); 378 }
362 }
363 379
364 cb=b->callback; 380 cb = b->callback;
365 381
366 if ((cb != NULL) && 382 if ((cb != NULL) &&
367 ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) 383 ((ret = cb(b, BIO_CB_CTRL, parg, cmd, larg, 1L)) <= 0))
368 return(ret); 384 return (ret);
369 385
370 ret=b->method->ctrl(b,cmd,larg,parg); 386 ret = b->method->ctrl(b, cmd, larg, parg);
371 387
372 if (cb != NULL) 388 if (cb != NULL)
373 ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, 389 ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN, parg, cmd, larg, ret);
374 larg,ret); 390 return (ret);
375 return(ret); 391}
376 }
377 392
378long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) 393long
379 { 394BIO_callback_ctrl(BIO *b, int cmd,
395 void (*fp)(struct bio_st *, int, const char *, int, long, long))
396{
380 long ret; 397 long ret;
381 long (*cb)(BIO *,int,const char *,int,long,long); 398 long (*cb)(BIO *, int, const char *, int, long, long);
382 399
383 if (b == NULL) return(0); 400 if (b == NULL)
401 return (0);
384 402
385 if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) 403 if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) {
386 { 404 BIOerr(BIO_F_BIO_CALLBACK_CTRL, BIO_R_UNSUPPORTED_METHOD);
387 BIOerr(BIO_F_BIO_CALLBACK_CTRL,BIO_R_UNSUPPORTED_METHOD); 405 return (-2);
388 return(-2); 406 }
389 }
390 407
391 cb=b->callback; 408 cb = b->callback;
392 409
393 if ((cb != NULL) && 410 if ((cb != NULL) &&
394 ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) 411 ((ret = cb(b, BIO_CB_CTRL,(void *)&fp, cmd, 0, 1L)) <= 0))
395 return(ret); 412 return (ret);
396 413
397 ret=b->method->callback_ctrl(b,cmd,fp); 414 ret = b->method->callback_ctrl(b, cmd, fp);
398 415
399 if (cb != NULL) 416 if (cb != NULL)
400 ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, 417 ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp, cmd, 0, ret);
401 0,ret); 418 return (ret);
402 return(ret); 419}
403 }
404 420
405/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros 421/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
406 * do; but those macros have inappropriate return type, and for interfacing 422 * do; but those macros have inappropriate return type, and for interfacing
407 * from other programming languages, C macros aren't much of a help anyway. */ 423 * from other programming languages, C macros aren't much of a help anyway. */
408size_t BIO_ctrl_pending(BIO *bio) 424size_t
409 { 425BIO_ctrl_pending(BIO *bio)
426{
410 return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); 427 return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL);
411 } 428}
412 429
413size_t BIO_ctrl_wpending(BIO *bio) 430size_t
414 { 431BIO_ctrl_wpending(BIO *bio)
432{
415 return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); 433 return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL);
416 } 434}
417 435
418 436
419/* put the 'bio' on the end of b's list of operators */ 437/* put the 'bio' on the end of b's list of operators */
420BIO *BIO_push(BIO *b, BIO *bio) 438BIO
421 { 439*BIO_push(BIO *b, BIO *bio)
440{
422 BIO *lb; 441 BIO *lb;
423 442
424 if (b == NULL) return(bio); 443 if (b == NULL)
425 lb=b; 444 return (bio);
445 lb = b;
426 while (lb->next_bio != NULL) 446 while (lb->next_bio != NULL)
427 lb=lb->next_bio; 447 lb = lb->next_bio;
428 lb->next_bio=bio; 448 lb->next_bio = bio;
429 if (bio != NULL) 449 if (bio != NULL)
430 bio->prev_bio=lb; 450 bio->prev_bio = lb;
431 /* called to do internal processing */ 451 /* called to do internal processing */
432 BIO_ctrl(b,BIO_CTRL_PUSH,0,lb); 452 BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb);
433 return(b); 453 return (b);
434 } 454}
435 455
436/* Remove the first and return the rest */ 456/* Remove the first and return the rest */
437BIO *BIO_pop(BIO *b) 457BIO
438 { 458*BIO_pop(BIO *b)
459{
439 BIO *ret; 460 BIO *ret;
440 461
441 if (b == NULL) return(NULL); 462 if (b == NULL)
442 ret=b->next_bio; 463 return (NULL);
464 ret = b->next_bio;
443 465
444 BIO_ctrl(b,BIO_CTRL_POP,0,b); 466 BIO_ctrl(b, BIO_CTRL_POP, 0, b);
445 467
446 if (b->prev_bio != NULL) 468 if (b->prev_bio != NULL)
447 b->prev_bio->next_bio=b->next_bio; 469 b->prev_bio->next_bio = b->next_bio;
448 if (b->next_bio != NULL) 470 if (b->next_bio != NULL)
449 b->next_bio->prev_bio=b->prev_bio; 471 b->next_bio->prev_bio = b->prev_bio;
450 472
451 b->next_bio=NULL; 473 b->next_bio = NULL;
452 b->prev_bio=NULL; 474 b->prev_bio = NULL;
453 return(ret); 475 return (ret);
454 } 476}
455 477
456BIO *BIO_get_retry_BIO(BIO *bio, int *reason) 478BIO
457 { 479*BIO_get_retry_BIO(BIO *bio, int *reason)
458 BIO *b,*last; 480{
481 BIO *b, *last;
459 482
460 b=last=bio; 483 b = last = bio;
461 for (;;) 484 for (;;) {
462 {
463 if (!BIO_should_retry(b)) break; 485 if (!BIO_should_retry(b)) break;
464 last=b; 486 last = b;
465 b=b->next_bio; 487 b = b->next_bio;
466 if (b == NULL) break; 488 if (b == NULL)
467 } 489 break;
468 if (reason != NULL) *reason=last->retry_reason; 490 }
469 return(last); 491 if (reason != NULL)
470 } 492 *reason = last->retry_reason;
493 return (last);
494}
471 495
472int BIO_get_retry_reason(BIO *bio) 496int
473 { 497BIO_get_retry_reason(BIO *bio)
474 return(bio->retry_reason); 498{
475 } 499 return (bio->retry_reason);
500}
476 501
477BIO *BIO_find_type(BIO *bio, int type) 502BIO
478 { 503*BIO_find_type(BIO *bio, int type)
479 int mt,mask; 504{
480 505 int mt, mask;
481 if(!bio) return NULL; 506
482 mask=type&0xff; 507 if (!bio)
483 do { 508 return NULL;
484 if (bio->method != NULL) 509 mask = type & 0xff;
485 { 510 do {
486 mt=bio->method->type; 511 if (bio->method != NULL) {
487 512 mt = bio->method->type;
488 if (!mask) 513 if (!mask) {
489 { 514 if (mt & type)
490 if (mt & type) return(bio); 515 return (bio);
491 } 516 } else if (mt == type)
492 else if (mt == type) 517 return (bio);
493 return(bio); 518 }
494 } 519 bio = bio->next_bio;
495 bio=bio->next_bio; 520 } while (bio != NULL);
496 } while (bio != NULL); 521 return (NULL);
497 return(NULL); 522}
498 }
499 523
500BIO *BIO_next(BIO *b) 524BIO
501 { 525*BIO_next(BIO *b)
502 if(!b) return NULL; 526{
527 if (!b)
528 return NULL;
503 return b->next_bio; 529 return b->next_bio;
504 } 530}
505 531
506void BIO_free_all(BIO *bio) 532void
507 { 533BIO_free_all(BIO *bio)
534{
508 BIO *b; 535 BIO *b;
509 int ref; 536 int ref;
510 537
511 while (bio != NULL) 538 while (bio != NULL) {
512 { 539 b = bio;
513 b=bio; 540 ref = b->references;
514 ref=b->references; 541 bio = bio->next_bio;
515 bio=bio->next_bio;
516 BIO_free(b); 542 BIO_free(b);
517 /* Since ref count > 1, don't free anyone else. */ 543 /* Since ref count > 1, don't free anyone else. */
518 if (ref > 1) break; 544 if (ref > 1)
519 } 545 break;
520 } 546 }
547}
521 548
522BIO *BIO_dup_chain(BIO *in) 549BIO
523 { 550*BIO_dup_chain(BIO *in)
524 BIO *ret=NULL,*eoc=NULL,*bio,*new_bio; 551{
552 BIO *ret = NULL, *eoc = NULL, *bio, *new_bio;
525 553
526 for (bio=in; bio != NULL; bio=bio->next_bio) 554 for (bio = in; bio != NULL; bio = bio->next_bio) {
527 { 555 if ((new_bio = BIO_new(bio->method)) == NULL) goto err;
528 if ((new_bio=BIO_new(bio->method)) == NULL) goto err; 556 new_bio->callback = bio->callback;
529 new_bio->callback=bio->callback; 557 new_bio->cb_arg = bio->cb_arg;
530 new_bio->cb_arg=bio->cb_arg; 558 new_bio->init = bio->init;
531 new_bio->init=bio->init; 559 new_bio->shutdown = bio->shutdown;
532 new_bio->shutdown=bio->shutdown; 560 new_bio->flags = bio->flags;
533 new_bio->flags=bio->flags;
534 561
535 /* This will let SSL_s_sock() work with stdin/stdout */ 562 /* This will let SSL_s_sock() work with stdin/stdout */
536 new_bio->num=bio->num; 563 new_bio->num = bio->num;
537 564
538 if (!BIO_dup_state(bio,(char *)new_bio)) 565 if (!BIO_dup_state(bio,(char *)new_bio)) {
539 {
540 BIO_free(new_bio); 566 BIO_free(new_bio);
541 goto err; 567 goto err;
542 } 568 }
543 569
544 /* copy app data */ 570 /* copy app data */
545 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, 571 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO,
546 &bio->ex_data)) 572 &new_bio->ex_data, &bio->ex_data))
547 goto err; 573 goto err;
548 574
549 if (ret == NULL) 575 if (ret == NULL) {
550 { 576 eoc = new_bio;
551 eoc=new_bio; 577 ret = eoc;
552 ret=eoc; 578 } else {
553 } 579 BIO_push(eoc, new_bio);
554 else 580 eoc = new_bio;
555 {
556 BIO_push(eoc,new_bio);
557 eoc=new_bio;
558 }
559 } 581 }
560 return(ret); 582 }
583 return (ret);
561err: 584err:
562 if (ret != NULL) 585 if (ret != NULL)
563 BIO_free(ret); 586 BIO_free(ret);
564 return(NULL); 587 return (NULL);
565 }
566 588
567void BIO_copy_next_retry(BIO *b) 589}
568 {
569 BIO_set_flags(b,BIO_get_retry_flags(b->next_bio));
570 b->retry_reason=b->next_bio->retry_reason;
571 }
572 590
573int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 591void
574 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) 592BIO_copy_next_retry(BIO *b)
575 { 593{
594 BIO_set_flags(b, BIO_get_retry_flags(b->next_bio));
595 b->retry_reason = b->next_bio->retry_reason;
596}
597
598int
599BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
600 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
601{
576 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, 602 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp,
577 new_func, dup_func, free_func); 603 new_func, dup_func, free_func);
578 } 604}
579 605
580int BIO_set_ex_data(BIO *bio, int idx, void *data) 606int
581 { 607BIO_set_ex_data(BIO *bio, int idx, void *data)
582 return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); 608{
583 } 609 return (CRYPTO_set_ex_data(&(bio->ex_data), idx, data));
610}
584 611
585void *BIO_get_ex_data(BIO *bio, int idx) 612void
586 { 613*BIO_get_ex_data(BIO *bio, int idx)
587 return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); 614{
588 } 615 return (CRYPTO_get_ex_data(&(bio->ex_data), idx));
616}
589 617
590unsigned long BIO_number_read(BIO *bio) 618unsigned long
619BIO_number_read(BIO *bio)
591{ 620{
592 if(bio) return bio->num_read; 621 if (bio)
622 return bio->num_read;
593 return 0; 623 return 0;
594} 624}
595 625
596unsigned long BIO_number_written(BIO *bio) 626unsigned long
627BIO_number_written(BIO *bio)
597{ 628{
598 if(bio) return bio->num_write; 629 if (bio)
630 return bio->num_write;
599 return 0; 631 return 0;
600} 632}
601 633
diff --git a/src/lib/libssl/src/crypto/bio/bss_acpt.c b/src/lib/libssl/src/crypto/bio/bss_acpt.c
index 04bfb6fb9d..d772515d64 100644
--- a/src/lib/libssl/src/crypto/bio/bss_acpt.c
+++ b/src/lib/libssl/src/crypto/bio/bss_acpt.c
@@ -75,8 +75,7 @@
75#undef FIONBIO 75#undef FIONBIO
76#endif 76#endif
77 77
78typedef struct bio_accept_st 78typedef struct bio_accept_st {
79 {
80 int state; 79 int state;
81 char *param_addr; 80 char *param_addr;
82 81
@@ -90,7 +89,7 @@ typedef struct bio_accept_st
90 * If 2, always use SO_REUSEADDR. */ 89 * If 2, always use SO_REUSEADDR. */
91 int bind_mode; 90 int bind_mode;
92 BIO *bio_chain; 91 BIO *bio_chain;
93 } BIO_ACCEPT; 92} BIO_ACCEPT;
94 93
95static int acpt_write(BIO *h, const char *buf, int num); 94static int acpt_write(BIO *h, const char *buf, int num);
96static int acpt_read(BIO *h, char *buf, int size); 95static int acpt_read(BIO *h, char *buf, int size);
@@ -107,8 +106,7 @@ static void BIO_ACCEPT_free(BIO_ACCEPT *a);
107#define ACPT_S_GET_ACCEPT_SOCKET 2 106#define ACPT_S_GET_ACCEPT_SOCKET 2
108#define ACPT_S_OK 3 107#define ACPT_S_OK 3
109 108
110static BIO_METHOD methods_acceptp= 109static BIO_METHOD methods_acceptp = {
111 {
112 BIO_TYPE_ACCEPT, 110 BIO_TYPE_ACCEPT,
113 "socket accept", 111 "socket accept",
114 acpt_write, 112 acpt_write,
@@ -119,321 +117,313 @@ static BIO_METHOD methods_acceptp=
119 acpt_new, 117 acpt_new,
120 acpt_free, 118 acpt_free,
121 NULL, 119 NULL,
122 }; 120};
123 121
124BIO_METHOD *BIO_s_accept(void) 122BIO_METHOD
125 { 123*BIO_s_accept(void)
126 return(&methods_acceptp); 124{
127 } 125 return (&methods_acceptp);
126}
128 127
129static int acpt_new(BIO *bi) 128static int
130 { 129acpt_new(BIO *bi)
130{
131 BIO_ACCEPT *ba; 131 BIO_ACCEPT *ba;
132 132
133 bi->init=0; 133 bi->init = 0;
134 bi->num=-1; 134 bi->num = -1;
135 bi->flags=0; 135 bi->flags = 0;
136 if ((ba=BIO_ACCEPT_new()) == NULL) 136 if ((ba = BIO_ACCEPT_new()) == NULL)
137 return(0); 137 return (0);
138 bi->ptr=(char *)ba; 138 bi->ptr = (char *)ba;
139 ba->state=ACPT_S_BEFORE; 139 ba->state = ACPT_S_BEFORE;
140 bi->shutdown=1; 140 bi->shutdown = 1;
141 return(1); 141 return (1);
142 } 142}
143 143
144static BIO_ACCEPT *BIO_ACCEPT_new(void) 144static BIO_ACCEPT
145 { 145*BIO_ACCEPT_new(void)
146{
146 BIO_ACCEPT *ret; 147 BIO_ACCEPT *ret;
147 148
148 if ((ret=(BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) 149 if ((ret = (BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL)
149 return(NULL); 150 return (NULL);
150 151
151 memset(ret,0,sizeof(BIO_ACCEPT)); 152 memset(ret, 0, sizeof(BIO_ACCEPT));
152 ret->accept_sock=-1; 153 ret->accept_sock = -1;
153 ret->bind_mode=BIO_BIND_NORMAL; 154 ret->bind_mode = BIO_BIND_NORMAL;
154 return(ret); 155 return (ret);
155 } 156}
156 157
157static void BIO_ACCEPT_free(BIO_ACCEPT *a) 158static void
158 { 159BIO_ACCEPT_free(BIO_ACCEPT *a)
159 if(a == NULL) 160{
160 return; 161 if (a == NULL)
161 162 return;
162 if (a->param_addr != NULL) OPENSSL_free(a->param_addr); 163
163 if (a->addr != NULL) OPENSSL_free(a->addr); 164 if (a->param_addr != NULL)
164 if (a->bio_chain != NULL) BIO_free(a->bio_chain); 165 OPENSSL_free(a->param_addr);
166 if (a->addr != NULL)
167 OPENSSL_free(a->addr);
168 if (a->bio_chain != NULL)
169 BIO_free(a->bio_chain);
165 OPENSSL_free(a); 170 OPENSSL_free(a);
166 } 171}
167 172
168static void acpt_close_socket(BIO *bio) 173static void
169 { 174acpt_close_socket(BIO *bio)
175{
170 BIO_ACCEPT *c; 176 BIO_ACCEPT *c;
171 177
172 c=(BIO_ACCEPT *)bio->ptr; 178 c = (BIO_ACCEPT *)bio->ptr;
173 if (c->accept_sock != -1) 179 if (c->accept_sock != -1) {
174 {
175 shutdown(c->accept_sock, SHUT_RDWR); 180 shutdown(c->accept_sock, SHUT_RDWR);
176 close(c->accept_sock); 181 close(c->accept_sock);
177 c->accept_sock=-1; 182 c->accept_sock = -1;
178 bio->num=-1; 183 bio->num = -1;
179 }
180 } 184 }
185}
181 186
182static int acpt_free(BIO *a) 187static int
183 { 188acpt_free(BIO *a)
189{
184 BIO_ACCEPT *data; 190 BIO_ACCEPT *data;
185 191
186 if (a == NULL) return(0); 192 if (a == NULL)
187 data=(BIO_ACCEPT *)a->ptr; 193 return (0);
188 194 data = (BIO_ACCEPT *)a->ptr;
189 if (a->shutdown) 195
190 { 196 if (a->shutdown) {
191 acpt_close_socket(a); 197 acpt_close_socket(a);
192 BIO_ACCEPT_free(data); 198 BIO_ACCEPT_free(data);
193 a->ptr=NULL; 199 a->ptr = NULL;
194 a->flags=0; 200 a->flags = 0;
195 a->init=0; 201 a->init = 0;
196 }
197 return(1);
198 } 202 }
199 203 return (1);
200static int acpt_state(BIO *b, BIO_ACCEPT *c) 204}
201 { 205
202 BIO *bio=NULL,*dbio; 206static int
203 int s= -1; 207acpt_state(BIO *b, BIO_ACCEPT *c)
208{
209 BIO *bio = NULL, *dbio;
210 int s = -1;
204 int i; 211 int i;
205 212
206again: 213again:
207 switch (c->state) 214 switch (c->state) {
208 {
209 case ACPT_S_BEFORE: 215 case ACPT_S_BEFORE:
210 if (c->param_addr == NULL) 216 if (c->param_addr == NULL) {
211 { 217 BIOerr(BIO_F_ACPT_STATE, BIO_R_NO_ACCEPT_PORT_SPECIFIED);
212 BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); 218 return (-1);
213 return(-1); 219 }
214 } 220 s = BIO_get_accept_socket(c->param_addr, c->bind_mode);
215 s=BIO_get_accept_socket(c->param_addr,c->bind_mode);
216 if (s == -1) 221 if (s == -1)
217 return(-1); 222 return (-1);
218 223
219 if (c->accept_nbio) 224 if (c->accept_nbio) {
220 { 225 if (!BIO_socket_nbio(s, 1)) {
221 if (!BIO_socket_nbio(s,1))
222 {
223 close(s); 226 close(s);
224 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); 227 BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET);
225 return(-1); 228 return (-1);
226 }
227 } 229 }
228 c->accept_sock=s; 230 }
229 b->num=s; 231 c->accept_sock = s;
230 c->state=ACPT_S_GET_ACCEPT_SOCKET; 232 b->num = s;
231 return(1); 233 c->state = ACPT_S_GET_ACCEPT_SOCKET;
234 return (1);
232 /* break; */ 235 /* break; */
233 case ACPT_S_GET_ACCEPT_SOCKET: 236 case ACPT_S_GET_ACCEPT_SOCKET:
234 if (b->next_bio != NULL) 237 if (b->next_bio != NULL) {
235 { 238 c->state = ACPT_S_OK;
236 c->state=ACPT_S_OK;
237 goto again; 239 goto again;
238 } 240 }
239 BIO_clear_retry_flags(b); 241 BIO_clear_retry_flags(b);
240 b->retry_reason=0; 242 b->retry_reason = 0;
241 i=BIO_accept(c->accept_sock,&(c->addr)); 243 i = BIO_accept(c->accept_sock, &(c->addr));
242 244
243 /* -2 return means we should retry */ 245 /* -2 return means we should retry */
244 if(i == -2) 246 if (i == -2) {
245 {
246 BIO_set_retry_special(b); 247 BIO_set_retry_special(b);
247 b->retry_reason=BIO_RR_ACCEPT; 248 b->retry_reason = BIO_RR_ACCEPT;
248 return -1; 249 return -1;
249 } 250 }
250 251
251 if (i < 0) return(i); 252 if (i < 0)
253 return (i);
252 254
253 bio=BIO_new_socket(i,BIO_CLOSE); 255 bio = BIO_new_socket(i, BIO_CLOSE);
254 if (bio == NULL) goto err; 256 if (bio == NULL)
257 goto err;
255 258
256 BIO_set_callback(bio,BIO_get_callback(b)); 259 BIO_set_callback(bio, BIO_get_callback(b));
257 BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); 260 BIO_set_callback_arg(bio, BIO_get_callback_arg(b));
258 261
259 if (c->nbio) 262 if (c->nbio) {
260 { 263 if (!BIO_socket_nbio(i, 1)) {
261 if (!BIO_socket_nbio(i,1)) 264 BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
262 {
263 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
264 goto err; 265 goto err;
265 }
266 } 266 }
267 }
267 268
268 /* If the accept BIO has an bio_chain, we dup it and 269 /* If the accept BIO has an bio_chain, we dup it and
269 * put the new socket at the end. */ 270 * put the new socket at the end. */
270 if (c->bio_chain != NULL) 271 if (c->bio_chain != NULL) {
271 { 272 if ((dbio = BIO_dup_chain(c->bio_chain)) == NULL)
272 if ((dbio=BIO_dup_chain(c->bio_chain)) == NULL)
273 goto err; 273 goto err;
274 if (!BIO_push(dbio,bio)) goto err; 274 if (!BIO_push(dbio, bio)) goto err;
275 bio=dbio; 275 bio = dbio;
276 } 276 }
277 if (BIO_push(b,bio) == NULL) goto err; 277 if (BIO_push(b, bio)
278 == NULL) goto err;
279
280 c->state = ACPT_S_OK;
281 return (1);
278 282
279 c->state=ACPT_S_OK;
280 return(1);
281err: 283err:
282 if (bio != NULL) 284 if (bio != NULL)
283 BIO_free(bio); 285 BIO_free(bio);
284 else if (s >= 0) 286 else if (s >= 0)
285 close(s); 287 close(s);
286 return(0); 288 return (0);
287 /* break; */ 289 /* break; */
288 case ACPT_S_OK: 290 case ACPT_S_OK:
289 if (b->next_bio == NULL) 291 if (b->next_bio == NULL) {
290 { 292 c->state = ACPT_S_GET_ACCEPT_SOCKET;
291 c->state=ACPT_S_GET_ACCEPT_SOCKET;
292 goto again; 293 goto again;
293 } 294 }
294 return(1); 295 return (1);
295 /* break; */ 296 /* break; */
296 default: 297 default:
297 return(0); 298 return (0);
298 /* break; */ 299 /* break; */
299 }
300
301 } 300 }
301}
302 302
303static int acpt_read(BIO *b, char *out, int outl) 303static int
304 { 304acpt_read(BIO *b, char *out, int outl)
305 int ret=0; 305{
306 int ret = 0;
306 BIO_ACCEPT *data; 307 BIO_ACCEPT *data;
307 308
308 BIO_clear_retry_flags(b); 309 BIO_clear_retry_flags(b);
309 data=(BIO_ACCEPT *)b->ptr; 310 data = (BIO_ACCEPT *)b->ptr;
310 311
311 while (b->next_bio == NULL) 312 while (b->next_bio == NULL) {
312 { 313 ret = acpt_state(b, data);
313 ret=acpt_state(b,data); 314 if (ret <= 0)
314 if (ret <= 0) return(ret); 315 return (ret);
315 } 316 }
316 317
317 ret=BIO_read(b->next_bio,out,outl); 318 ret = BIO_read(b->next_bio, out, outl);
318 BIO_copy_next_retry(b); 319 BIO_copy_next_retry(b);
319 return(ret); 320 return (ret);
320 } 321}
321 322
322static int acpt_write(BIO *b, const char *in, int inl) 323static int
323 { 324acpt_write(BIO *b, const char *in, int inl)
325{
324 int ret; 326 int ret;
325 BIO_ACCEPT *data; 327 BIO_ACCEPT *data;
326 328
327 BIO_clear_retry_flags(b); 329 BIO_clear_retry_flags(b);
328 data=(BIO_ACCEPT *)b->ptr; 330 data = (BIO_ACCEPT *)b->ptr;
329 331
330 while (b->next_bio == NULL) 332 while (b->next_bio == NULL) {
331 { 333 ret = acpt_state(b, data);
332 ret=acpt_state(b,data); 334 if (ret <= 0)
333 if (ret <= 0) return(ret); 335 return (ret);
334 } 336 }
335 337
336 ret=BIO_write(b->next_bio,in,inl); 338 ret = BIO_write(b->next_bio, in, inl);
337 BIO_copy_next_retry(b); 339 BIO_copy_next_retry(b);
338 return(ret); 340 return (ret);
339 } 341}
340 342
341static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) 343static long
342 { 344acpt_ctrl(BIO *b, int cmd, long num, void *ptr)
345{
343 int *ip; 346 int *ip;
344 long ret=1; 347 long ret = 1;
345 BIO_ACCEPT *data; 348 BIO_ACCEPT *data;
346 char **pp; 349 char **pp;
347 350
348 data=(BIO_ACCEPT *)b->ptr; 351 data = (BIO_ACCEPT *)b->ptr;
349 352
350 switch (cmd) 353 switch (cmd) {
351 {
352 case BIO_CTRL_RESET: 354 case BIO_CTRL_RESET:
353 ret=0; 355 ret = 0;
354 data->state=ACPT_S_BEFORE; 356 data->state = ACPT_S_BEFORE;
355 acpt_close_socket(b); 357 acpt_close_socket(b);
356 b->flags=0; 358 b->flags = 0;
357 break; 359 break;
358 case BIO_C_DO_STATE_MACHINE: 360 case BIO_C_DO_STATE_MACHINE:
359 /* use this one to start the connection */ 361 /* use this one to start the connection */
360 ret=(long)acpt_state(b,data); 362 ret = (long)acpt_state(b, data);
361 break; 363 break;
362 case BIO_C_SET_ACCEPT: 364 case BIO_C_SET_ACCEPT:
363 if (ptr != NULL) 365 if (ptr != NULL) {
364 { 366 if (num == 0) {
365 if (num == 0) 367 b->init = 1;
366 {
367 b->init=1;
368 if (data->param_addr != NULL) 368 if (data->param_addr != NULL)
369 OPENSSL_free(data->param_addr); 369 OPENSSL_free(data->param_addr);
370 data->param_addr=BUF_strdup(ptr); 370 data->param_addr = BUF_strdup(ptr);
371 } 371 } else if (num == 1) {
372 else if (num == 1) 372 data->accept_nbio = (ptr != NULL);
373 { 373 } else if (num == 2) {
374 data->accept_nbio=(ptr != NULL);
375 }
376 else if (num == 2)
377 {
378 if (data->bio_chain != NULL) 374 if (data->bio_chain != NULL)
379 BIO_free(data->bio_chain); 375 BIO_free(data->bio_chain);
380 data->bio_chain=(BIO *)ptr; 376 data->bio_chain = (BIO *)ptr;
381 }
382 } 377 }
378 }
383 break; 379 break;
384 case BIO_C_SET_NBIO: 380 case BIO_C_SET_NBIO:
385 data->nbio=(int)num; 381 data->nbio = (int)num;
386 break; 382 break;
387 case BIO_C_SET_FD: 383 case BIO_C_SET_FD:
388 b->init=1; 384 b->init = 1;
389 b->num= *((int *)ptr); 385 b->num= *((int *)ptr);
390 data->accept_sock=b->num; 386 data->accept_sock = b->num;
391 data->state=ACPT_S_GET_ACCEPT_SOCKET; 387 data->state = ACPT_S_GET_ACCEPT_SOCKET;
392 b->shutdown=(int)num; 388 b->shutdown = (int)num;
393 b->init=1; 389 b->init = 1;
394 break; 390 break;
395 case BIO_C_GET_FD: 391 case BIO_C_GET_FD:
396 if (b->init) 392 if (b->init) {
397 { 393 ip = (int *)ptr;
398 ip=(int *)ptr;
399 if (ip != NULL) 394 if (ip != NULL)
400 *ip=data->accept_sock; 395 *ip = data->accept_sock;
401 ret=data->accept_sock; 396 ret = data->accept_sock;
402 } 397 } else
403 else 398 ret = -1;
404 ret= -1;
405 break; 399 break;
406 case BIO_C_GET_ACCEPT: 400 case BIO_C_GET_ACCEPT:
407 if (b->init) 401 if (b->init) {
408 { 402 if (ptr != NULL) {
409 if (ptr != NULL) 403 pp = (char **)ptr;
410 { 404 *pp = data->param_addr;
411 pp=(char **)ptr; 405 } else
412 *pp=data->param_addr; 406 ret = -1;
413 } 407 } else
414 else 408 ret = -1;
415 ret= -1;
416 }
417 else
418 ret= -1;
419 break; 409 break;
420 case BIO_CTRL_GET_CLOSE: 410 case BIO_CTRL_GET_CLOSE:
421 ret=b->shutdown; 411 ret = b->shutdown;
422 break; 412 break;
423 case BIO_CTRL_SET_CLOSE: 413 case BIO_CTRL_SET_CLOSE:
424 b->shutdown=(int)num; 414 b->shutdown = (int)num;
425 break; 415 break;
426 case BIO_CTRL_PENDING: 416 case BIO_CTRL_PENDING:
427 case BIO_CTRL_WPENDING: 417 case BIO_CTRL_WPENDING:
428 ret=0; 418 ret = 0;
429 break; 419 break;
430 case BIO_CTRL_FLUSH: 420 case BIO_CTRL_FLUSH:
431 break; 421 break;
432 case BIO_C_SET_BIND_MODE: 422 case BIO_C_SET_BIND_MODE:
433 data->bind_mode=(int)num; 423 data->bind_mode = (int)num;
434 break; 424 break;
435 case BIO_C_GET_BIND_MODE: 425 case BIO_C_GET_BIND_MODE:
436 ret=(long)data->bind_mode; 426 ret = (long)data->bind_mode;
437 break; 427 break;
438 case BIO_CTRL_DUP: 428 case BIO_CTRL_DUP:
439/* dbio=(BIO *)ptr; 429/* dbio=(BIO *)ptr;
@@ -441,38 +431,41 @@ static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr)
441 BIO_set_port(dbio,data->param_port); 431 BIO_set_port(dbio,data->param_port);
442 if (data->param_hostname) 432 if (data->param_hostname)
443 BIO_set_hostname(dbio,data->param_hostname); 433 BIO_set_hostname(dbio,data->param_hostname);
444 BIO_set_nbio(dbio,data->nbio); */ 434 BIO_set_nbio(dbio,data->nbio);
435*/
445 break; 436 break;
446 437
447 default: 438 default:
448 ret=0; 439 ret = 0;
449 break; 440 break;
450 }
451 return(ret);
452 } 441 }
453 442 return (ret);
454static int acpt_puts(BIO *bp, const char *str) 443}
455 { 444
456 int n,ret; 445static int
457 446acpt_puts(BIO *bp, const char *str)
458 n=strlen(str); 447{
459 ret=acpt_write(bp,str,n); 448 int n, ret;
460 return(ret); 449
461 } 450 n = strlen(str);
462 451 ret = acpt_write(bp, str, n);
463BIO *BIO_new_accept(char *str) 452 return (ret);
464 { 453}
454
455BIO
456*BIO_new_accept(char *str)
457{
465 BIO *ret; 458 BIO *ret;
466 459
467 ret=BIO_new(BIO_s_accept()); 460 ret = BIO_new(BIO_s_accept());
468 if (ret == NULL) return(NULL); 461 if (ret == NULL)
469 if (BIO_set_accept_port(ret,str)) 462 return (NULL);
470 return(ret); 463 if (BIO_set_accept_port(ret, str))
471 else 464 return (ret);
472 { 465 else {
473 BIO_free(ret); 466 BIO_free(ret);
474 return(NULL); 467 return (NULL);
475 }
476 } 468 }
469}
477 470
478#endif 471#endif
diff --git a/src/lib/libssl/src/crypto/bio/bss_bio.c b/src/lib/libssl/src/crypto/bio/bss_bio.c
index 52ef0ebcb3..a74fcfdabc 100644
--- a/src/lib/libssl/src/crypto/bio/bss_bio.c
+++ b/src/lib/libssl/src/crypto/bio/bss_bio.c
@@ -103,8 +103,7 @@ static int bio_puts(BIO *bio, const char *str);
103static int bio_make_pair(BIO *bio1, BIO *bio2); 103static int bio_make_pair(BIO *bio1, BIO *bio2);
104static void bio_destroy_pair(BIO *bio); 104static void bio_destroy_pair(BIO *bio);
105 105
106static BIO_METHOD methods_biop = 106static BIO_METHOD methods_biop = {
107{
108 BIO_TYPE_BIO, 107 BIO_TYPE_BIO,
109 "BIO pair", 108 "BIO pair",
110 bio_write, 109 bio_write,
@@ -117,50 +116,51 @@ static BIO_METHOD methods_biop =
117 NULL /* no bio_callback_ctrl */ 116 NULL /* no bio_callback_ctrl */
118}; 117};
119 118
120BIO_METHOD *BIO_s_bio(void) 119BIO_METHOD
121 { 120*BIO_s_bio(void)
121{
122 return &methods_biop; 122 return &methods_biop;
123 } 123}
124
125struct bio_bio_st {
126 BIO *peer; /* NULL if buf == NULL.
127 * If peer != NULL, then peer->ptr is also a bio_bio_st,
128 * and its "peer" member points back to us.
129 * peer != NULL iff init != 0 in the BIO. */
124 130
125struct bio_bio_st
126{
127 BIO *peer; /* NULL if buf == NULL.
128 * If peer != NULL, then peer->ptr is also a bio_bio_st,
129 * and its "peer" member points back to us.
130 * peer != NULL iff init != 0 in the BIO. */
131
132 /* This is for what we write (i.e. reading uses peer's struct): */ 131 /* This is for what we write (i.e. reading uses peer's struct): */
133 int closed; /* valid iff peer != NULL */ 132 int closed; /* valid iff peer != NULL */
134 size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ 133 size_t len; /* valid iff buf != NULL; 0 if peer == NULL */
135 size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ 134 size_t offset; /* valid iff buf != NULL; 0 if len == 0 */
136 size_t size; 135 size_t size;
137 char *buf; /* "size" elements (if != NULL) */ 136 char *buf; /* "size" elements (if != NULL) */
138 137
139 size_t request; /* valid iff peer != NULL; 0 if len != 0, 138 size_t request; /* valid iff peer != NULL; 0 if len != 0,
140 * otherwise set by peer to number of bytes 139 * otherwise set by peer to number of bytes
141 * it (unsuccessfully) tried to read, 140 * it (unsuccessfully) tried to read,
142 * never more than buffer space (size-len) warrants. */ 141 * never more than buffer space (size-len) warrants. */
143}; 142};
144 143
145static int bio_new(BIO *bio) 144static int
146 { 145bio_new(BIO *bio)
146{
147 struct bio_bio_st *b; 147 struct bio_bio_st *b;
148 148
149 b = OPENSSL_malloc(sizeof *b); 149 b = OPENSSL_malloc(sizeof *b);
150 if (b == NULL) 150 if (b == NULL)
151 return 0; 151 return 0;
152 152
153 b->peer = NULL; 153 b->peer = NULL;
154 b->size = 17*1024; /* enough for one TLS record (just a default) */ 154 b->size = 17 * 1024; /* enough for one TLS record (just a default) */
155 b->buf = NULL; 155 b->buf = NULL;
156 156
157 bio->ptr = b; 157 bio->ptr = b;
158 return 1; 158 return 1;
159 } 159}
160 160
161 161static int
162static int bio_free(BIO *bio) 162bio_free(BIO *bio)
163 { 163{
164 struct bio_bio_st *b; 164 struct bio_bio_st *b;
165 165
166 if (bio == NULL) 166 if (bio == NULL)
@@ -171,21 +171,21 @@ static int bio_free(BIO *bio)
171 171
172 if (b->peer) 172 if (b->peer)
173 bio_destroy_pair(bio); 173 bio_destroy_pair(bio);
174 174
175 if (b->buf != NULL) 175 if (b->buf != NULL) {
176 {
177 OPENSSL_free(b->buf); 176 OPENSSL_free(b->buf);
178 } 177 }
179 178
180 OPENSSL_free(b); 179 OPENSSL_free(b);
181 180
182 return 1; 181 return 1;
183 } 182}
184 183
185 184
186 185
187static int bio_read(BIO *bio, char *buf, int size_) 186static int
188 { 187bio_read(BIO *bio, char *buf, int size_)
188{
189 size_t size = size_; 189 size_t size = size_;
190 size_t rest; 190 size_t rest;
191 struct bio_bio_st *b, *peer_b; 191 struct bio_bio_st *b, *peer_b;
@@ -207,12 +207,10 @@ static int bio_read(BIO *bio, char *buf, int size_)
207 if (buf == NULL || size == 0) 207 if (buf == NULL || size == 0)
208 return 0; 208 return 0;
209 209
210 if (peer_b->len == 0) 210 if (peer_b->len == 0) {
211 {
212 if (peer_b->closed) 211 if (peer_b->closed)
213 return 0; /* writer has closed, and no data is left */ 212 return 0; /* writer has closed, and no data is left */
214 else 213 else {
215 {
216 BIO_set_retry_read(bio); /* buffer is empty */ 214 BIO_set_retry_read(bio); /* buffer is empty */
217 if (size <= peer_b->size) 215 if (size <= peer_b->size)
218 peer_b->request = size; 216 peer_b->request = size;
@@ -221,22 +219,22 @@ static int bio_read(BIO *bio, char *buf, int size_)
221 * deliver in one write */ 219 * deliver in one write */
222 peer_b->request = peer_b->size; 220 peer_b->request = peer_b->size;
223 return -1; 221 return -1;
224 }
225 } 222 }
223 }
226 224
227 /* we can read */ 225 /* we can read */
228 if (peer_b->len < size) 226 if (peer_b->len < size)
229 size = peer_b->len; 227 size = peer_b->len;
230 228
231 /* now read "size" bytes */ 229 /* now read "size" bytes */
232 230
233 rest = size; 231 rest = size;
234 232
235 assert(rest > 0); 233 assert(rest > 0);
236 do /* one or two iterations */ 234 do /* one or two iterations */
237 { 235 {
238 size_t chunk; 236 size_t chunk;
239 237
240 assert(rest <= peer_b->len); 238 assert(rest <= peer_b->len);
241 if (peer_b->offset + rest <= peer_b->size) 239 if (peer_b->offset + rest <= peer_b->size)
242 chunk = rest; 240 chunk = rest;
@@ -244,30 +242,26 @@ static int bio_read(BIO *bio, char *buf, int size_)
244 /* wrap around ring buffer */ 242 /* wrap around ring buffer */
245 chunk = peer_b->size - peer_b->offset; 243 chunk = peer_b->size - peer_b->offset;
246 assert(peer_b->offset + chunk <= peer_b->size); 244 assert(peer_b->offset + chunk <= peer_b->size);
247 245
248 memcpy(buf, peer_b->buf + peer_b->offset, chunk); 246 memcpy(buf, peer_b->buf + peer_b->offset, chunk);
249 247
250 peer_b->len -= chunk; 248 peer_b->len -= chunk;
251 if (peer_b->len) 249 if (peer_b->len) {
252 {
253 peer_b->offset += chunk; 250 peer_b->offset += chunk;
254 assert(peer_b->offset <= peer_b->size); 251 assert(peer_b->offset <= peer_b->size);
255 if (peer_b->offset == peer_b->size) 252 if (peer_b->offset == peer_b->size)
256 peer_b->offset = 0; 253 peer_b->offset = 0;
257 buf += chunk; 254 buf += chunk;
258 } 255 } else {
259 else
260 {
261 /* buffer now empty, no need to advance "buf" */ 256 /* buffer now empty, no need to advance "buf" */
262 assert(chunk == rest); 257 assert(chunk == rest);
263 peer_b->offset = 0; 258 peer_b->offset = 0;
264 }
265 rest -= chunk;
266 } 259 }
267 while (rest); 260 rest -= chunk;
268 261 } while (rest);
262
269 return size; 263 return size;
270 } 264}
271 265
272/* non-copying interface: provide pointer to available data in buffer 266/* non-copying interface: provide pointer to available data in buffer
273 * bio_nread0: return number of available bytes 267 * bio_nread0: return number of available bytes
@@ -277,32 +271,32 @@ static int bio_read(BIO *bio, char *buf, int size_)
277 */ 271 */
278/* WARNING: The non-copying interface is largely untested as of yet 272/* WARNING: The non-copying interface is largely untested as of yet
279 * and may contain bugs. */ 273 * and may contain bugs. */
280static ossl_ssize_t bio_nread0(BIO *bio, char **buf) 274static ossl_ssize_t
281 { 275bio_nread0(BIO *bio, char **buf)
276{
282 struct bio_bio_st *b, *peer_b; 277 struct bio_bio_st *b, *peer_b;
283 ossl_ssize_t num; 278 ossl_ssize_t num;
284 279
285 BIO_clear_retry_flags(bio); 280 BIO_clear_retry_flags(bio);
286 281
287 if (!bio->init) 282 if (!bio->init)
288 return 0; 283 return 0;
289 284
290 b = bio->ptr; 285 b = bio->ptr;
291 assert(b != NULL); 286 assert(b != NULL);
292 assert(b->peer != NULL); 287 assert(b->peer != NULL);
293 peer_b = b->peer->ptr; 288 peer_b = b->peer->ptr;
294 assert(peer_b != NULL); 289 assert(peer_b != NULL);
295 assert(peer_b->buf != NULL); 290 assert(peer_b->buf != NULL);
296 291
297 peer_b->request = 0; 292 peer_b->request = 0;
298 293
299 if (peer_b->len == 0) 294 if (peer_b->len == 0) {
300 {
301 char dummy; 295 char dummy;
302 296
303 /* avoid code duplication -- nothing available for reading */ 297 /* avoid code duplication -- nothing available for reading */
304 return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ 298 return bio_read(bio, &dummy, 1); /* returns 0 or -1 */
305 } 299 }
306 300
307 num = peer_b->len; 301 num = peer_b->len;
308 if (peer_b->size < peer_b->offset + num) 302 if (peer_b->size < peer_b->offset + num)
@@ -313,10 +307,11 @@ static ossl_ssize_t bio_nread0(BIO *bio, char **buf)
313 if (buf != NULL) 307 if (buf != NULL)
314 *buf = peer_b->buf + peer_b->offset; 308 *buf = peer_b->buf + peer_b->offset;
315 return num; 309 return num;
316 } 310}
317 311
318static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) 312static ossl_ssize_t
319 { 313bio_nread(BIO *bio, char **buf, size_t num_)
314{
320 struct bio_bio_st *b, *peer_b; 315 struct bio_bio_st *b, *peer_b;
321 ossl_ssize_t num, available; 316 ossl_ssize_t num, available;
322 317
@@ -335,22 +330,21 @@ static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_)
335 peer_b = b->peer->ptr; 330 peer_b = b->peer->ptr;
336 331
337 peer_b->len -= num; 332 peer_b->len -= num;
338 if (peer_b->len) 333 if (peer_b->len) {
339 {
340 peer_b->offset += num; 334 peer_b->offset += num;
341 assert(peer_b->offset <= peer_b->size); 335 assert(peer_b->offset <= peer_b->size);
342 if (peer_b->offset == peer_b->size) 336 if (peer_b->offset == peer_b->size)
343 peer_b->offset = 0; 337 peer_b->offset = 0;
344 } 338 } else
345 else
346 peer_b->offset = 0; 339 peer_b->offset = 0;
347 340
348 return num; 341 return num;
349 } 342}
350 343
351 344
352static int bio_write(BIO *bio, const char *buf, int num_) 345static int
353 { 346bio_write(BIO *bio, const char *buf, int num_)
347{
354 size_t num = num_; 348 size_t num = num_;
355 size_t rest; 349 size_t rest;
356 struct bio_bio_st *b; 350 struct bio_bio_st *b;
@@ -360,38 +354,37 @@ static int bio_write(BIO *bio, const char *buf, int num_)
360 if (!bio->init || buf == NULL || num == 0) 354 if (!bio->init || buf == NULL || num == 0)
361 return 0; 355 return 0;
362 356
363 b = bio->ptr; 357 b = bio->ptr;
358
364 assert(b != NULL); 359 assert(b != NULL);
365 assert(b->peer != NULL); 360 assert(b->peer != NULL);
366 assert(b->buf != NULL); 361 assert(b->buf != NULL);
367 362
368 b->request = 0; 363 b->request = 0;
369 if (b->closed) 364 if (b->closed) {
370 {
371 /* we already closed */ 365 /* we already closed */
372 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); 366 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE);
373 return -1; 367 return -1;
374 } 368 }
375 369
376 assert(b->len <= b->size); 370 assert(b->len <= b->size);
377 371
378 if (b->len == b->size) 372 if (b->len == b->size) {
379 {
380 BIO_set_retry_write(bio); /* buffer is full */ 373 BIO_set_retry_write(bio); /* buffer is full */
381 return -1; 374 return -1;
382 } 375 }
383 376
384 /* we can write */ 377 /* we can write */
385 if (num > b->size - b->len) 378 if (num > b->size - b->len)
386 num = b->size - b->len; 379 num = b->size - b->len;
387 380
388 /* now write "num" bytes */ 381 /* now write "num" bytes */
389 382
390 rest = num; 383 rest = num;
391 384
392 assert(rest > 0); 385 assert(rest > 0);
393 do /* one or two iterations */ 386 do /* one or two iterations */
394 { 387 {
395 size_t write_offset; 388 size_t write_offset;
396 size_t chunk; 389 size_t chunk;
397 390
@@ -407,20 +400,19 @@ static int bio_write(BIO *bio, const char *buf, int num_)
407 else 400 else
408 /* wrap around ring buffer */ 401 /* wrap around ring buffer */
409 chunk = b->size - write_offset; 402 chunk = b->size - write_offset;
410 403
411 memcpy(b->buf + write_offset, buf, chunk); 404 memcpy(b->buf + write_offset, buf, chunk);
412 405
413 b->len += chunk; 406 b->len += chunk;
414 407
415 assert(b->len <= b->size); 408 assert(b->len <= b->size);
416 409
417 rest -= chunk; 410 rest -= chunk;
418 buf += chunk; 411 buf += chunk;
419 } 412 } while (rest);
420 while (rest);
421 413
422 return num; 414 return num;
423 } 415}
424 416
425/* non-copying interface: provide pointer to region to write to 417/* non-copying interface: provide pointer to region to write to
426 * bio_nwrite0: check how much space is available 418 * bio_nwrite0: check how much space is available
@@ -428,8 +420,9 @@ static int bio_write(BIO *bio, const char *buf, int num_)
428 * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() 420 * (example usage: bio_nwrite0(), write to buffer, bio_nwrite()
429 * or just bio_nwrite(), write to buffer) 421 * or just bio_nwrite(), write to buffer)
430 */ 422 */
431static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) 423static ossl_ssize_t
432 { 424bio_nwrite0(BIO *bio, char **buf)
425{
433 struct bio_bio_st *b; 426 struct bio_bio_st *b;
434 size_t num; 427 size_t num;
435 size_t write_offset; 428 size_t write_offset;
@@ -439,25 +432,24 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf)
439 if (!bio->init) 432 if (!bio->init)
440 return 0; 433 return 0;
441 434
442 b = bio->ptr; 435 b = bio->ptr;
436
443 assert(b != NULL); 437 assert(b != NULL);
444 assert(b->peer != NULL); 438 assert(b->peer != NULL);
445 assert(b->buf != NULL); 439 assert(b->buf != NULL);
446 440
447 b->request = 0; 441 b->request = 0;
448 if (b->closed) 442 if (b->closed) {
449 {
450 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); 443 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE);
451 return -1; 444 return -1;
452 } 445 }
453 446
454 assert(b->len <= b->size); 447 assert(b->len <= b->size);
455 448
456 if (b->len == b->size) 449 if (b->len == b->size) {
457 {
458 BIO_set_retry_write(bio); 450 BIO_set_retry_write(bio);
459 return -1; 451 return -1;
460 } 452 }
461 453
462 num = b->size - b->len; 454 num = b->size - b->len;
463 write_offset = b->offset + b->len; 455 write_offset = b->offset + b->len;
@@ -474,10 +466,11 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf)
474 assert(write_offset + num <= b->size); 466 assert(write_offset + num <= b->size);
475 467
476 return num; 468 return num;
477 } 469}
478 470
479static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) 471static ossl_ssize_t
480 { 472bio_nwrite(BIO *bio, char **buf, size_t num_)
473{
481 struct bio_bio_st *b; 474 struct bio_bio_st *b;
482 ossl_ssize_t num, space; 475 ossl_ssize_t num, space;
483 476
@@ -497,46 +490,39 @@ static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_)
497 assert(b->len <= b->size); 490 assert(b->len <= b->size);
498 491
499 return num; 492 return num;
500 } 493}
501 494
502 495
503static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) 496static long
504 { 497bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
498{
505 long ret; 499 long ret;
506 struct bio_bio_st *b = bio->ptr; 500 struct bio_bio_st *b = bio->ptr;
507 501
508 assert(b != NULL); 502 assert(b != NULL);
509 503
510 switch (cmd) 504 switch (cmd) {
511 { 505 /* specific CTRL codes */
512 /* specific CTRL codes */
513 506
514 case BIO_C_SET_WRITE_BUF_SIZE: 507 case BIO_C_SET_WRITE_BUF_SIZE:
515 if (b->peer) 508 if (b->peer) {
516 {
517 BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); 509 BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE);
518 ret = 0; 510 ret = 0;
519 } 511 } else if (num == 0) {
520 else if (num == 0)
521 {
522 BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); 512 BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT);
523 ret = 0; 513 ret = 0;
524 } 514 } else {
525 else
526 {
527 size_t new_size = num; 515 size_t new_size = num;
528 516
529 if (b->size != new_size) 517 if (b->size != new_size) {
530 { 518 if (b->buf) {
531 if (b->buf)
532 {
533 OPENSSL_free(b->buf); 519 OPENSSL_free(b->buf);
534 b->buf = NULL; 520 b->buf = NULL;
535 }
536 b->size = new_size;
537 } 521 }
538 ret = 1; 522 b->size = new_size;
539 } 523 }
524 ret = 1;
525 }
540 break; 526 break;
541 527
542 case BIO_C_GET_WRITE_BUF_SIZE: 528 case BIO_C_GET_WRITE_BUF_SIZE:
@@ -545,15 +531,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
545 531
546 case BIO_C_MAKE_BIO_PAIR: 532 case BIO_C_MAKE_BIO_PAIR:
547 { 533 {
548 BIO *other_bio = ptr; 534 BIO *other_bio = ptr;
549 535
550 if (bio_make_pair(bio, other_bio)) 536 if (bio_make_pair(bio, other_bio))
551 ret = 1; 537 ret = 1;
552 else 538 else
553 ret = 0; 539 ret = 0;
554 } 540 }
555 break; 541 break;
556 542
557 case BIO_C_DESTROY_BIO_PAIR: 543 case BIO_C_DESTROY_BIO_PAIR:
558 /* Affects both BIOs in the pair -- call just once! 544 /* Affects both BIOs in the pair -- call just once!
559 * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ 545 * Or let BIO_free(bio1); BIO_free(bio2); do the job. */
@@ -596,12 +582,12 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
596 /* prepare for non-copying read */ 582 /* prepare for non-copying read */
597 ret = (long) bio_nread0(bio, ptr); 583 ret = (long) bio_nread0(bio, ptr);
598 break; 584 break;
599 585
600 case BIO_C_NREAD: 586 case BIO_C_NREAD:
601 /* non-copying read */ 587 /* non-copying read */
602 ret = (long) bio_nread(bio, ptr, (size_t) num); 588 ret = (long) bio_nread(bio, ptr, (size_t) num);
603 break; 589 break;
604 590
605 case BIO_C_NWRITE0: 591 case BIO_C_NWRITE0:
606 /* prepare for non-copying write */ 592 /* prepare for non-copying write */
607 ret = (long) bio_nwrite0(bio, ptr); 593 ret = (long) bio_nwrite0(bio, ptr);
@@ -611,18 +597,18 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
611 /* non-copying write */ 597 /* non-copying write */
612 ret = (long) bio_nwrite(bio, ptr, (size_t) num); 598 ret = (long) bio_nwrite(bio, ptr, (size_t) num);
613 break; 599 break;
614
615 600
616 /* standard CTRL codes follow */ 601
602 /* standard CTRL codes follow */
617 603
618 case BIO_CTRL_RESET: 604 case BIO_CTRL_RESET:
619 if (b->buf != NULL) 605 if (b->buf != NULL) {
620 {
621 b->len = 0; 606 b->len = 0;
622 b->offset = 0; 607 b->offset = 0;
623 } 608 }
624 ret = 0; 609 ret = 0;
625 break; 610 break;
611
626 612
627 case BIO_CTRL_GET_CLOSE: 613 case BIO_CTRL_GET_CLOSE:
628 ret = bio->shutdown; 614 ret = bio->shutdown;
@@ -634,13 +620,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
634 break; 620 break;
635 621
636 case BIO_CTRL_PENDING: 622 case BIO_CTRL_PENDING:
637 if (b->peer != NULL) 623 if (b->peer != NULL) {
638 {
639 struct bio_bio_st *peer_b = b->peer->ptr; 624 struct bio_bio_st *peer_b = b->peer->ptr;
640 625
641 ret = (long) peer_b->len; 626 ret = (long) peer_b->len;
642 } 627 } else
643 else
644 ret = 0; 628 ret = 0;
645 break; 629 break;
646 630
@@ -654,16 +638,16 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
654 case BIO_CTRL_DUP: 638 case BIO_CTRL_DUP:
655 /* See BIO_dup_chain for circumstances we have to expect. */ 639 /* See BIO_dup_chain for circumstances we have to expect. */
656 { 640 {
657 BIO *other_bio = ptr; 641 BIO *other_bio = ptr;
658 struct bio_bio_st *other_b; 642 struct bio_bio_st *other_b;
659 643
660 assert(other_bio != NULL); 644 assert(other_bio != NULL);
661 other_b = other_bio->ptr; 645 other_b = other_bio->ptr;
662 assert(other_b != NULL); 646 assert(other_b != NULL);
663 647
664 assert(other_b->buf == NULL); /* other_bio is always fresh */ 648 assert(other_b->buf == NULL); /* other_bio is always fresh */
665 649
666 other_b->size = b->size; 650 other_b->size = b->size;
667 } 651 }
668 652
669 ret = 1; 653 ret = 1;
@@ -675,34 +659,34 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
675 659
676 case BIO_CTRL_EOF: 660 case BIO_CTRL_EOF:
677 { 661 {
678 BIO *other_bio = ptr; 662 BIO *other_bio = ptr;
679 663
680 if (other_bio) 664 if (other_bio) {
681 { 665 struct bio_bio_st *other_b = other_bio->ptr;
682 struct bio_bio_st *other_b = other_bio->ptr; 666
683 667 assert(other_b != NULL);
684 assert(other_b != NULL); 668 ret = other_b->len == 0 && other_b->closed;
685 ret = other_b->len == 0 && other_b->closed; 669 } else
686 } 670 ret = 1;
687 else
688 ret = 1;
689 } 671 }
690 break; 672 break;
691 673
692 default: 674 default:
693 ret = 0; 675 ret = 0;
694 }
695 return ret;
696 } 676 }
677 return ret;
678}
697 679
698static int bio_puts(BIO *bio, const char *str) 680static int
699 { 681bio_puts(BIO *bio, const char *str)
682{
700 return bio_write(bio, str, strlen(str)); 683 return bio_write(bio, str, strlen(str));
701 } 684}
702 685
703 686
704static int bio_make_pair(BIO *bio1, BIO *bio2) 687static int
705 { 688bio_make_pair(BIO *bio1, BIO *bio2)
689{
706 struct bio_bio_st *b1, *b2; 690 struct bio_bio_st *b1, *b2;
707 691
708 assert(bio1 != NULL); 692 assert(bio1 != NULL);
@@ -710,37 +694,32 @@ static int bio_make_pair(BIO *bio1, BIO *bio2)
710 694
711 b1 = bio1->ptr; 695 b1 = bio1->ptr;
712 b2 = bio2->ptr; 696 b2 = bio2->ptr;
713 697
714 if (b1->peer != NULL || b2->peer != NULL) 698 if (b1->peer != NULL || b2->peer != NULL) {
715 {
716 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); 699 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE);
717 return 0; 700 return 0;
718 } 701 }
719 702
720 if (b1->buf == NULL) 703 if (b1->buf == NULL) {
721 {
722 b1->buf = OPENSSL_malloc(b1->size); 704 b1->buf = OPENSSL_malloc(b1->size);
723 if (b1->buf == NULL) 705 if (b1->buf == NULL) {
724 {
725 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); 706 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
726 return 0; 707 return 0;
727 } 708 }
728 b1->len = 0; 709 b1->len = 0;
729 b1->offset = 0; 710 b1->offset = 0;
730 } 711 }
731 712
732 if (b2->buf == NULL) 713 if (b2->buf == NULL) {
733 {
734 b2->buf = OPENSSL_malloc(b2->size); 714 b2->buf = OPENSSL_malloc(b2->size);
735 if (b2->buf == NULL) 715 if (b2->buf == NULL) {
736 {
737 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); 716 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
738 return 0; 717 return 0;
739 } 718 }
740 b2->len = 0; 719 b2->len = 0;
741 b2->offset = 0; 720 b2->offset = 0;
742 } 721 }
743 722
744 b1->peer = bio2; 723 b1->peer = bio2;
745 b1->closed = 0; 724 b1->closed = 0;
746 b1->request = 0; 725 b1->request = 0;
@@ -752,18 +731,17 @@ static int bio_make_pair(BIO *bio1, BIO *bio2)
752 bio2->init = 1; 731 bio2->init = 1;
753 732
754 return 1; 733 return 1;
755 } 734}
756 735
757static void bio_destroy_pair(BIO *bio) 736static void
758 { 737bio_destroy_pair(BIO *bio)
738{
759 struct bio_bio_st *b = bio->ptr; 739 struct bio_bio_st *b = bio->ptr;
760 740
761 if (b != NULL) 741 if (b != NULL) {
762 {
763 BIO *peer_bio = b->peer; 742 BIO *peer_bio = b->peer;
764 743
765 if (peer_bio != NULL) 744 if (peer_bio != NULL) {
766 {
767 struct bio_bio_st *peer_b = peer_bio->ptr; 745 struct bio_bio_st *peer_b = peer_bio->ptr;
768 746
769 assert(peer_b != NULL); 747 assert(peer_b != NULL);
@@ -774,151 +752,149 @@ static void bio_destroy_pair(BIO *bio)
774 assert(peer_b->buf != NULL); 752 assert(peer_b->buf != NULL);
775 peer_b->len = 0; 753 peer_b->len = 0;
776 peer_b->offset = 0; 754 peer_b->offset = 0;
777 755
778 b->peer = NULL; 756 b->peer = NULL;
779 bio->init = 0; 757 bio->init = 0;
780 assert(b->buf != NULL); 758 assert(b->buf != NULL);
781 b->len = 0; 759 b->len = 0;
782 b->offset = 0; 760 b->offset = 0;
783 }
784 } 761 }
785 } 762 }
786 763}
764
787 765
788/* Exported convenience functions */ 766/* Exported convenience functions */
789int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, 767int
790 BIO **bio2_p, size_t writebuf2) 768BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, BIO **bio2_p, size_t writebuf2)
791 { 769{
792 BIO *bio1 = NULL, *bio2 = NULL; 770 BIO *bio1 = NULL, *bio2 = NULL;
793 long r; 771 long r;
794 int ret = 0; 772 int ret = 0;
795 773
796 bio1 = BIO_new(BIO_s_bio()); 774 bio1 = BIO_new(BIO_s_bio());
797 if (bio1 == NULL) 775 if (bio1 == NULL)
798 goto err; 776 goto err;
799 bio2 = BIO_new(BIO_s_bio()); 777 bio2 = BIO_new(BIO_s_bio());
800 if (bio2 == NULL) 778 if (bio2 == NULL)
801 goto err; 779 goto err;
802 780
803 if (writebuf1) 781 if (writebuf1) {
804 { 782 r = BIO_set_write_buf_size(bio1, writebuf1);
805 r = BIO_set_write_buf_size(bio1, writebuf1); 783 if (!r)
806 if (!r) 784 goto err;
807 goto err; 785 }
808 } 786 if (writebuf2) {
809 if (writebuf2) 787 r = BIO_set_write_buf_size(bio2, writebuf2);
810 { 788 if (!r)
811 r = BIO_set_write_buf_size(bio2, writebuf2); 789 goto err;
812 if (!r)
813 goto err;
814 }
815
816 r = BIO_make_bio_pair(bio1, bio2);
817 if (!r)
818 goto err;
819 ret = 1;
820
821 err:
822 if (ret == 0)
823 {
824 if (bio1)
825 {
826 BIO_free(bio1);
827 bio1 = NULL;
828 }
829 if (bio2)
830 {
831 BIO_free(bio2);
832 bio2 = NULL;
833 }
834 }
835
836 *bio1_p = bio1;
837 *bio2_p = bio2;
838 return ret;
839 }
840
841size_t BIO_ctrl_get_write_guarantee(BIO *bio)
842 {
843 return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
844 } 790 }
845 791
846size_t BIO_ctrl_get_read_request(BIO *bio) 792 r = BIO_make_bio_pair(bio1, bio2);
847 { 793 if (!r)
848 return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); 794 goto err;
795 ret = 1;
796
797 err:
798 if (ret == 0) {
799 if (bio1) {
800 BIO_free(bio1);
801 bio1 = NULL;
802 }
803 if (bio2) {
804 BIO_free(bio2);
805 bio2 = NULL;
806 }
849 } 807 }
850 808
851int BIO_ctrl_reset_read_request(BIO *bio) 809 *bio1_p = bio1;
852 { 810 *bio2_p = bio2;
811 return ret;
812}
813
814size_t
815BIO_ctrl_get_write_guarantee(BIO *bio)
816{
817 return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
818}
819
820size_t
821BIO_ctrl_get_read_request(BIO *bio)
822{
823 return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL);
824}
825
826int
827BIO_ctrl_reset_read_request(BIO *bio)
828{
853 return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); 829 return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0);
854 } 830}
855 831
856 832
857/* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now 833/* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now
858 * (conceivably some other BIOs could allow non-copying reads and writes too.) 834 * (conceivably some other BIOs could allow non-copying reads and writes too.)
859 */ 835 */
860int BIO_nread0(BIO *bio, char **buf) 836int
861 { 837BIO_nread0(BIO *bio, char **buf)
838{
862 long ret; 839 long ret;
863 840
864 if (!bio->init) 841 if (!bio->init) {
865 {
866 BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); 842 BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED);
867 return -2; 843 return -2;
868 } 844 }
869 845
870 ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); 846 ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf);
871 if (ret > INT_MAX) 847 if (ret > INT_MAX)
872 return INT_MAX; 848 return INT_MAX;
873 else 849 else
874 return (int) ret; 850 return (int) ret;
875 } 851}
876 852
877int BIO_nread(BIO *bio, char **buf, int num) 853int
878 { 854BIO_nread(BIO *bio, char **buf, int num)
855{
879 int ret; 856 int ret;
880 857
881 if (!bio->init) 858 if (!bio->init) {
882 {
883 BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); 859 BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED);
884 return -2; 860 return -2;
885 } 861 }
886 862
887 ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); 863 ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf);
888 if (ret > 0) 864 if (ret > 0)
889 bio->num_read += ret; 865 bio->num_read += ret;
890 return ret; 866 return ret;
891 } 867}
892 868
893int BIO_nwrite0(BIO *bio, char **buf) 869int
894 { 870BIO_nwrite0(BIO *bio, char **buf)
871{
895 long ret; 872 long ret;
896 873
897 if (!bio->init) 874 if (!bio->init) {
898 {
899 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); 875 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED);
900 return -2; 876 return -2;
901 } 877 }
902 878
903 ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); 879 ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf);
904 if (ret > INT_MAX) 880 if (ret > INT_MAX)
905 return INT_MAX; 881 return INT_MAX;
906 else 882 else
907 return (int) ret; 883 return (int) ret;
908 } 884}
909 885
910int BIO_nwrite(BIO *bio, char **buf, int num) 886int
911 { 887BIO_nwrite(BIO *bio, char **buf, int num)
888{
912 int ret; 889 int ret;
913 890
914 if (!bio->init) 891 if (!bio->init) {
915 {
916 BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); 892 BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED);
917 return -2; 893 return -2;
918 } 894 }
919 895
920 ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); 896 ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf);
921 if (ret > 0) 897 if (ret > 0)
922 bio->num_write += ret; 898 bio->num_write += ret;
923 return ret; 899 return ret;
924 } 900}
diff --git a/src/lib/libssl/src/crypto/bio/bss_conn.c b/src/lib/libssl/src/crypto/bio/bss_conn.c
index 5162e75c87..df34c49a4a 100644
--- a/src/lib/libssl/src/crypto/bio/bss_conn.c
+++ b/src/lib/libssl/src/crypto/bio/bss_conn.c
@@ -76,8 +76,7 @@
76#endif 76#endif
77 77
78 78
79typedef struct bio_connect_st 79typedef struct bio_connect_st {
80 {
81 int state; 80 int state;
82 81
83 char *param_hostname; 82 char *param_hostname;
@@ -95,8 +94,8 @@ typedef struct bio_connect_st
95 /* called when the connection is initially made 94 /* called when the connection is initially made
96 * callback(BIO,state,ret); The callback should return 95 * callback(BIO,state,ret); The callback should return
97 * 'ret'. state is for compatibility with the ssl info_callback */ 96 * 'ret'. state is for compatibility with the ssl info_callback */
98 int (*info_callback)(const BIO *bio,int state,int ret); 97 int (*info_callback)(const BIO *bio, int state, int ret);
99 } BIO_CONNECT; 98} BIO_CONNECT;
100 99
101static int conn_write(BIO *h, const char *buf, int num); 100static int conn_write(BIO *h, const char *buf, int num);
102static int conn_read(BIO *h, char *buf, int size); 101static int conn_read(BIO *h, char *buf, int size);
@@ -108,11 +107,10 @@ static long conn_callback_ctrl(BIO *h, int cmd, bio_info_cb *);
108 107
109static int conn_state(BIO *b, BIO_CONNECT *c); 108static int conn_state(BIO *b, BIO_CONNECT *c);
110static void conn_close_socket(BIO *data); 109static void conn_close_socket(BIO *data);
111BIO_CONNECT *BIO_CONNECT_new(void ); 110BIO_CONNECT *BIO_CONNECT_new(void);
112void BIO_CONNECT_free(BIO_CONNECT *a); 111void BIO_CONNECT_free(BIO_CONNECT *a);
113 112
114static BIO_METHOD methods_connectp= 113static BIO_METHOD methods_connectp = {
115 {
116 BIO_TYPE_CONNECT, 114 BIO_TYPE_CONNECT,
117 "socket connect", 115 "socket connect",
118 conn_write, 116 conn_write,
@@ -123,530 +121,501 @@ static BIO_METHOD methods_connectp=
123 conn_new, 121 conn_new,
124 conn_free, 122 conn_free,
125 conn_callback_ctrl, 123 conn_callback_ctrl,
126 }; 124};
127 125
128static int conn_state(BIO *b, BIO_CONNECT *c) 126static int
129 { 127conn_state(BIO *b, BIO_CONNECT *c)
130 int ret= -1,i; 128{
129 int ret = -1, i;
131 unsigned long l; 130 unsigned long l;
132 char *p,*q; 131 char *p, *q;
133 int (*cb)(const BIO *,int,int)=NULL; 132 int (*cb)(const BIO *, int, int) = NULL;
134 133
135 if (c->info_callback != NULL) 134 if (c->info_callback != NULL)
136 cb=c->info_callback; 135 cb = c->info_callback;
137 136
138 for (;;) 137 for (;;) {
139 { 138 switch (c->state) {
140 switch (c->state)
141 {
142 case BIO_CONN_S_BEFORE: 139 case BIO_CONN_S_BEFORE:
143 p=c->param_hostname; 140 p = c->param_hostname;
144 if (p == NULL) 141 if (p == NULL) {
145 { 142 BIOerr(BIO_F_CONN_STATE, BIO_R_NO_HOSTNAME_SPECIFIED);
146 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED);
147 goto exit_loop; 143 goto exit_loop;
148 } 144 }
149 for ( ; *p != '\0'; p++) 145 for (; *p != '\0'; p++) {
150 { 146 if ((*p == ':') || (*p == '/'))
151 if ((*p == ':') || (*p == '/')) break; 147 break;
152 } 148 }
153 149
154 i= *p; 150 i= *p;
155 if ((i == ':') || (i == '/')) 151 if ((i == ':') || (i == '/')) {
156 { 152 *(p++) = '\0';
157 153 if (i == ':') {
158 *(p++)='\0'; 154 for (q = p; *q; q++)
159 if (i == ':') 155 if (*q == '/') {
160 { 156 *q = '\0';
161 for (q=p; *q; q++)
162 if (*q == '/')
163 {
164 *q='\0';
165 break; 157 break;
166 } 158 }
167 if (c->param_port != NULL) 159 if (c->param_port != NULL)
168 OPENSSL_free(c->param_port); 160 OPENSSL_free(c->param_port);
169 c->param_port=BUF_strdup(p); 161 c->param_port = BUF_strdup(p);
170 }
171 } 162 }
163 }
172 164
173 if (c->param_port == NULL) 165 if (c->param_port == NULL) {
174 { 166 BIOerr(BIO_F_CONN_STATE, BIO_R_NO_PORT_SPECIFIED);
175 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); 167 ERR_add_error_data(2, "host=", c->param_hostname);
176 ERR_add_error_data(2,"host=",c->param_hostname);
177 goto exit_loop; 168 goto exit_loop;
178 } 169 }
179 c->state=BIO_CONN_S_GET_IP; 170 c->state = BIO_CONN_S_GET_IP;
180 break; 171 break;
181 172
182 case BIO_CONN_S_GET_IP: 173 case BIO_CONN_S_GET_IP:
183 if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) 174 if (BIO_get_host_ip(c->param_hostname, &(c->ip[0])) <= 0)
184 goto exit_loop; 175 goto exit_loop;
185 c->state=BIO_CONN_S_GET_PORT; 176 c->state = BIO_CONN_S_GET_PORT;
186 break; 177 break;
187 178
188 case BIO_CONN_S_GET_PORT: 179 case BIO_CONN_S_GET_PORT:
189 if (c->param_port == NULL) 180 if (c->param_port == NULL) {
190 {
191 /* abort(); */ 181 /* abort(); */
192 goto exit_loop; 182 goto exit_loop;
193 } 183 } else if (BIO_get_port(c->param_port, &c->port) <= 0)
194 else if (BIO_get_port(c->param_port,&c->port) <= 0)
195 goto exit_loop; 184 goto exit_loop;
196 c->state=BIO_CONN_S_CREATE_SOCKET; 185 c->state = BIO_CONN_S_CREATE_SOCKET;
197 break; 186 break;
198 187
199 case BIO_CONN_S_CREATE_SOCKET: 188 case BIO_CONN_S_CREATE_SOCKET:
200 /* now setup address */ 189 /* now setup address */
201 memset((char *)&c->them,0,sizeof(c->them)); 190 memset((char *)&c->them, 0, sizeof(c->them));
202 c->them.sin_family=AF_INET; 191 c->them.sin_family = AF_INET;
203 c->them.sin_port=htons((unsigned short)c->port); 192 c->them.sin_port = htons((unsigned short)c->port);
204 l=(unsigned long) 193 l = (unsigned long)
205 ((unsigned long)c->ip[0]<<24L)| 194 ((unsigned long)c->ip[0] << 24L)|
206 ((unsigned long)c->ip[1]<<16L)| 195 ((unsigned long)c->ip[1] << 16L)|
207 ((unsigned long)c->ip[2]<< 8L)| 196 ((unsigned long)c->ip[2] << 8L)|
208 ((unsigned long)c->ip[3]); 197 ((unsigned long)c->ip[3]);
209 c->them.sin_addr.s_addr=htonl(l); 198 c->them.sin_addr.s_addr = htonl(l);
210 c->state=BIO_CONN_S_CREATE_SOCKET; 199 c->state = BIO_CONN_S_CREATE_SOCKET;
211 200
212 ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); 201 ret = socket(AF_INET, SOCK_STREAM, SOCKET_PROTOCOL);
213 if (ret == -1) 202 if (ret == -1) {
214 { 203 SYSerr(SYS_F_SOCKET, errno);
215 SYSerr(SYS_F_SOCKET,errno); 204 ERR_add_error_data(4, "host=",
216 ERR_add_error_data(4,"host=",c->param_hostname, 205 c->param_hostname, ":", c->param_port);
217 ":",c->param_port); 206 BIOerr(BIO_F_CONN_STATE,
218 BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); 207 BIO_R_UNABLE_TO_CREATE_SOCKET);
219 goto exit_loop; 208 goto exit_loop;
220 } 209 }
221 b->num=ret; 210 b->num = ret;
222 c->state=BIO_CONN_S_NBIO; 211 c->state = BIO_CONN_S_NBIO;
223 break; 212 break;
224 213
225 case BIO_CONN_S_NBIO: 214 case BIO_CONN_S_NBIO:
226 if (c->nbio) 215 if (c->nbio) {
227 { 216 if (!BIO_socket_nbio(b->num, 1)) {
228 if (!BIO_socket_nbio(b->num,1)) 217 BIOerr(BIO_F_CONN_STATE,
229 { 218 BIO_R_ERROR_SETTING_NBIO);
230 BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); 219 ERR_add_error_data(4, "host=",
231 ERR_add_error_data(4,"host=", 220 c->param_hostname, ":",
232 c->param_hostname, 221 c->param_port);
233 ":",c->param_port);
234 goto exit_loop; 222 goto exit_loop;
235 }
236 } 223 }
237 c->state=BIO_CONN_S_CONNECT; 224 }
225 c->state = BIO_CONN_S_CONNECT;
238 226
239#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) 227#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE)
240 i=1; 228 i = 1;
241 i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); 229 i = setsockopt(b->num, SOL_SOCKET, SO_KEEPALIVE,(char *)&i, sizeof(i));
242 if (i < 0) 230 if (i < 0) {
243 { 231 SYSerr(SYS_F_SOCKET, errno);
244 SYSerr(SYS_F_SOCKET,errno); 232 ERR_add_error_data(4, "host=",
245 ERR_add_error_data(4,"host=",c->param_hostname, 233 c->param_hostname, ":", c->param_port);
246 ":",c->param_port); 234 BIOerr(BIO_F_CONN_STATE, BIO_R_KEEPALIVE);
247 BIOerr(BIO_F_CONN_STATE,BIO_R_KEEPALIVE);
248 goto exit_loop; 235 goto exit_loop;
249 } 236 }
250#endif 237#endif
251 break; 238 break;
252 239
253 case BIO_CONN_S_CONNECT: 240 case BIO_CONN_S_CONNECT:
254 BIO_clear_retry_flags(b); 241 BIO_clear_retry_flags(b);
255 ret=connect(b->num, 242 ret = connect(b->num,
256 (struct sockaddr *)&c->them, 243 (struct sockaddr *)&c->them,
257 sizeof(c->them)); 244 sizeof(c->them));
258 b->retry_reason=0; 245 b->retry_reason = 0;
259 if (ret < 0) 246 if (ret < 0) {
260 { 247 if (BIO_sock_should_retry(ret)) {
261 if (BIO_sock_should_retry(ret))
262 {
263 BIO_set_retry_special(b); 248 BIO_set_retry_special(b);
264 c->state=BIO_CONN_S_BLOCKED_CONNECT; 249 c->state = BIO_CONN_S_BLOCKED_CONNECT;
265 b->retry_reason=BIO_RR_CONNECT; 250 b->retry_reason = BIO_RR_CONNECT;
266 } 251 } else {
267 else 252 SYSerr(SYS_F_CONNECT, errno);
268 { 253 ERR_add_error_data(4, "host=",
269 SYSerr(SYS_F_CONNECT,errno); 254 c->param_hostname, ":",
270 ERR_add_error_data(4,"host=", 255 c->param_port);
271 c->param_hostname, 256 BIOerr(BIO_F_CONN_STATE,
272 ":",c->param_port); 257 BIO_R_CONNECT_ERROR);
273 BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR);
274 }
275 goto exit_loop;
276 } 258 }
277 else 259 goto exit_loop;
278 c->state=BIO_CONN_S_OK; 260 } else
261 c->state = BIO_CONN_S_OK;
279 break; 262 break;
280 263
281 case BIO_CONN_S_BLOCKED_CONNECT: 264 case BIO_CONN_S_BLOCKED_CONNECT:
282 i=BIO_sock_error(b->num); 265 i = BIO_sock_error(b->num);
283 if (i) 266 if (i) {
284 {
285 BIO_clear_retry_flags(b); 267 BIO_clear_retry_flags(b);
286 SYSerr(SYS_F_CONNECT,i); 268 SYSerr(SYS_F_CONNECT, i);
287 ERR_add_error_data(4,"host=", 269 ERR_add_error_data(4, "host=",
288 c->param_hostname, 270 c->param_hostname, ":", c->param_port);
289 ":",c->param_port); 271 BIOerr(BIO_F_CONN_STATE,
290 BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); 272 BIO_R_NBIO_CONNECT_ERROR);
291 ret=0; 273 ret = 0;
292 goto exit_loop; 274 goto exit_loop;
293 } 275 } else
294 else 276 c->state = BIO_CONN_S_OK;
295 c->state=BIO_CONN_S_OK;
296 break; 277 break;
297 278
298 case BIO_CONN_S_OK: 279 case BIO_CONN_S_OK:
299 ret=1; 280 ret = 1;
300 goto exit_loop; 281 goto exit_loop;
301 default: 282 default:
302 /* abort(); */ 283 /* abort(); */
303 goto exit_loop; 284 goto exit_loop;
304 } 285 }
305 286
306 if (cb != NULL) 287 if (cb != NULL) {
307 { 288 if (!(ret = cb((BIO *)b, c->state, ret)))
308 if (!(ret=cb((BIO *)b,c->state,ret)))
309 goto end; 289 goto end;
310 }
311 } 290 }
291 }
312 292
313 /* Loop does not exit */ 293 /* Loop does not exit */
314exit_loop: 294exit_loop:
315 if (cb != NULL) 295 if (cb != NULL)
316 ret=cb((BIO *)b,c->state,ret); 296 ret = cb((BIO *)b, c->state, ret);
317end: 297end:
318 return(ret); 298 return (ret);
319 } 299}
320 300
321BIO_CONNECT *BIO_CONNECT_new(void) 301BIO_CONNECT
322 { 302*BIO_CONNECT_new(void)
303{
323 BIO_CONNECT *ret; 304 BIO_CONNECT *ret;
324 305
325 if ((ret=(BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) 306 if ((ret = (BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL)
326 return(NULL); 307 return (NULL);
327 ret->state=BIO_CONN_S_BEFORE; 308 ret->state = BIO_CONN_S_BEFORE;
328 ret->param_hostname=NULL; 309 ret->param_hostname = NULL;
329 ret->param_port=NULL; 310 ret->param_port = NULL;
330 ret->info_callback=NULL; 311 ret->info_callback = NULL;
331 ret->nbio=0; 312 ret->nbio = 0;
332 ret->ip[0]=0; 313 ret->ip[0] = 0;
333 ret->ip[1]=0; 314 ret->ip[1] = 0;
334 ret->ip[2]=0; 315 ret->ip[2] = 0;
335 ret->ip[3]=0; 316 ret->ip[3] = 0;
336 ret->port=0; 317 ret->port = 0;
337 memset((char *)&ret->them,0,sizeof(ret->them)); 318 memset((char *)&ret->them, 0, sizeof(ret->them));
338 return(ret); 319 return (ret);
339 } 320}
340 321
341void BIO_CONNECT_free(BIO_CONNECT *a) 322void
342 { 323BIO_CONNECT_free(BIO_CONNECT *a)
343 if(a == NULL) 324{
344 return; 325 if (a == NULL)
326 return;
345 327
346 if (a->param_hostname != NULL) 328 if (a->param_hostname != NULL)
347 OPENSSL_free(a->param_hostname); 329 OPENSSL_free(a->param_hostname);
348 if (a->param_port != NULL) 330 if (a->param_port != NULL)
349 OPENSSL_free(a->param_port); 331 OPENSSL_free(a->param_port);
350 OPENSSL_free(a); 332 OPENSSL_free(a);
351 } 333}
352 334
353BIO_METHOD *BIO_s_connect(void) 335BIO_METHOD
354 { 336*BIO_s_connect(void)
355 return(&methods_connectp); 337{
356 } 338 return (&methods_connectp);
357 339}
358static int conn_new(BIO *bi) 340
359 { 341static int
360 bi->init=0; 342conn_new(BIO *bi)
361 bi->num=-1; 343{
362 bi->flags=0; 344 bi->init = 0;
363 if ((bi->ptr=(char *)BIO_CONNECT_new()) == NULL) 345 bi->num = -1;
364 return(0); 346 bi->flags = 0;
347 if ((bi->ptr = (char *)BIO_CONNECT_new()) == NULL)
348 return (0);
365 else 349 else
366 return(1); 350 return (1);
367 } 351}
368 352
369static void conn_close_socket(BIO *bio) 353static void
370 { 354conn_close_socket(BIO *bio)
355{
371 BIO_CONNECT *c; 356 BIO_CONNECT *c;
372 357
373 c=(BIO_CONNECT *)bio->ptr; 358 c = (BIO_CONNECT *)bio->ptr;
374 if (bio->num != -1) 359 if (bio->num != -1) {
375 {
376 /* Only do a shutdown if things were established */ 360 /* Only do a shutdown if things were established */
377 if (c->state == BIO_CONN_S_OK) 361 if (c->state == BIO_CONN_S_OK)
378 shutdown(bio->num, SHUT_RDWR); 362 shutdown(bio->num, SHUT_RDWR);
379 close(bio->num); 363 close(bio->num);
380 bio->num=-1; 364 bio->num = -1;
381 }
382 } 365 }
366}
383 367
384static int conn_free(BIO *a) 368static int
385 { 369conn_free(BIO *a)
370{
386 BIO_CONNECT *data; 371 BIO_CONNECT *data;
387 372
388 if (a == NULL) return(0); 373 if (a == NULL)
389 data=(BIO_CONNECT *)a->ptr; 374 return (0);
390 375 data = (BIO_CONNECT *)a->ptr;
391 if (a->shutdown) 376
392 { 377 if (a->shutdown) {
393 conn_close_socket(a); 378 conn_close_socket(a);
394 BIO_CONNECT_free(data); 379 BIO_CONNECT_free(data);
395 a->ptr=NULL; 380 a->ptr = NULL;
396 a->flags=0; 381 a->flags = 0;
397 a->init=0; 382 a->init = 0;
398 }
399 return(1);
400 } 383 }
401 384 return (1);
402static int conn_read(BIO *b, char *out, int outl) 385}
403 { 386
404 int ret=0; 387static int
388conn_read(BIO *b, char *out, int outl)
389{
390 int ret = 0;
405 BIO_CONNECT *data; 391 BIO_CONNECT *data;
406 392
407 data=(BIO_CONNECT *)b->ptr; 393 data = (BIO_CONNECT *)b->ptr;
408 if (data->state != BIO_CONN_S_OK) 394 if (data->state != BIO_CONN_S_OK) {
409 { 395 ret = conn_state(b, data);
410 ret=conn_state(b,data);
411 if (ret <= 0) 396 if (ret <= 0)
412 return(ret); 397 return (ret);
413 } 398 }
414 399
415 if (out != NULL) 400 if (out != NULL) {
416 {
417 errno = 0; 401 errno = 0;
418 ret=read(b->num,out,outl); 402 ret = read(b->num, out, outl);
419 BIO_clear_retry_flags(b); 403 BIO_clear_retry_flags(b);
420 if (ret <= 0) 404 if (ret <= 0) {
421 {
422 if (BIO_sock_should_retry(ret)) 405 if (BIO_sock_should_retry(ret))
423 BIO_set_retry_read(b); 406 BIO_set_retry_read(b);
424 }
425 } 407 }
426 return(ret);
427 } 408 }
409 return (ret);
410}
428 411
429static int conn_write(BIO *b, const char *in, int inl) 412static int
430 { 413conn_write(BIO *b, const char *in, int inl)
414{
431 int ret; 415 int ret;
432 BIO_CONNECT *data; 416 BIO_CONNECT *data;
433 417
434 data=(BIO_CONNECT *)b->ptr; 418 data = (BIO_CONNECT *)b->ptr;
435 if (data->state != BIO_CONN_S_OK) 419 if (data->state != BIO_CONN_S_OK) {
436 { 420 ret = conn_state(b, data);
437 ret=conn_state(b,data); 421 if (ret <= 0)
438 if (ret <= 0) return(ret); 422 return (ret);
439 } 423 }
440 424
441 errno = 0; 425 errno = 0;
442 ret=write(b->num,in,inl); 426 ret = write(b->num, in, inl);
443 BIO_clear_retry_flags(b); 427 BIO_clear_retry_flags(b);
444 if (ret <= 0) 428 if (ret <= 0) {
445 {
446 if (BIO_sock_should_retry(ret)) 429 if (BIO_sock_should_retry(ret))
447 BIO_set_retry_write(b); 430 BIO_set_retry_write(b);
448 }
449 return(ret);
450 } 431 }
432 return (ret);
433}
451 434
452static long conn_ctrl(BIO *b, int cmd, long num, void *ptr) 435static long
453 { 436conn_ctrl(BIO *b, int cmd, long num, void *ptr)
437{
454 BIO *dbio; 438 BIO *dbio;
455 int *ip; 439 int *ip;
456 const char **pptr; 440 const char **pptr;
457 long ret=1; 441 long ret = 1;
458 BIO_CONNECT *data; 442 BIO_CONNECT *data;
459 443
460 data=(BIO_CONNECT *)b->ptr; 444 data = (BIO_CONNECT *)b->ptr;
461 445
462 switch (cmd) 446 switch (cmd) {
463 {
464 case BIO_CTRL_RESET: 447 case BIO_CTRL_RESET:
465 ret=0; 448 ret = 0;
466 data->state=BIO_CONN_S_BEFORE; 449 data->state = BIO_CONN_S_BEFORE;
467 conn_close_socket(b); 450 conn_close_socket(b);
468 b->flags=0; 451 b->flags = 0;
469 break; 452 break;
470 case BIO_C_DO_STATE_MACHINE: 453 case BIO_C_DO_STATE_MACHINE:
471 /* use this one to start the connection */ 454 /* use this one to start the connection */
472 if (data->state != BIO_CONN_S_OK) 455 if (data->state != BIO_CONN_S_OK)
473 ret=(long)conn_state(b,data); 456 ret = (long)conn_state(b, data);
474 else 457 else
475 ret=1; 458 ret = 1;
476 break; 459 break;
477 case BIO_C_GET_CONNECT: 460 case BIO_C_GET_CONNECT:
478 if (ptr != NULL) 461 if (ptr != NULL) {
479 { 462 pptr = (const char **)ptr;
480 pptr=(const char **)ptr; 463 if (num == 0) {
481 if (num == 0) 464 *pptr = data->param_hostname;
482 { 465
483 *pptr=data->param_hostname; 466 } else if (num == 1) {
484 467 *pptr = data->param_port;
485 } 468 } else if (num == 2) {
486 else if (num == 1) 469 *pptr = (char *)&(data->ip[0]);
487 { 470 } else if (num == 3) {
488 *pptr=data->param_port; 471 *((int *)ptr) = data->port;
489 }
490 else if (num == 2)
491 {
492 *pptr= (char *)&(data->ip[0]);
493 }
494 else if (num == 3)
495 {
496 *((int *)ptr)=data->port;
497 }
498 if ((!b->init) || (ptr == NULL))
499 *pptr="not initialized";
500 ret=1;
501 } 472 }
473 if ((!b->init) || (ptr == NULL))
474 *pptr = "not initialized";
475 ret = 1;
476 }
502 break; 477 break;
503 case BIO_C_SET_CONNECT: 478 case BIO_C_SET_CONNECT:
504 if (ptr != NULL) 479 if (ptr != NULL) {
505 { 480 b->init = 1;
506 b->init=1; 481 if (num == 0) {
507 if (num == 0)
508 {
509 if (data->param_hostname != NULL) 482 if (data->param_hostname != NULL)
510 OPENSSL_free(data->param_hostname); 483 OPENSSL_free(data->param_hostname);
511 data->param_hostname=BUF_strdup(ptr); 484 data->param_hostname = BUF_strdup(ptr);
512 } 485 } else if (num == 1) {
513 else if (num == 1)
514 {
515 if (data->param_port != NULL) 486 if (data->param_port != NULL)
516 OPENSSL_free(data->param_port); 487 OPENSSL_free(data->param_port);
517 data->param_port=BUF_strdup(ptr); 488 data->param_port = BUF_strdup(ptr);
518 } 489 } else if (num == 2) {
519 else if (num == 2)
520 {
521 char buf[16]; 490 char buf[16];
522 unsigned char *p = ptr; 491 unsigned char *p = ptr;
523 492
524 (void) snprintf(buf,sizeof buf,"%d.%d.%d.%d", 493 (void) snprintf(buf, sizeof buf, "%d.%d.%d.%d",
525 p[0],p[1],p[2],p[3]); 494 p[0], p[1], p[2], p[3]);
526 if (data->param_hostname != NULL) 495 if (data->param_hostname != NULL)
527 OPENSSL_free(data->param_hostname); 496 OPENSSL_free(data->param_hostname);
528 data->param_hostname=BUF_strdup(buf); 497 data->param_hostname = BUF_strdup(buf);
529 memcpy(&(data->ip[0]),ptr,4); 498 memcpy(&(data->ip[0]), ptr, 4);
530 } 499 } else if (num == 3) {
531 else if (num == 3) 500 char buf[DECIMAL_SIZE(int) + 1];
532 {
533 char buf[DECIMAL_SIZE(int)+1];
534 501
535 (void) snprintf(buf,sizeof buf,"%d",*(int *)ptr); 502 (void) snprintf(buf, sizeof buf, "%d",
503 *(int *)ptr);
536 if (data->param_port != NULL) 504 if (data->param_port != NULL)
537 OPENSSL_free(data->param_port); 505 OPENSSL_free(data->param_port);
538 data->param_port=BUF_strdup(buf); 506 data->param_port = BUF_strdup(buf);
539 data->port= *(int *)ptr; 507 data->port= *(int *)ptr;
540 }
541 } 508 }
509 }
542 break; 510 break;
543 case BIO_C_SET_NBIO: 511 case BIO_C_SET_NBIO:
544 data->nbio=(int)num; 512 data->nbio = (int)num;
545 break; 513 break;
546 case BIO_C_GET_FD: 514 case BIO_C_GET_FD:
547 if (b->init) 515 if (b->init) {
548 { 516 ip = (int *)ptr;
549 ip=(int *)ptr;
550 if (ip != NULL) 517 if (ip != NULL)
551 *ip=b->num; 518 *ip = b->num;
552 ret=b->num; 519 ret = b->num;
553 } 520 } else
554 else 521 ret = -1;
555 ret= -1;
556 break; 522 break;
557 case BIO_CTRL_GET_CLOSE: 523 case BIO_CTRL_GET_CLOSE:
558 ret=b->shutdown; 524 ret = b->shutdown;
559 break; 525 break;
560 case BIO_CTRL_SET_CLOSE: 526 case BIO_CTRL_SET_CLOSE:
561 b->shutdown=(int)num; 527 b->shutdown = (int)num;
562 break; 528 break;
563 case BIO_CTRL_PENDING: 529 case BIO_CTRL_PENDING:
564 case BIO_CTRL_WPENDING: 530 case BIO_CTRL_WPENDING:
565 ret=0; 531 ret = 0;
566 break; 532 break;
567 case BIO_CTRL_FLUSH: 533 case BIO_CTRL_FLUSH:
568 break; 534 break;
569 case BIO_CTRL_DUP: 535 case BIO_CTRL_DUP:
570 { 536 {
571 dbio=(BIO *)ptr; 537 dbio = (BIO *)ptr;
572 if (data->param_port) 538 if (data->param_port)
573 BIO_set_conn_port(dbio,data->param_port); 539 BIO_set_conn_port(dbio, data->param_port);
574 if (data->param_hostname) 540 if (data->param_hostname)
575 BIO_set_conn_hostname(dbio,data->param_hostname); 541 BIO_set_conn_hostname(dbio,
576 BIO_set_nbio(dbio,data->nbio); 542 data->param_hostname);
577 /* FIXME: the cast of the function seems unlikely to be a good idea */ 543 BIO_set_nbio(dbio, data->nbio);
578 (void)BIO_set_info_callback(dbio,(bio_info_cb *)data->info_callback); 544 /* FIXME: the cast of the function seems unlikely to be a good idea */
545 (void)BIO_set_info_callback(dbio,
546 (bio_info_cb *)data->info_callback);
579 } 547 }
580 break; 548 break;
581 case BIO_CTRL_SET_CALLBACK: 549 case BIO_CTRL_SET_CALLBACK:
582 { 550 {
583#if 0 /* FIXME: Should this be used? -- Richard Levitte */ 551#if 0 /* FIXME: Should this be used? -- Richard Levitte */
584 BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 552 BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
585 ret = -1; 553 ret = -1;
586#else 554#else
587 ret=0; 555 ret = 0;
588#endif 556#endif
589 } 557 }
590 break; 558 break;
591 case BIO_CTRL_GET_CALLBACK: 559 case BIO_CTRL_GET_CALLBACK:
592 { 560 {
593 int (**fptr)(const BIO *bio,int state,int xret); 561 int (**fptr)(const BIO *bio, int state, int xret);
594 562
595 fptr=(int (**)(const BIO *bio,int state,int xret))ptr; 563 fptr = (int (**)(const BIO *bio, int state, int xret))ptr;
596 *fptr=data->info_callback; 564 *fptr = data->info_callback;
597 } 565 }
598 break; 566 break;
599 default: 567 default:
600 ret=0; 568 ret = 0;
601 break; 569 break;
602 }
603 return(ret);
604 } 570 }
571 return (ret);
572}
605 573
606static long conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) 574static long
607 { 575conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
608 long ret=1; 576{
577 long ret = 1;
609 BIO_CONNECT *data; 578 BIO_CONNECT *data;
610 579
611 data=(BIO_CONNECT *)b->ptr; 580 data = (BIO_CONNECT *)b->ptr;
612 581
613 switch (cmd) 582 switch (cmd) {
614 {
615 case BIO_CTRL_SET_CALLBACK: 583 case BIO_CTRL_SET_CALLBACK:
616 { 584 {
617 data->info_callback=(int (*)(const struct bio_st *, int, int))fp; 585 data->info_callback = (int (*)(const struct bio_st *, int, int))fp;
618 } 586 }
619 break; 587 break;
620 default: 588 default:
621 ret=0; 589 ret = 0;
622 break; 590 break;
623 }
624 return(ret);
625 } 591 }
626 592 return (ret);
627static int conn_puts(BIO *bp, const char *str) 593}
628 { 594
629 int n,ret; 595static int
630 596conn_puts(BIO *bp, const char *str)
631 n=strlen(str); 597{
632 ret=conn_write(bp,str,n); 598 int n, ret;
633 return(ret); 599
634 } 600 n = strlen(str);
635 601 ret = conn_write(bp, str, n);
636BIO *BIO_new_connect(char *str) 602 return (ret);
637 { 603}
604
605BIO
606*BIO_new_connect(char *str)
607{
638 BIO *ret; 608 BIO *ret;
639 609
640 ret=BIO_new(BIO_s_connect()); 610 ret = BIO_new(BIO_s_connect());
641 if (ret == NULL) return(NULL); 611 if (ret == NULL)
642 if (BIO_set_conn_hostname(ret,str)) 612 return (NULL);
643 return(ret); 613 if (BIO_set_conn_hostname(ret, str))
644 else 614 return (ret);
645 { 615 else {
646 BIO_free(ret); 616 BIO_free(ret);
647 return(NULL); 617 return (NULL);
648 }
649 } 618 }
619}
650 620
651#endif 621#endif
652
diff --git a/src/lib/libssl/src/crypto/bio/bss_dgram.c b/src/lib/libssl/src/crypto/bio/bss_dgram.c
index 67a13ae845..330f6fc404 100644
--- a/src/lib/libssl/src/crypto/bio/bss_dgram.c
+++ b/src/lib/libssl/src/crypto/bio/bss_dgram.c
@@ -113,7 +113,8 @@ static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
113static int dgram_sctp_new(BIO *h); 113static int dgram_sctp_new(BIO *h);
114static int dgram_sctp_free(BIO *data); 114static int dgram_sctp_free(BIO *data);
115#ifdef SCTP_AUTHENTICATION_EVENT 115#ifdef SCTP_AUTHENTICATION_EVENT
116static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp); 116static void dgram_sctp_handle_auth_free_key_event(BIO *b,
117 union sctp_notification *snp);
117#endif 118#endif
118#endif 119#endif
119 120
@@ -121,8 +122,7 @@ static int BIO_dgram_should_retry(int s);
121 122
122static void get_current_time(struct timeval *t); 123static void get_current_time(struct timeval *t);
123 124
124static BIO_METHOD methods_dgramp= 125static BIO_METHOD methods_dgramp = {
125 {
126 BIO_TYPE_DGRAM, 126 BIO_TYPE_DGRAM,
127 "datagram socket", 127 "datagram socket",
128 dgram_write, 128 dgram_write,
@@ -133,11 +133,10 @@ static BIO_METHOD methods_dgramp=
133 dgram_new, 133 dgram_new,
134 dgram_free, 134 dgram_free,
135 NULL, 135 NULL,
136 }; 136};
137 137
138#ifndef OPENSSL_NO_SCTP 138#ifndef OPENSSL_NO_SCTP
139static BIO_METHOD methods_dgramp_sctp= 139static BIO_METHOD methods_dgramp_sctp = {
140 {
141 BIO_TYPE_DGRAM_SCTP, 140 BIO_TYPE_DGRAM_SCTP,
142 "datagram sctp socket", 141 "datagram sctp socket",
143 dgram_sctp_write, 142 dgram_sctp_write,
@@ -148,11 +147,10 @@ static BIO_METHOD methods_dgramp_sctp=
148 dgram_sctp_new, 147 dgram_sctp_new,
149 dgram_sctp_free, 148 dgram_sctp_free,
150 NULL, 149 NULL,
151 }; 150};
152#endif 151#endif
153 152
154typedef struct bio_dgram_data_st 153typedef struct bio_dgram_data_st {
155 {
156 union { 154 union {
157 struct sockaddr sa; 155 struct sockaddr sa;
158 struct sockaddr_in sa_in; 156 struct sockaddr_in sa_in;
@@ -165,18 +163,16 @@ typedef struct bio_dgram_data_st
165 unsigned int mtu; 163 unsigned int mtu;
166 struct timeval next_timeout; 164 struct timeval next_timeout;
167 struct timeval socket_timeout; 165 struct timeval socket_timeout;
168 } bio_dgram_data; 166} bio_dgram_data;
169 167
170#ifndef OPENSSL_NO_SCTP 168#ifndef OPENSSL_NO_SCTP
171typedef struct bio_dgram_sctp_save_message_st 169typedef struct bio_dgram_sctp_save_message_st {
172 { 170 BIO *bio;
173 BIO *bio; 171 char *data;
174 char *data; 172 int length;
175 int length; 173} bio_dgram_sctp_save_message;
176 } bio_dgram_sctp_save_message;
177 174
178typedef struct bio_dgram_sctp_data_st 175typedef struct bio_dgram_sctp_data_st {
179 {
180 union { 176 union {
181 struct sockaddr sa; 177 struct sockaddr sa;
182 struct sockaddr_in sa_in; 178 struct sockaddr_in sa_in;
@@ -198,79 +194,88 @@ typedef struct bio_dgram_sctp_data_st
198 int save_shutdown; 194 int save_shutdown;
199 int peer_auth_tested; 195 int peer_auth_tested;
200 bio_dgram_sctp_save_message saved_message; 196 bio_dgram_sctp_save_message saved_message;
201 } bio_dgram_sctp_data; 197} bio_dgram_sctp_data;
202#endif 198#endif
203 199
204BIO_METHOD *BIO_s_datagram(void) 200BIO_METHOD
205 { 201*BIO_s_datagram(void)
206 return(&methods_dgramp); 202{
207 } 203 return (&methods_dgramp);
204}
208 205
209BIO *BIO_new_dgram(int fd, int close_flag) 206BIO
210 { 207*BIO_new_dgram(int fd, int close_flag)
208{
211 BIO *ret; 209 BIO *ret;
212 210
213 ret=BIO_new(BIO_s_datagram()); 211 ret = BIO_new(BIO_s_datagram());
214 if (ret == NULL) return(NULL); 212 if (ret == NULL)
215 BIO_set_fd(ret,fd,close_flag); 213 return (NULL);
216 return(ret); 214 BIO_set_fd(ret, fd, close_flag);
217 } 215 return (ret);
216}
218 217
219static int dgram_new(BIO *bi) 218static int
220 { 219dgram_new(BIO *bi)
220{
221 bio_dgram_data *data = NULL; 221 bio_dgram_data *data = NULL;
222 222
223 bi->init=0; 223 bi->init = 0;
224 bi->num=0; 224 bi->num = 0;
225 data = OPENSSL_malloc(sizeof(bio_dgram_data)); 225 data = OPENSSL_malloc(sizeof(bio_dgram_data));
226 if (data == NULL) 226 if (data == NULL)
227 return 0; 227 return 0;
228 memset(data, 0x00, sizeof(bio_dgram_data)); 228 memset(data, 0x00, sizeof(bio_dgram_data));
229 bi->ptr = data; 229 bi->ptr = data;
230 230
231 bi->flags=0; 231 bi->flags = 0;
232 return(1); 232 return (1);
233 } 233}
234 234
235static int dgram_free(BIO *a) 235static int
236 { 236dgram_free(BIO *a)
237{
237 bio_dgram_data *data; 238 bio_dgram_data *data;
238 239
239 if (a == NULL) return(0); 240 if (a == NULL)
240 if ( ! dgram_clear(a)) 241 return (0);
242 if (!dgram_clear(a))
241 return 0; 243 return 0;
242 244
243 data = (bio_dgram_data *)a->ptr; 245 data = (bio_dgram_data *)a->ptr;
244 if(data != NULL) OPENSSL_free(data); 246 if (data != NULL)
247 OPENSSL_free(data);
245 248
246 return(1); 249 return (1);
247 } 250}
248 251
249static int dgram_clear(BIO *a) 252static int
250 { 253dgram_clear(BIO *a)
251 if (a == NULL) return(0); 254{
252 if (a->shutdown) 255 if (a == NULL)
253 { 256 return (0);
254 if (a->init) 257 if (a->shutdown) {
255 { 258 if (a->init) {
256 shutdown(a->num, SHUT_RDWR); 259 shutdown(a->num, SHUT_RDWR);
257 close(a->num); 260 close(a->num);
258 }
259 a->init=0;
260 a->flags=0;
261 } 261 }
262 return(1); 262 a->init = 0;
263 a->flags = 0;
263 } 264 }
265 return (1);
266}
264 267
265static void dgram_adjust_rcv_timeout(BIO *b) 268static void
266 { 269dgram_adjust_rcv_timeout(BIO *b)
270{
267#if defined(SO_RCVTIMEO) 271#if defined(SO_RCVTIMEO)
268 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 272 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
269 union { size_t s; int i; } sz = {0}; 273 union { size_t s;
274 int i;
275 } sz = {0};
270 276
271 /* Is a timer active? */ 277 /* Is a timer active? */
272 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) 278 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
273 {
274 struct timeval timenow, timeleft; 279 struct timeval timenow, timeleft;
275 280
276 /* Read current socket timeout */ 281 /* Read current socket timeout */
@@ -279,20 +284,19 @@ static void dgram_adjust_rcv_timeout(BIO *b)
279 284
280 sz.i = sizeof(timeout); 285 sz.i = sizeof(timeout);
281 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 286 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
282 (void*)&timeout, &sz.i) < 0) 287 (void*)&timeout, &sz.i) < 0) {
283 { perror("getsockopt"); } 288 perror("getsockopt");
284 else 289 } else {
285 {
286 data->socket_timeout.tv_sec = timeout / 1000; 290 data->socket_timeout.tv_sec = timeout / 1000;
287 data->socket_timeout.tv_usec = (timeout % 1000) * 1000; 291 data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
288 } 292 }
289#else 293#else
290 sz.i = sizeof(data->socket_timeout); 294 sz.i = sizeof(data->socket_timeout);
291 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 295 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
292 &(data->socket_timeout), (void *)&sz) < 0) 296 &(data->socket_timeout), (void *)&sz) < 0) {
293 { perror("getsockopt"); } 297 perror("getsockopt");
294 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 298 } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0)
295 OPENSSL_assert(sz.s<=sizeof(data->socket_timeout)); 299 OPENSSL_assert(sz.s <= sizeof(data->socket_timeout));
296#endif 300#endif
297 301
298 /* Get current time */ 302 /* Get current time */
@@ -302,126 +306,128 @@ static void dgram_adjust_rcv_timeout(BIO *b)
302 memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); 306 memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval));
303 timeleft.tv_sec -= timenow.tv_sec; 307 timeleft.tv_sec -= timenow.tv_sec;
304 timeleft.tv_usec -= timenow.tv_usec; 308 timeleft.tv_usec -= timenow.tv_usec;
305 if (timeleft.tv_usec < 0) 309 if (timeleft.tv_usec < 0) {
306 {
307 timeleft.tv_sec--; 310 timeleft.tv_sec--;
308 timeleft.tv_usec += 1000000; 311 timeleft.tv_usec += 1000000;
309 } 312 }
310 313
311 if (timeleft.tv_sec < 0) 314 if (timeleft.tv_sec < 0) {
312 {
313 timeleft.tv_sec = 0; 315 timeleft.tv_sec = 0;
314 timeleft.tv_usec = 1; 316 timeleft.tv_usec = 1;
315 } 317 }
316 318
317 /* Adjust socket timeout if next handhake message timer 319 /* Adjust socket timeout if next handhake message timer
318 * will expire earlier. 320 * will expire earlier.
319 */ 321 */
320 if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) || 322 if ((data->socket_timeout.tv_sec == 0 &&
321 (data->socket_timeout.tv_sec > timeleft.tv_sec) || 323 data->socket_timeout.tv_usec == 0) ||
322 (data->socket_timeout.tv_sec == timeleft.tv_sec && 324 (data->socket_timeout.tv_sec > timeleft.tv_sec) ||
323 data->socket_timeout.tv_usec >= timeleft.tv_usec)) 325 (data->socket_timeout.tv_sec == timeleft.tv_sec &&
324 { 326 data->socket_timeout.tv_usec >= timeleft.tv_usec)) {
325#ifdef OPENSSL_SYS_WINDOWS 327#ifdef OPENSSL_SYS_WINDOWS
326 timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; 328 timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000;
327 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 329 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
328 (void*)&timeout, sizeof(timeout)) < 0) 330 (void*)&timeout, sizeof(timeout)) < 0) {
329 { perror("setsockopt"); } 331 perror("setsockopt");
332 }
330#else 333#else
331 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft, 334 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
332 sizeof(struct timeval)) < 0) 335 &timeleft, sizeof(struct timeval)) < 0) {
333 { perror("setsockopt"); } 336 perror("setsockopt");
334#endif
335 } 337 }
336 }
337#endif 338#endif
339 }
338 } 340 }
341#endif
342}
339 343
340static void dgram_reset_rcv_timeout(BIO *b) 344static void
341 { 345dgram_reset_rcv_timeout(BIO *b)
346{
342#if defined(SO_RCVTIMEO) 347#if defined(SO_RCVTIMEO)
343 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 348 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
344 349
345 /* Is a timer active? */ 350 /* Is a timer active? */
346 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) 351 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
347 {
348#ifdef OPENSSL_SYS_WINDOWS 352#ifdef OPENSSL_SYS_WINDOWS
349 int timeout = data->socket_timeout.tv_sec * 1000 + 353 int timeout = data->socket_timeout.tv_sec * 1000 +
350 data->socket_timeout.tv_usec / 1000; 354 data->socket_timeout.tv_usec / 1000;
351 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 355 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
352 (void*)&timeout, sizeof(timeout)) < 0) 356 (void*)&timeout, sizeof(timeout)) < 0) {
353 { perror("setsockopt"); } 357 perror("setsockopt");
358 }
354#else 359#else
355 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout), 360 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
356 sizeof(struct timeval)) < 0) 361 &(data->socket_timeout), sizeof(struct timeval)) < 0) {
357 { perror("setsockopt"); } 362 perror("setsockopt");
358#endif
359 } 363 }
360#endif 364#endif
361 } 365 }
366#endif
367}
362 368
363static int dgram_read(BIO *b, char *out, int outl) 369static int
364 { 370dgram_read(BIO *b, char *out, int outl)
365 int ret=0; 371{
372 int ret = 0;
366 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 373 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
367 374
368 struct { 375 struct {
369 /* 376 /*
370 * See commentary in b_sock.c. <appro> 377 * See commentary in b_sock.c. <appro>
371 */ 378 */
372 union { size_t s; int i; } len; 379 union {
373 union { 380 size_t s;
374 struct sockaddr sa; 381 int i;
375 struct sockaddr_in sa_in; 382 } len;
383 union {
384 struct sockaddr sa;
385 struct sockaddr_in sa_in;
376#if OPENSSL_USE_IPV6 386#if OPENSSL_USE_IPV6
377 struct sockaddr_in6 sa_in6; 387 struct sockaddr_in6 sa_in6;
378#endif 388#endif
379 } peer; 389 } peer;
380 } sa; 390 } sa;
381 391
382 sa.len.s=0; 392 sa.len.s = 0;
383 sa.len.i=sizeof(sa.peer); 393 sa.len.i = sizeof(sa.peer);
384 394
385 if (out != NULL) 395 if (out != NULL) {
386 {
387 errno = 0; 396 errno = 0;
388 memset(&sa.peer, 0x00, sizeof(sa.peer)); 397 memset(&sa.peer, 0x00, sizeof(sa.peer));
389 dgram_adjust_rcv_timeout(b); 398 dgram_adjust_rcv_timeout(b);
390 ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len); 399 ret = recvfrom(b->num, out, outl, 0, &sa.peer.sa,(void *)&sa.len);
391 if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) 400 if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) {
392 { 401 OPENSSL_assert(sa.len.s <= sizeof(sa.peer));
393 OPENSSL_assert(sa.len.s<=sizeof(sa.peer));
394 sa.len.i = (int)sa.len.s; 402 sa.len.i = (int)sa.len.s;
395 } 403 }
396 404
397 if ( ! data->connected && ret >= 0) 405 if (! data->connected && ret >= 0)
398 BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); 406 BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer);
399 407
400 BIO_clear_retry_flags(b); 408 BIO_clear_retry_flags(b);
401 if (ret < 0) 409 if (ret < 0) {
402 { 410 if (BIO_dgram_should_retry(ret)) {
403 if (BIO_dgram_should_retry(ret))
404 {
405 BIO_set_retry_read(b); 411 BIO_set_retry_read(b);
406 data->_errno = errno; 412 data->_errno = errno;
407 }
408 } 413 }
414 }
409 415
410 dgram_reset_rcv_timeout(b); 416 dgram_reset_rcv_timeout(b);
411 }
412 return(ret);
413 } 417 }
418 return (ret);
419}
414 420
415static int dgram_write(BIO *b, const char *in, int inl) 421static int
416 { 422dgram_write(BIO *b, const char *in, int inl)
423{
417 int ret; 424 int ret;
418 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 425 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
419 errno = 0; 426 errno = 0;
420 427
421 if ( data->connected ) 428 if (data->connected)
422 ret=write(b->num,in,inl); 429 ret = write(b->num, in, inl);
423 else 430 else {
424 {
425 int peerlen = sizeof(data->peer); 431 int peerlen = sizeof(data->peer);
426 432
427 if (data->peer.sa.sa_family == AF_INET) 433 if (data->peer.sa.sa_family == AF_INET)
@@ -431,33 +437,33 @@ static int dgram_write(BIO *b, const char *in, int inl)
431 peerlen = sizeof(data->peer.sa_in6); 437 peerlen = sizeof(data->peer.sa_in6);
432#endif 438#endif
433#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) 439#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
434 ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); 440 ret = sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen);
435#else 441#else
436 ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); 442 ret = sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
437#endif 443#endif
438 } 444 }
439 445
440 BIO_clear_retry_flags(b); 446 BIO_clear_retry_flags(b);
441 if (ret <= 0) 447 if (ret <= 0) {
442 { 448 if (BIO_dgram_should_retry(ret)) {
443 if (BIO_dgram_should_retry(ret)) 449 BIO_set_retry_write(b);
444 { 450
445 BIO_set_retry_write(b);
446 data->_errno = errno; 451 data->_errno = errno;
447 452
448#if 0 /* higher layers are responsible for querying MTU, if necessary */ 453#if 0 /* higher layers are responsible for querying MTU, if necessary */
449 if ( data->_errno == EMSGSIZE) 454 if (data->_errno == EMSGSIZE)
450 /* retrieve the new MTU */ 455 /* retrieve the new MTU */
451 BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); 456 BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
452#endif 457#endif
453 }
454 } 458 }
455 return(ret);
456 } 459 }
460 return (ret);
461}
457 462
458static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) 463static long
459 { 464dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
460 long ret=1; 465{
466 long ret = 1;
461 int *ip; 467 int *ip;
462 struct sockaddr *to = NULL; 468 struct sockaddr *to = NULL;
463 bio_dgram_data *data = NULL; 469 bio_dgram_data *data = NULL;
@@ -472,76 +478,73 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
472#if OPENSSL_USE_IPV6 478#if OPENSSL_USE_IPV6
473 struct sockaddr_in6 s6; 479 struct sockaddr_in6 s6;
474#endif 480#endif
475 } addr; 481 } addr;
476#endif 482#endif
477 483
478 data = (bio_dgram_data *)b->ptr; 484 data = (bio_dgram_data *)b->ptr;
479 485
480 switch (cmd) 486 switch (cmd) {
481 {
482 case BIO_CTRL_RESET: 487 case BIO_CTRL_RESET:
483 num=0; 488 num = 0;
484 case BIO_C_FILE_SEEK: 489 case BIO_C_FILE_SEEK:
485 ret=0; 490 ret = 0;
486 break; 491 break;
487 case BIO_C_FILE_TELL: 492 case BIO_C_FILE_TELL:
488 case BIO_CTRL_INFO: 493 case BIO_CTRL_INFO:
489 ret=0; 494 ret = 0;
490 break; 495 break;
491 case BIO_C_SET_FD: 496 case BIO_C_SET_FD:
492 dgram_clear(b); 497 dgram_clear(b);
493 b->num= *((int *)ptr); 498 b->num= *((int *)ptr);
494 b->shutdown=(int)num; 499 b->shutdown = (int)num;
495 b->init=1; 500 b->init = 1;
496 break; 501 break;
497 case BIO_C_GET_FD: 502 case BIO_C_GET_FD:
498 if (b->init) 503 if (b->init) {
499 { 504 ip = (int *)ptr;
500 ip=(int *)ptr; 505 if (ip != NULL)
501 if (ip != NULL) *ip=b->num; 506 *ip = b->num;
502 ret=b->num; 507 ret = b->num;
503 } 508 } else
504 else 509 ret = -1;
505 ret= -1;
506 break; 510 break;
507 case BIO_CTRL_GET_CLOSE: 511 case BIO_CTRL_GET_CLOSE:
508 ret=b->shutdown; 512 ret = b->shutdown;
509 break; 513 break;
510 case BIO_CTRL_SET_CLOSE: 514 case BIO_CTRL_SET_CLOSE:
511 b->shutdown=(int)num; 515 b->shutdown = (int)num;
512 break; 516 break;
513 case BIO_CTRL_PENDING: 517 case BIO_CTRL_PENDING:
514 case BIO_CTRL_WPENDING: 518 case BIO_CTRL_WPENDING:
515 ret=0; 519 ret = 0;
516 break; 520 break;
517 case BIO_CTRL_DUP: 521 case BIO_CTRL_DUP:
518 case BIO_CTRL_FLUSH: 522 case BIO_CTRL_FLUSH:
519 ret=1; 523 ret = 1;
520 break; 524 break;
521 case BIO_CTRL_DGRAM_CONNECT: 525 case BIO_CTRL_DGRAM_CONNECT:
522 to = (struct sockaddr *)ptr; 526 to = (struct sockaddr *)ptr;
523#if 0 527#if 0
524 if (connect(b->num, to, sizeof(struct sockaddr)) < 0) 528 if (connect(b->num, to, sizeof(struct sockaddr)) < 0) {
525 { perror("connect"); ret = 0; } 529 perror("connect");
526 else 530 ret = 0;
527 { 531 } else {
528#endif 532#endif
529 switch (to->sa_family) 533 switch (to->sa_family) {
530 { 534 case AF_INET:
531 case AF_INET: 535 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
532 memcpy(&data->peer,to,sizeof(data->peer.sa_in)); 536 break;
533 break;
534#if OPENSSL_USE_IPV6 537#if OPENSSL_USE_IPV6
535 case AF_INET6: 538 case AF_INET6:
536 memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); 539 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
537 break; 540 break;
538#endif 541#endif
539 default: 542 default:
540 memcpy(&data->peer,to,sizeof(data->peer.sa)); 543 memcpy(&data->peer, to, sizeof(data->peer.sa));
541 break; 544 break;
542 }
543#if 0
544 } 545 }
546#if 0
547 }
545#endif 548#endif
546 break; 549 break;
547 /* (Linux)kernel sets DF bit on outgoing IP packets */ 550 /* (Linux)kernel sets DF bit on outgoing IP packets */
@@ -549,31 +552,31 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
549#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) 552#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
550 addr_len = (socklen_t)sizeof(addr); 553 addr_len = (socklen_t)sizeof(addr);
551 memset((void *)&addr, 0, sizeof(addr)); 554 memset((void *)&addr, 0, sizeof(addr));
552 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 555 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
553 {
554 ret = 0; 556 ret = 0;
555 break; 557 break;
556 } 558 }
557 switch (addr.sa.sa_family) 559 switch (addr.sa.sa_family) {
558 {
559 case AF_INET: 560 case AF_INET:
560 sockopt_val = IP_PMTUDISC_DO; 561 sockopt_val = IP_PMTUDISC_DO;
561 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER, 562 if ((ret = setsockopt(b->num, IPPROTO_IP,
562 &sockopt_val, sizeof(sockopt_val))) < 0) 563 IP_MTU_DISCOVER, &sockopt_val,
564 sizeof(sockopt_val))) < 0)
563 perror("setsockopt"); 565 perror("setsockopt");
564 break; 566 break;
565#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) 567#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
566 case AF_INET6: 568 case AF_INET6:
567 sockopt_val = IPV6_PMTUDISC_DO; 569 sockopt_val = IPV6_PMTUDISC_DO;
568 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER, 570 if ((ret = setsockopt(b->num, IPPROTO_IPV6,
569 &sockopt_val, sizeof(sockopt_val))) < 0) 571 IPV6_MTU_DISCOVER, &sockopt_val,
572 sizeof(sockopt_val))) < 0)
570 perror("setsockopt"); 573 perror("setsockopt");
571 break; 574 break;
572#endif 575#endif
573 default: 576 default:
574 ret = -1; 577 ret = -1;
575 break; 578 break;
576 } 579 }
577 ret = -1; 580 ret = -1;
578#else 581#else
579 break; 582 break;
@@ -582,74 +585,67 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
582#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) 585#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
583 addr_len = (socklen_t)sizeof(addr); 586 addr_len = (socklen_t)sizeof(addr);
584 memset((void *)&addr, 0, sizeof(addr)); 587 memset((void *)&addr, 0, sizeof(addr));
585 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 588 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
586 {
587 ret = 0; 589 ret = 0;
588 break; 590 break;
589 } 591 }
590 sockopt_len = sizeof(sockopt_val); 592 sockopt_len = sizeof(sockopt_val);
591 switch (addr.sa.sa_family) 593 switch (addr.sa.sa_family) {
592 {
593 case AF_INET: 594 case AF_INET:
594 if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, 595 if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU,
595 &sockopt_len)) < 0 || sockopt_val < 0) 596 (void *)&sockopt_val, &sockopt_len)) < 0 ||
596 { 597 sockopt_val < 0) {
597 ret = 0; 598 ret = 0;
598 } 599 } else {
599 else
600 {
601 /* we assume that the transport protocol is UDP and no 600 /* we assume that the transport protocol is UDP and no
602 * IP options are used. 601 * IP options are used.
603 */ 602 */
604 data->mtu = sockopt_val - 8 - 20; 603 data->mtu = sockopt_val - 8 - 20;
605 ret = data->mtu; 604 ret = data->mtu;
606 } 605 }
607 break; 606 break;
608#if OPENSSL_USE_IPV6 && defined(IPV6_MTU) 607#if OPENSSL_USE_IPV6 && defined(IPV6_MTU)
609 case AF_INET6: 608 case AF_INET6:
610 if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val, 609 if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU,
611 &sockopt_len)) < 0 || sockopt_val < 0) 610 (void *)&sockopt_val, &sockopt_len)) < 0 ||
612 { 611 sockopt_val < 0) {
613 ret = 0; 612 ret = 0;
614 } 613 } else {
615 else
616 {
617 /* we assume that the transport protocol is UDP and no 614 /* we assume that the transport protocol is UDP and no
618 * IPV6 options are used. 615 * IPV6 options are used.
619 */ 616 */
620 data->mtu = sockopt_val - 8 - 40; 617 data->mtu = sockopt_val - 8 - 40;
621 ret = data->mtu; 618 ret = data->mtu;
622 } 619 }
623 break; 620 break;
624#endif 621#endif
625 default: 622default:
626 ret = 0; 623 ret = 0;
627 break; 624 break;
628 } 625 }
629#else 626#else
630 ret = 0; 627 ret = 0;
631#endif 628#endif
632 break; 629 break;
633 case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: 630 case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
634 switch (data->peer.sa.sa_family) 631 switch (data->peer.sa.sa_family) {
635 { 632 case AF_INET:
636 case AF_INET: 633 ret = 576 - 20 - 8;
637 ret = 576 - 20 - 8; 634 break;
638 break;
639#if OPENSSL_USE_IPV6 635#if OPENSSL_USE_IPV6
640 case AF_INET6: 636 case AF_INET6:
641#ifdef IN6_IS_ADDR_V4MAPPED 637#ifdef IN6_IS_ADDR_V4MAPPED
642 if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) 638 if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
643 ret = 576 - 20 - 8; 639 ret = 576 - 20 - 8;
644 else 640 else
645#endif 641#endif
646 ret = 1280 - 40 - 8; 642 ret = 1280 - 40 - 8;
647 break; 643 break;
648#endif 644#endif
649 default: 645 default:
650 ret = 576 - 20 - 8; 646 ret = 576 - 20 - 8;
651 break; 647 break;
652 } 648 }
653 break; 649 break;
654 case BIO_CTRL_DGRAM_GET_MTU: 650 case BIO_CTRL_DGRAM_GET_MTU:
655 return data->mtu; 651 return data->mtu;
@@ -661,65 +657,59 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
661 case BIO_CTRL_DGRAM_SET_CONNECTED: 657 case BIO_CTRL_DGRAM_SET_CONNECTED:
662 to = (struct sockaddr *)ptr; 658 to = (struct sockaddr *)ptr;
663 659
664 if ( to != NULL) 660 if (to != NULL) {
665 {
666 data->connected = 1; 661 data->connected = 1;
667 switch (to->sa_family) 662 switch (to->sa_family) {
668 {
669 case AF_INET:
670 memcpy(&data->peer,to,sizeof(data->peer.sa_in));
671 break;
672#if OPENSSL_USE_IPV6
673 case AF_INET6:
674 memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
675 break;
676#endif
677 default:
678 memcpy(&data->peer,to,sizeof(data->peer.sa));
679 break;
680 }
681 }
682 else
683 {
684 data->connected = 0;
685 memset(&(data->peer), 0x00, sizeof(data->peer));
686 }
687 break;
688 case BIO_CTRL_DGRAM_GET_PEER:
689 switch (data->peer.sa.sa_family)
690 {
691 case AF_INET: 663 case AF_INET:
692 ret=sizeof(data->peer.sa_in); 664 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
693 break; 665 break;
694#if OPENSSL_USE_IPV6 666#if OPENSSL_USE_IPV6
695 case AF_INET6: 667 case AF_INET6:
696 ret=sizeof(data->peer.sa_in6); 668 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
697 break; 669 break;
698#endif 670#endif
699 default: 671 default:
700 ret=sizeof(data->peer.sa); 672 memcpy(&data->peer, to, sizeof(data->peer.sa));
701 break; 673 break;
702 } 674 }
703 if (num==0 || num>ret) 675 } else {
704 num=ret; 676 data->connected = 0;
705 memcpy(ptr,&data->peer,(ret=num)); 677 memset(&(data->peer), 0x00, sizeof(data->peer));
678 }
679 break;
680 case BIO_CTRL_DGRAM_GET_PEER:
681 switch (data->peer.sa.sa_family) {
682 case AF_INET:
683 ret = sizeof(data->peer.sa_in);
684 break;
685#if OPENSSL_USE_IPV6
686 case AF_INET6:
687 ret = sizeof(data->peer.sa_in6);
688 break;
689#endif
690 default:
691 ret = sizeof(data->peer.sa);
692 break;
693 }
694 if (num == 0 || num > ret)
695 num = ret;
696 memcpy(ptr, &data->peer, (ret = num));
706 break; 697 break;
707 case BIO_CTRL_DGRAM_SET_PEER: 698 case BIO_CTRL_DGRAM_SET_PEER:
708 to = (struct sockaddr *) ptr; 699 to = (struct sockaddr *) ptr;
709 switch (to->sa_family) 700 switch (to->sa_family) {
710 { 701 case AF_INET:
711 case AF_INET: 702 memcpy(&data->peer, to, sizeof(data->peer.sa_in));
712 memcpy(&data->peer,to,sizeof(data->peer.sa_in)); 703 break;
713 break;
714#if OPENSSL_USE_IPV6 704#if OPENSSL_USE_IPV6
715 case AF_INET6: 705 case AF_INET6:
716 memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); 706 memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
717 break; 707 break;
718#endif 708#endif
719 default: 709 default:
720 memcpy(&data->peer,to,sizeof(data->peer.sa)); 710 memcpy(&data->peer, to, sizeof(data->peer.sa));
721 break; 711 break;
722 } 712 }
723 break; 713 break;
724 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: 714 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
725 memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); 715 memcpy(&(data->next_timeout), ptr, sizeof(struct timeval));
@@ -728,47 +718,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
728 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: 718 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
729#ifdef OPENSSL_SYS_WINDOWS 719#ifdef OPENSSL_SYS_WINDOWS
730 { 720 {
731 struct timeval *tv = (struct timeval *)ptr; 721 struct timeval *tv = (struct timeval *)ptr;
732 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; 722 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
733 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 723 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
734 (void*)&timeout, sizeof(timeout)) < 0) 724 (void*)&timeout, sizeof(timeout)) < 0) {
735 { perror("setsockopt"); ret = -1; } 725 perror("setsockopt");
726 ret = -1;
727 }
736 } 728 }
737#else 729#else
738 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, 730 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
739 sizeof(struct timeval)) < 0) 731 sizeof(struct timeval)) < 0) {
740 { perror("setsockopt"); ret = -1; } 732 perror("setsockopt");
733 ret = -1;
734 }
741#endif 735#endif
742 break; 736 break;
743 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 737 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
744 { 738 {
745 union { size_t s; int i; } sz = {0}; 739 union {
740 size_t s;
741 int i;
742 } sz = {0};
746#ifdef OPENSSL_SYS_WINDOWS 743#ifdef OPENSSL_SYS_WINDOWS
747 int timeout; 744 int timeout;
748 struct timeval *tv = (struct timeval *)ptr; 745 struct timeval *tv = (struct timeval *)ptr;
749 746
750 sz.i = sizeof(timeout); 747 sz.i = sizeof(timeout);
751 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 748 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
752 (void*)&timeout, &sz.i) < 0) 749 (void*)&timeout, &sz.i) < 0) {
753 { perror("getsockopt"); ret = -1; } 750 perror("getsockopt");
754 else 751 ret = -1;
755 { 752 } else {
756 tv->tv_sec = timeout / 1000; 753 tv->tv_sec = timeout / 1000;
757 tv->tv_usec = (timeout % 1000) * 1000; 754 tv->tv_usec = (timeout % 1000) * 1000;
758 ret = sizeof(*tv); 755 ret = sizeof(*tv);
759 } 756 }
760#else 757#else
761 sz.i = sizeof(struct timeval); 758 sz.i = sizeof(struct timeval);
762 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 759 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
763 ptr, (void *)&sz) < 0) 760 ptr, (void *)&sz) < 0) {
764 { perror("getsockopt"); ret = -1; } 761 perror("getsockopt");
765 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 762 ret = -1;
766 { 763 } else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) {
767 OPENSSL_assert(sz.s<=sizeof(struct timeval)); 764 OPENSSL_assert(sz.s <= sizeof(struct timeval));
768 ret = (int)sz.s; 765 ret = (int)sz.s;
769 } 766 } else
770 else 767 ret = sz.i;
771 ret = sz.i;
772#endif 768#endif
773 } 769 }
774 break; 770 break;
@@ -777,47 +773,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
777 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: 773 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
778#ifdef OPENSSL_SYS_WINDOWS 774#ifdef OPENSSL_SYS_WINDOWS
779 { 775 {
780 struct timeval *tv = (struct timeval *)ptr; 776 struct timeval *tv = (struct timeval *)ptr;
781 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; 777 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
782 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 778 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
783 (void*)&timeout, sizeof(timeout)) < 0) 779 (void*)&timeout, sizeof(timeout)) < 0) {
784 { perror("setsockopt"); ret = -1; } 780 perror("setsockopt");
781 ret = -1;
782 }
785 } 783 }
786#else 784#else
787 if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, 785 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
788 sizeof(struct timeval)) < 0) 786 sizeof(struct timeval)) < 0) {
789 { perror("setsockopt"); ret = -1; } 787 perror("setsockopt");
788 ret = -1;
789 }
790#endif 790#endif
791 break; 791 break;
792 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 792 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
793 { 793 {
794 union { size_t s; int i; } sz = {0}; 794 union {
795 size_t s;
796 int i;
797 } sz = {0};
795#ifdef OPENSSL_SYS_WINDOWS 798#ifdef OPENSSL_SYS_WINDOWS
796 int timeout; 799 int timeout;
797 struct timeval *tv = (struct timeval *)ptr; 800 struct timeval *tv = (struct timeval *)ptr;
798 801
799 sz.i = sizeof(timeout); 802 sz.i = sizeof(timeout);
800 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 803 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
801 (void*)&timeout, &sz.i) < 0) 804 (void*)&timeout, &sz.i) < 0) {
802 { perror("getsockopt"); ret = -1; } 805 perror("getsockopt");
803 else 806 ret = -1;
804 { 807 } else {
805 tv->tv_sec = timeout / 1000; 808 tv->tv_sec = timeout / 1000;
806 tv->tv_usec = (timeout % 1000) * 1000; 809 tv->tv_usec = (timeout % 1000) * 1000;
807 ret = sizeof(*tv); 810 ret = sizeof(*tv);
808 } 811 }
809#else 812#else
810 sz.i = sizeof(struct timeval); 813 sz.i = sizeof(struct timeval);
811 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 814 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
812 ptr, (void *)&sz) < 0) 815 ptr, (void *)&sz) < 0) {
813 { perror("getsockopt"); ret = -1; } 816 perror("getsockopt");
814 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) 817 ret = -1;
815 { 818 } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) {
816 OPENSSL_assert(sz.s<=sizeof(struct timeval)); 819 OPENSSL_assert(sz.s <= sizeof(struct timeval));
817 ret = (int)sz.s; 820 ret = (int)sz.s;
818 } 821 } else
819 else 822 ret = sz.i;
820 ret = sz.i;
821#endif 823#endif
822 } 824 }
823 break; 825 break;
@@ -826,52 +828,52 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
826 /* fall-through */ 828 /* fall-through */
827 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: 829 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
828#ifdef OPENSSL_SYS_WINDOWS 830#ifdef OPENSSL_SYS_WINDOWS
829 if ( data->_errno == WSAETIMEDOUT) 831 if (data->_errno == WSAETIMEDOUT)
830#else 832#else
831 if ( data->_errno == EAGAIN) 833 if (data->_errno == EAGAIN)
832#endif 834#endif
833 { 835 {
834 ret = 1; 836 ret = 1;
835 data->_errno = 0; 837 data->_errno = 0;
836 } 838 } else
837 else
838 ret = 0; 839 ret = 0;
839 break; 840 break;
840#ifdef EMSGSIZE 841#ifdef EMSGSIZE
841 case BIO_CTRL_DGRAM_MTU_EXCEEDED: 842 case BIO_CTRL_DGRAM_MTU_EXCEEDED:
842 if ( data->_errno == EMSGSIZE) 843 if (data->_errno == EMSGSIZE) {
843 {
844 ret = 1; 844 ret = 1;
845 data->_errno = 0; 845 data->_errno = 0;
846 } 846 } else
847 else
848 ret = 0; 847 ret = 0;
849 break; 848 break;
850#endif 849#endif
851 default: 850 default:
852 ret=0; 851 ret = 0;
853 break; 852 break;
854 }
855 return(ret);
856 } 853 }
854 return (ret);
855}
857 856
858static int dgram_puts(BIO *bp, const char *str) 857static int
859 { 858dgram_puts(BIO *bp, const char *str)
860 int n,ret; 859{
860 int n, ret;
861 861
862 n=strlen(str); 862 n = strlen(str);
863 ret=dgram_write(bp,str,n); 863 ret = dgram_write(bp, str, n);
864 return(ret); 864 return (ret);
865 } 865}
866 866
867#ifndef OPENSSL_NO_SCTP 867#ifndef OPENSSL_NO_SCTP
868BIO_METHOD *BIO_s_datagram_sctp(void) 868BIO_METHOD
869 { 869*BIO_s_datagram_sctp(void)
870 return(&methods_dgramp_sctp); 870{
871 } 871 return (&methods_dgramp_sctp);
872}
872 873
873BIO *BIO_new_dgram_sctp(int fd, int close_flag) 874BIO
874 { 875*BIO_new_dgram_sctp(int fd, int close_flag)
876{
875 BIO *bio; 877 BIO *bio;
876 int ret, optval = 20000; 878 int ret, optval = 20000;
877 int auth_data = 0, auth_forward = 0; 879 int auth_data = 0, auth_forward = 0;
@@ -887,9 +889,10 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
887#endif 889#endif
888#endif 890#endif
889 891
890 bio=BIO_new(BIO_s_datagram_sctp()); 892 bio = BIO_new(BIO_s_datagram_sctp());
891 if (bio == NULL) return(NULL); 893 if (bio == NULL)
892 BIO_set_fd(bio,fd,close_flag); 894 return (NULL);
895 BIO_set_fd(bio, fd, close_flag);
893 896
894 /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ 897 /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */
895 auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; 898 auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE;
@@ -909,13 +912,14 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
909 OPENSSL_assert(ret >= 0); 912 OPENSSL_assert(ret >= 0);
910 913
911 for (p = (unsigned char*) authchunks->gauth_chunks; 914 for (p = (unsigned char*) authchunks->gauth_chunks;
912 p < (unsigned char*) authchunks + sockopt_len; 915 p < (unsigned char*) authchunks + sockopt_len;
913 p += sizeof(uint8_t)) 916 p += sizeof(uint8_t)) {
914 { 917 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
915 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; 918 auth_data = 1;
916 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; 919 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
917 } 920 auth_forward = 1;
918 921 }
922
919 OPENSSL_free(authchunks); 923 OPENSSL_free(authchunks);
920 924
921 OPENSSL_assert(auth_data); 925 OPENSSL_assert(auth_data);
@@ -947,20 +951,22 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
947 ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); 951 ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval));
948 OPENSSL_assert(ret >= 0); 952 OPENSSL_assert(ret >= 0);
949 953
950 return(bio); 954 return (bio);
951 } 955}
952 956
953int BIO_dgram_is_sctp(BIO *bio) 957int
954 { 958BIO_dgram_is_sctp(BIO *bio)
959{
955 return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); 960 return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP);
956 } 961}
957 962
958static int dgram_sctp_new(BIO *bi) 963static int
959 { 964dgram_sctp_new(BIO *bi)
965{
960 bio_dgram_sctp_data *data = NULL; 966 bio_dgram_sctp_data *data = NULL;
961 967
962 bi->init=0; 968 bi->init = 0;
963 bi->num=0; 969 bi->num = 0;
964 data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); 970 data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data));
965 if (data == NULL) 971 if (data == NULL)
966 return 0; 972 return 0;
@@ -968,46 +974,50 @@ static int dgram_sctp_new(BIO *bi)
968#ifdef SCTP_PR_SCTP_NONE 974#ifdef SCTP_PR_SCTP_NONE
969 data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; 975 data->prinfo.pr_policy = SCTP_PR_SCTP_NONE;
970#endif 976#endif
971 bi->ptr = data; 977 bi->ptr = data;
972 978
973 bi->flags=0; 979 bi->flags = 0;
974 return(1); 980 return (1);
975 } 981}
976 982
977static int dgram_sctp_free(BIO *a) 983static int
978 { 984dgram_sctp_free(BIO *a)
985{
979 bio_dgram_sctp_data *data; 986 bio_dgram_sctp_data *data;
980 987
981 if (a == NULL) return(0); 988 if (a == NULL)
982 if ( ! dgram_clear(a)) 989 return (0);
990 if (! dgram_clear(a))
983 return 0; 991 return 0;
984 992
985 data = (bio_dgram_sctp_data *)a->ptr; 993 data = (bio_dgram_sctp_data *)a->ptr;
986 if(data != NULL) OPENSSL_free(data); 994 if (data != NULL)
995 OPENSSL_free(data);
987 996
988 return(1); 997 return (1);
989 } 998}
990 999
991#ifdef SCTP_AUTHENTICATION_EVENT 1000#ifdef SCTP_AUTHENTICATION_EVENT
992void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) 1001void
993 { 1002dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
1003{
994 int ret; 1004 int ret;
995 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; 1005 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event;
996 1006
997 if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) 1007 if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) {
998 {
999 struct sctp_authkeyid authkeyid; 1008 struct sctp_authkeyid authkeyid;
1000 1009
1001 /* delete key */ 1010 /* delete key */
1002 authkeyid.scact_keynumber = authkeyevent->auth_keynumber; 1011 authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
1003 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, 1012 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1004 &authkeyid, sizeof(struct sctp_authkeyid)); 1013 &authkeyid, sizeof(struct sctp_authkeyid));
1005 }
1006 } 1014 }
1015}
1007#endif 1016#endif
1008 1017
1009static int dgram_sctp_read(BIO *b, char *out, int outl) 1018static int
1010 { 1019dgram_sctp_read(BIO *b, char *out, int outl)
1020{
1011 int ret = 0, n = 0, i, optval; 1021 int ret = 0, n = 0, i, optval;
1012 socklen_t optlen; 1022 socklen_t optlen;
1013 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; 1023 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
@@ -1017,12 +1027,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1017 struct cmsghdr *cmsg; 1027 struct cmsghdr *cmsg;
1018 char cmsgbuf[512]; 1028 char cmsgbuf[512];
1019 1029
1020 if (out != NULL) 1030 if (out != NULL) {
1021 {
1022 errno = 0; 1031 errno = 0;
1023 1032
1024 do 1033 do {
1025 {
1026 memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); 1034 memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo));
1027 iov.iov_base = out; 1035 iov.iov_base = out;
1028 iov.iov_len = outl; 1036 iov.iov_len = outl;
@@ -1035,15 +1043,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1035 msg.msg_flags = 0; 1043 msg.msg_flags = 0;
1036 n = recvmsg(b->num, &msg, 0); 1044 n = recvmsg(b->num, &msg, 0);
1037 1045
1038 if (msg.msg_controllen > 0) 1046 if (msg.msg_controllen > 0) {
1039 { 1047 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
1040 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg))
1041 {
1042 if (cmsg->cmsg_level != IPPROTO_SCTP) 1048 if (cmsg->cmsg_level != IPPROTO_SCTP)
1043 continue; 1049 continue;
1044#ifdef SCTP_RCVINFO 1050#ifdef SCTP_RCVINFO
1045 if (cmsg->cmsg_type == SCTP_RCVINFO) 1051 if (cmsg->cmsg_type == SCTP_RCVINFO) {
1046 {
1047 struct sctp_rcvinfo *rcvinfo; 1052 struct sctp_rcvinfo *rcvinfo;
1048 1053
1049 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); 1054 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg);
@@ -1054,11 +1059,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1054 data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; 1059 data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn;
1055 data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; 1060 data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn;
1056 data->rcvinfo.rcv_context = rcvinfo->rcv_context; 1061 data->rcvinfo.rcv_context = rcvinfo->rcv_context;
1057 } 1062 }
1058#endif 1063#endif
1059#ifdef SCTP_SNDRCV 1064#ifdef SCTP_SNDRCV
1060 if (cmsg->cmsg_type == SCTP_SNDRCV) 1065 if (cmsg->cmsg_type == SCTP_SNDRCV) {
1061 {
1062 struct sctp_sndrcvinfo *sndrcvinfo; 1066 struct sctp_sndrcvinfo *sndrcvinfo;
1063 1067
1064 sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); 1068 sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
@@ -1069,23 +1073,20 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1069 data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; 1073 data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn;
1070 data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; 1074 data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn;
1071 data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; 1075 data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context;
1072 }
1073#endif
1074 } 1076 }
1077#endif
1075 } 1078 }
1079 }
1076 1080
1077 if (n <= 0) 1081 if (n <= 0) {
1078 {
1079 if (n < 0) 1082 if (n < 0)
1080 ret = n; 1083 ret = n;
1081 break; 1084 break;
1082 } 1085 }
1083 1086
1084 if (msg.msg_flags & MSG_NOTIFICATION) 1087 if (msg.msg_flags & MSG_NOTIFICATION) {
1085 {
1086 snp = (union sctp_notification*) out; 1088 snp = (union sctp_notification*) out;
1087 if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) 1089 if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1088 {
1089#ifdef SCTP_EVENT 1090#ifdef SCTP_EVENT
1090 struct sctp_event event; 1091 struct sctp_event event;
1091#else 1092#else
@@ -1095,13 +1096,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1095 /* If a message has been delayed until the socket 1096 /* If a message has been delayed until the socket
1096 * is dry, it can be sent now. 1097 * is dry, it can be sent now.
1097 */ 1098 */
1098 if (data->saved_message.length > 0) 1099 if (data->saved_message.length > 0) {
1099 {
1100 dgram_sctp_write(data->saved_message.bio, data->saved_message.data, 1100 dgram_sctp_write(data->saved_message.bio, data->saved_message.data,
1101 data->saved_message.length); 1101 data->saved_message.length);
1102 OPENSSL_free(data->saved_message.data); 1102 OPENSSL_free(data->saved_message.data);
1103 data->saved_message.length = 0; 1103 data->saved_message.length = 0;
1104 } 1104 }
1105 1105
1106 /* disable sender dry event */ 1106 /* disable sender dry event */
1107#ifdef SCTP_EVENT 1107#ifdef SCTP_EVENT
@@ -1121,7 +1121,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1121 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); 1121 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
1122 OPENSSL_assert(i >= 0); 1122 OPENSSL_assert(i >= 0);
1123#endif 1123#endif
1124 } 1124 }
1125 1125
1126#ifdef SCTP_AUTHENTICATION_EVENT 1126#ifdef SCTP_AUTHENTICATION_EVENT
1127 if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1127 if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1132,14 +1132,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1132 data->handle_notifications(b, data->notification_context, (void*) out); 1132 data->handle_notifications(b, data->notification_context, (void*) out);
1133 1133
1134 memset(out, 0, outl); 1134 memset(out, 0, outl);
1135 } 1135 } else
1136 else
1137 ret += n; 1136 ret += n;
1138 } 1137 }
1139 while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); 1138 while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl));
1140 1139
1141 if (ret > 0 && !(msg.msg_flags & MSG_EOR)) 1140 if (ret > 0 && !(msg.msg_flags & MSG_EOR)) {
1142 {
1143 /* Partial message read, this should never happen! */ 1141 /* Partial message read, this should never happen! */
1144 1142
1145 /* The buffer was too small, this means the peer sent 1143 /* The buffer was too small, this means the peer sent
@@ -1159,8 +1157,8 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1159 * max record size (2^14 + 2048 + 13) 1157 * max record size (2^14 + 2048 + 13)
1160 */ 1158 */
1161 optlen = (socklen_t) sizeof(int); 1159 optlen = (socklen_t) sizeof(int);
1162 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, 1160 ret = getsockopt(b->num, IPPROTO_SCTP,
1163 &optval, &optlen); 1161 SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen);
1164 OPENSSL_assert(ret >= 0); 1162 OPENSSL_assert(ret >= 0);
1165 OPENSSL_assert(optval >= 18445); 1163 OPENSSL_assert(optval >= 18445);
1166 1164
@@ -1173,21 +1171,18 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1173 memset(out, 0, outl); 1171 memset(out, 0, outl);
1174 BIO_set_retry_read(b); 1172 BIO_set_retry_read(b);
1175 return -1; 1173 return -1;
1176 } 1174 }
1177 1175
1178 BIO_clear_retry_flags(b); 1176 BIO_clear_retry_flags(b);
1179 if (ret < 0) 1177 if (ret < 0) {
1180 { 1178 if (BIO_dgram_should_retry(ret)) {
1181 if (BIO_dgram_should_retry(ret))
1182 {
1183 BIO_set_retry_read(b); 1179 BIO_set_retry_read(b);
1184 data->_errno = errno; 1180 data->_errno = errno;
1185 }
1186 } 1181 }
1182 }
1187 1183
1188 /* Test if peer uses SCTP-AUTH before continuing */ 1184 /* Test if peer uses SCTP-AUTH before continuing */
1189 if (!data->peer_auth_tested) 1185 if (!data->peer_auth_tested) {
1190 {
1191 int ii, auth_data = 0, auth_forward = 0; 1186 int ii, auth_data = 0, auth_forward = 0;
1192 unsigned char *p; 1187 unsigned char *p;
1193 struct sctp_authchunks *authchunks; 1188 struct sctp_authchunks *authchunks;
@@ -1199,29 +1194,30 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1199 OPENSSL_assert(ii >= 0); 1194 OPENSSL_assert(ii >= 0);
1200 1195
1201 for (p = (unsigned char*) authchunks->gauth_chunks; 1196 for (p = (unsigned char*) authchunks->gauth_chunks;
1202 p < (unsigned char*) authchunks + optlen; 1197 p < (unsigned char*) authchunks + optlen;
1203 p += sizeof(uint8_t)) 1198 p += sizeof(uint8_t)) {
1204 { 1199 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
1205 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; 1200 auth_data = 1;
1206 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; 1201 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
1207 } 1202 auth_forward = 1;
1203 }
1208 1204
1209 OPENSSL_free(authchunks); 1205 OPENSSL_free(authchunks);
1210 1206
1211 if (!auth_data || !auth_forward) 1207 if (!auth_data || !auth_forward) {
1212 { 1208 BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR);
1213 BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR);
1214 return -1; 1209 return -1;
1215 } 1210 }
1216 1211
1217 data->peer_auth_tested = 1; 1212 data->peer_auth_tested = 1;
1218 }
1219 } 1213 }
1220 return(ret);
1221 } 1214 }
1215 return (ret);
1216}
1222 1217
1223static int dgram_sctp_write(BIO *b, const char *in, int inl) 1218static int
1224 { 1219dgram_sctp_write(BIO *b, const char *in, int inl)
1220{
1225 int ret; 1221 int ret;
1226 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; 1222 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
1227 struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); 1223 struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo);
@@ -1256,8 +1252,7 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
1256 * socket is not dry yet, we have to save it and send it 1252 * socket is not dry yet, we have to save it and send it
1257 * as soon as the socket gets dry. 1253 * as soon as the socket gets dry.
1258 */ 1254 */
1259 if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) 1255 if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) {
1260 {
1261 data->saved_message.bio = b; 1256 data->saved_message.bio = b;
1262 data->saved_message.length = inl; 1257 data->saved_message.length = inl;
1263 data->saved_message.data = OPENSSL_malloc(inl); 1258 data->saved_message.data = OPENSSL_malloc(inl);
@@ -1317,20 +1312,20 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
1317 ret = sendmsg(b->num, &msg, 0); 1312 ret = sendmsg(b->num, &msg, 0);
1318 1313
1319 BIO_clear_retry_flags(b); 1314 BIO_clear_retry_flags(b);
1320 if (ret <= 0) 1315 if (ret <= 0) {
1321 { 1316 if (BIO_dgram_should_retry(ret)) {
1322 if (BIO_dgram_should_retry(ret)) 1317 BIO_set_retry_write(b);
1323 { 1318
1324 BIO_set_retry_write(b);
1325 data->_errno = errno; 1319 data->_errno = errno;
1326 }
1327 } 1320 }
1328 return(ret);
1329 } 1321 }
1322 return (ret);
1323}
1330 1324
1331static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) 1325static long
1332 { 1326dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1333 long ret=1; 1327{
1328 long ret = 1;
1334 bio_dgram_sctp_data *data = NULL; 1329 bio_dgram_sctp_data *data = NULL;
1335 socklen_t sockopt_len = 0; 1330 socklen_t sockopt_len = 0;
1336 struct sctp_authkeyid authkeyid; 1331 struct sctp_authkeyid authkeyid;
@@ -1338,8 +1333,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1338 1333
1339 data = (bio_dgram_sctp_data *)b->ptr; 1334 data = (bio_dgram_sctp_data *)b->ptr;
1340 1335
1341 switch (cmd) 1336 switch (cmd) {
1342 {
1343 case BIO_CTRL_DGRAM_QUERY_MTU: 1337 case BIO_CTRL_DGRAM_QUERY_MTU:
1344 /* Set to maximum (2^14) 1338 /* Set to maximum (2^14)
1345 * and ignore user input to enable transport 1339 * and ignore user input to enable transport
@@ -1384,7 +1378,8 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1384 /* Get active key */ 1378 /* Get active key */
1385 sockopt_len = sizeof(struct sctp_authkeyid); 1379 sockopt_len = sizeof(struct sctp_authkeyid);
1386 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1380 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1387 if (ret < 0) break; 1381 if (ret < 0)
1382 break;
1388 1383
1389 /* Add new key */ 1384 /* Add new key */
1390 sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); 1385 sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
@@ -1400,12 +1395,14 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1400 memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); 1395 memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t));
1401 1396
1402 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); 1397 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len);
1403 if (ret < 0) break; 1398 if (ret < 0)
1399 break;
1404 1400
1405 /* Reset active key */ 1401 /* Reset active key */
1406 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, 1402 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1407 &authkeyid, sizeof(struct sctp_authkeyid)); 1403 &authkeyid, sizeof(struct sctp_authkeyid));
1408 if (ret < 0) break; 1404 if (ret < 0)
1405 break;
1409 1406
1410 break; 1407 break;
1411 case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: 1408 case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY:
@@ -1414,13 +1411,15 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1414 /* Get active key */ 1411 /* Get active key */
1415 sockopt_len = sizeof(struct sctp_authkeyid); 1412 sockopt_len = sizeof(struct sctp_authkeyid);
1416 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1413 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1417 if (ret < 0) break; 1414 if (ret < 0)
1415 break;
1418 1416
1419 /* Set active key */ 1417 /* Set active key */
1420 authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; 1418 authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1;
1421 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, 1419 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1422 &authkeyid, sizeof(struct sctp_authkeyid)); 1420 &authkeyid, sizeof(struct sctp_authkeyid));
1423 if (ret < 0) break; 1421 if (ret < 0)
1422 break;
1424 1423
1425 /* CCS has been sent, so remember that and fall through 1424 /* CCS has been sent, so remember that and fall through
1426 * to check if we need to deactivate an old key 1425 * to check if we need to deactivate an old key
@@ -1435,12 +1434,12 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1435 data->ccs_rcvd = 1; 1434 data->ccs_rcvd = 1;
1436 1435
1437 /* CSS has been both, received and sent, so deactivate an old key */ 1436 /* CSS has been both, received and sent, so deactivate an old key */
1438 if (data->ccs_rcvd == 1 && data->ccs_sent == 1) 1437 if (data->ccs_rcvd == 1 && data->ccs_sent == 1) {
1439 {
1440 /* Get active key */ 1438 /* Get active key */
1441 sockopt_len = sizeof(struct sctp_authkeyid); 1439 sockopt_len = sizeof(struct sctp_authkeyid);
1442 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); 1440 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
1443 if (ret < 0) break; 1441 if (ret < 0)
1442 break;
1444 1443
1445 /* Deactivate key or delete second last key if 1444 /* Deactivate key or delete second last key if
1446 * SCTP_AUTHENTICATION_EVENT is not available. 1445 * SCTP_AUTHENTICATION_EVENT is not available.
@@ -1449,22 +1448,23 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1449#ifdef SCTP_AUTH_DEACTIVATE_KEY 1448#ifdef SCTP_AUTH_DEACTIVATE_KEY
1450 sockopt_len = sizeof(struct sctp_authkeyid); 1449 sockopt_len = sizeof(struct sctp_authkeyid);
1451 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, 1450 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY,
1452 &authkeyid, sockopt_len); 1451 &authkeyid, sockopt_len);
1453 if (ret < 0) break; 1452 if (ret < 0)
1453 break;
1454#endif 1454#endif
1455#ifndef SCTP_AUTHENTICATION_EVENT 1455#ifndef SCTP_AUTHENTICATION_EVENT
1456 if (authkeyid.scact_keynumber > 0) 1456 if (authkeyid.scact_keynumber > 0) {
1457 {
1458 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; 1457 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
1459 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, 1458 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1460 &authkeyid, sizeof(struct sctp_authkeyid)); 1459 &authkeyid, sizeof(struct sctp_authkeyid));
1461 if (ret < 0) break; 1460 if (ret < 0)
1462 } 1461 break;
1462 }
1463#endif 1463#endif
1464 1464
1465 data->ccs_rcvd = 0; 1465 data->ccs_rcvd = 0;
1466 data->ccs_sent = 0; 1466 data->ccs_sent = 0;
1467 } 1467 }
1468 break; 1468 break;
1469 case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: 1469 case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO:
1470 /* Returns the size of the copied struct. */ 1470 /* Returns the size of the copied struct. */
@@ -1524,30 +1524,30 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1524 /* Pass to default ctrl function to 1524 /* Pass to default ctrl function to
1525 * process SCTP unspecific commands 1525 * process SCTP unspecific commands
1526 */ 1526 */
1527 ret=dgram_ctrl(b, cmd, num, ptr); 1527 ret = dgram_ctrl(b, cmd, num, ptr);
1528 break; 1528 break;
1529 }
1530 return(ret);
1531 } 1529 }
1530 return (ret);
1531}
1532 1532
1533int BIO_dgram_sctp_notification_cb(BIO *b, 1533int
1534 void (*handle_notifications)(BIO *bio, void *context, void *buf), 1534BIO_dgram_sctp_notification_cb(BIO *b,
1535 void *context) 1535 void (*handle_notifications)(BIO *bio, void *context, void *buf),
1536 { 1536 void *context)
1537{
1537 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; 1538 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1538 1539
1539 if (handle_notifications != NULL) 1540 if (handle_notifications != NULL) {
1540 {
1541 data->handle_notifications = handle_notifications; 1541 data->handle_notifications = handle_notifications;
1542 data->notification_context = context; 1542 data->notification_context = context;
1543 } 1543 } else
1544 else
1545 return -1; 1544 return -1;
1546 1545
1547 return 0; 1546 return 0;
1548 } 1547}
1549 1548
1550int BIO_dgram_sctp_wait_for_dry(BIO *b) 1549int
1550BIO_dgram_sctp_wait_for_dry(BIO *b)
1551{ 1551{
1552 int is_dry = 0; 1552 int is_dry = 0;
1553 int n, sockflags, ret; 1553 int n, sockflags, ret;
@@ -1574,9 +1574,9 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1574 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); 1574 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize);
1575 if (ret < 0) 1575 if (ret < 0)
1576 return -1; 1576 return -1;
1577 1577
1578 event.sctp_sender_dry_event = 1; 1578 event.sctp_sender_dry_event = 1;
1579 1579
1580 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); 1580 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
1581#endif 1581#endif
1582 if (ret < 0) 1582 if (ret < 0)
@@ -1595,17 +1595,15 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1595 msg.msg_flags = 0; 1595 msg.msg_flags = 0;
1596 1596
1597 n = recvmsg(b->num, &msg, MSG_PEEK); 1597 n = recvmsg(b->num, &msg, MSG_PEEK);
1598 if (n <= 0) 1598 if (n <= 0) {
1599 {
1600 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1599 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1601 return -1; 1600 return -1;
1602 else 1601 else
1603 return 0; 1602 return 0;
1604 } 1603 }
1605 1604
1606 /* if we find a notification, process it and try again if necessary */ 1605 /* if we find a notification, process it and try again if necessary */
1607 while (msg.msg_flags & MSG_NOTIFICATION) 1606 while (msg.msg_flags & MSG_NOTIFICATION) {
1608 {
1609 memset(&snp, 0x00, sizeof(union sctp_notification)); 1607 memset(&snp, 0x00, sizeof(union sctp_notification));
1610 iov.iov_base = (char *)&snp; 1608 iov.iov_base = (char *)&snp;
1611 iov.iov_len = sizeof(union sctp_notification); 1609 iov.iov_len = sizeof(union sctp_notification);
@@ -1618,16 +1616,14 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1618 msg.msg_flags = 0; 1616 msg.msg_flags = 0;
1619 1617
1620 n = recvmsg(b->num, &msg, 0); 1618 n = recvmsg(b->num, &msg, 0);
1621 if (n <= 0) 1619 if (n <= 0) {
1622 {
1623 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1620 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1624 return -1; 1621 return -1;
1625 else 1622 else
1626 return is_dry; 1623 return is_dry;
1627 } 1624 }
1628 1625
1629 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) 1626 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1630 {
1631 is_dry = 1; 1627 is_dry = 1;
1632 1628
1633 /* disable sender dry event */ 1629 /* disable sender dry event */
@@ -1649,7 +1645,7 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1649#endif 1645#endif
1650 if (ret < 0) 1646 if (ret < 0)
1651 return -1; 1647 return -1;
1652 } 1648 }
1653 1649
1654#ifdef SCTP_AUTHENTICATION_EVENT 1650#ifdef SCTP_AUTHENTICATION_EVENT
1655 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1651 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1672,34 +1668,32 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
1672 msg.msg_flags = 0; 1668 msg.msg_flags = 0;
1673 1669
1674 /* if we have seen the dry already, don't wait */ 1670 /* if we have seen the dry already, don't wait */
1675 if (is_dry) 1671 if (is_dry) {
1676 {
1677 sockflags = fcntl(b->num, F_GETFL, 0); 1672 sockflags = fcntl(b->num, F_GETFL, 0);
1678 fcntl(b->num, F_SETFL, O_NONBLOCK); 1673 fcntl(b->num, F_SETFL, O_NONBLOCK);
1679 } 1674 }
1680 1675
1681 n = recvmsg(b->num, &msg, MSG_PEEK); 1676 n = recvmsg(b->num, &msg, MSG_PEEK);
1682 1677
1683 if (is_dry) 1678 if (is_dry) {
1684 {
1685 fcntl(b->num, F_SETFL, sockflags); 1679 fcntl(b->num, F_SETFL, sockflags);
1686 } 1680 }
1687 1681
1688 if (n <= 0) 1682 if (n <= 0) {
1689 {
1690 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) 1683 if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
1691 return -1; 1684 return -1;
1692 else 1685 else
1693 return is_dry; 1686 return is_dry;
1694 }
1695 } 1687 }
1688 }
1696 1689
1697 /* read anything else */ 1690 /* read anything else */
1698 return is_dry; 1691 return is_dry;
1699} 1692}
1700 1693
1701int BIO_dgram_sctp_msg_waiting(BIO *b) 1694int
1702 { 1695BIO_dgram_sctp_msg_waiting(BIO *b)
1696{
1703 int n, sockflags; 1697 int n, sockflags;
1704 union sctp_notification snp; 1698 union sctp_notification snp;
1705 struct msghdr msg; 1699 struct msghdr msg;
@@ -1708,7 +1702,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1708 1702
1709 /* Check if there are any messages waiting to be read */ 1703 /* Check if there are any messages waiting to be read */
1710 do 1704 do
1711 { 1705 {
1712 memset(&snp, 0x00, sizeof(union sctp_notification)); 1706 memset(&snp, 0x00, sizeof(union sctp_notification));
1713 iov.iov_base = (char *)&snp; 1707 iov.iov_base = (char *)&snp;
1714 iov.iov_len = sizeof(union sctp_notification); 1708 iov.iov_len = sizeof(union sctp_notification);
@@ -1726,8 +1720,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1726 fcntl(b->num, F_SETFL, sockflags); 1720 fcntl(b->num, F_SETFL, sockflags);
1727 1721
1728 /* if notification, process and try again */ 1722 /* if notification, process and try again */
1729 if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) 1723 if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) {
1730 {
1731#ifdef SCTP_AUTHENTICATION_EVENT 1724#ifdef SCTP_AUTHENTICATION_EVENT
1732 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) 1725 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
1733 dgram_sctp_handle_auth_free_key_event(b, &snp); 1726 dgram_sctp_handle_auth_free_key_event(b, &snp);
@@ -1747,34 +1740,35 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
1747 1740
1748 if (data->handle_notifications != NULL) 1741 if (data->handle_notifications != NULL)
1749 data->handle_notifications(b, data->notification_context, (void*) &snp); 1742 data->handle_notifications(b, data->notification_context, (void*) &snp);
1750 } 1743 }
1751 1744
1752 } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); 1745 } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
1753 1746
1754 /* Return 1 if there is a message to be read, return 0 otherwise. */ 1747 /* Return 1 if there is a message to be read, return 0 otherwise. */
1755 if (n > 0) 1748 if (n > 0)
1756 return 1; 1749 return 1;
1757 else 1750 else
1758 return 0; 1751 return 0;
1759 } 1752}
1760 1753
1761static int dgram_sctp_puts(BIO *bp, const char *str) 1754static int
1762 { 1755dgram_sctp_puts(BIO *bp, const char *str)
1763 int n,ret; 1756{
1757 int n, ret;
1764 1758
1765 n=strlen(str); 1759 n = strlen(str);
1766 ret=dgram_sctp_write(bp,str,n); 1760 ret = dgram_sctp_write(bp, str, n);
1767 return(ret); 1761 return (ret);
1768 } 1762}
1769#endif 1763#endif
1770 1764
1771static int BIO_dgram_should_retry(int i) 1765static int
1772 { 1766BIO_dgram_should_retry(int i)
1767{
1773 int err; 1768 int err;
1774 1769
1775 if ((i == 0) || (i == -1)) 1770 if ((i == 0) || (i == -1)) {
1776 { 1771 err = errno;
1777 err=errno;
1778 1772
1779#if defined(OPENSSL_SYS_WINDOWS) 1773#if defined(OPENSSL_SYS_WINDOWS)
1780 /* If the socket return value (i) is -1 1774 /* If the socket return value (i) is -1
@@ -1785,15 +1779,15 @@ static int BIO_dgram_should_retry(int i)
1785 */ 1779 */
1786#endif 1780#endif
1787 1781
1788 return(BIO_dgram_non_fatal_error(err)); 1782 return (BIO_dgram_non_fatal_error(err));
1789 }
1790 return(0);
1791 } 1783 }
1784 return (0);
1785}
1792 1786
1793int BIO_dgram_non_fatal_error(int err) 1787int
1794 { 1788BIO_dgram_non_fatal_error(int err)
1795 switch (err) 1789{
1796 { 1790 switch (err) {
1797#if defined(OPENSSL_SYS_WINDOWS) 1791#if defined(OPENSSL_SYS_WINDOWS)
1798# if defined(WSAEWOULDBLOCK) 1792# if defined(WSAEWOULDBLOCK)
1799 case WSAEWOULDBLOCK: 1793 case WSAEWOULDBLOCK:
@@ -1838,17 +1832,17 @@ int BIO_dgram_non_fatal_error(int err)
1838 case EALREADY: 1832 case EALREADY:
1839#endif 1833#endif
1840 1834
1841 return(1); 1835 return (1);
1842 /* break; */ 1836 /* break; */
1843 default: 1837 default:
1844 break; 1838 break;
1845 }
1846 return(0);
1847 } 1839 }
1840 return (0);
1841}
1848 1842
1849static void get_current_time(struct timeval *t) 1843static void
1850 { 1844get_current_time(struct timeval *t) {
1851 gettimeofday(t, NULL); 1845 gettimeofday(t, NULL);
1852 } 1846}
1853 1847
1854#endif 1848#endif
diff --git a/src/lib/libssl/src/crypto/bio/bss_fd.c b/src/lib/libssl/src/crypto/bio/bss_fd.c
index ab18a56310..35ddd61359 100644
--- a/src/lib/libssl/src/crypto/bio/bss_fd.c
+++ b/src/lib/libssl/src/crypto/bio/bss_fd.c
@@ -90,9 +90,8 @@ static int fd_new(BIO *h);
90static int fd_free(BIO *data); 90static int fd_free(BIO *data);
91int BIO_fd_should_retry(int s); 91int BIO_fd_should_retry(int s);
92 92
93static BIO_METHOD methods_fdp= 93static BIO_METHOD methods_fdp = {
94 { 94 BIO_TYPE_FD, "file descriptor",
95 BIO_TYPE_FD,"file descriptor",
96 fd_write, 95 fd_write,
97 fd_read, 96 fd_read,
98 fd_puts, 97 fd_puts,
@@ -101,178 +100,182 @@ static BIO_METHOD methods_fdp=
101 fd_new, 100 fd_new,
102 fd_free, 101 fd_free,
103 NULL, 102 NULL,
104 }; 103};
105 104
106BIO_METHOD *BIO_s_fd(void) 105BIO_METHOD
107 { 106*BIO_s_fd(void)
108 return(&methods_fdp); 107{
109 } 108 return (&methods_fdp);
109}
110 110
111BIO *BIO_new_fd(int fd,int close_flag) 111BIO
112 { 112*BIO_new_fd(int fd, int close_flag)
113{
113 BIO *ret; 114 BIO *ret;
114 ret=BIO_new(BIO_s_fd()); 115 ret = BIO_new(BIO_s_fd());
115 if (ret == NULL) return(NULL); 116 if (ret == NULL)
116 BIO_set_fd(ret,fd,close_flag); 117 return (NULL);
117 return(ret); 118 BIO_set_fd(ret, fd, close_flag);
118 } 119 return (ret);
120}
119 121
120static int fd_new(BIO *bi) 122static int
121 { 123fd_new(BIO *bi)
122 bi->init=0; 124{
123 bi->num=-1; 125 bi->init = 0;
124 bi->ptr=NULL; 126 bi->num = -1;
127 bi->ptr = NULL;
125 bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ 128 bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */
126 return(1); 129 return (1);
127 } 130}
128 131
129static int fd_free(BIO *a) 132static int
130 { 133fd_free(BIO *a)
131 if (a == NULL) return(0); 134{
132 if (a->shutdown) 135 if (a == NULL)
133 { 136 return (0);
134 if (a->init) 137 if (a->shutdown) {
135 { 138 if (a->init) {
136 UP_close(a->num); 139 UP_close(a->num);
137 }
138 a->init=0;
139 a->flags=BIO_FLAGS_UPLINK;
140 } 140 }
141 return(1); 141 a->init = 0;
142 a->flags = BIO_FLAGS_UPLINK;
142 } 143 }
143 144 return (1);
144static int fd_read(BIO *b, char *out,int outl) 145}
145 {
146 int ret=0;
147 146
148 if (out != NULL) 147static int
149 { 148fd_read(BIO *b, char *out, int outl)
149{
150 int ret = 0;
151
152 if (out != NULL) {
150 errno = 0; 153 errno = 0;
151 ret=UP_read(b->num,out,outl); 154 ret = UP_read(b->num, out, outl);
152 BIO_clear_retry_flags(b); 155 BIO_clear_retry_flags(b);
153 if (ret <= 0) 156 if (ret <= 0) {
154 {
155 if (BIO_fd_should_retry(ret)) 157 if (BIO_fd_should_retry(ret))
156 BIO_set_retry_read(b); 158 BIO_set_retry_read(b);
157 }
158 } 159 }
159 return(ret);
160 } 160 }
161 return (ret);
162}
161 163
162static int fd_write(BIO *b, const char *in, int inl) 164static int
163 { 165fd_write(BIO *b, const char *in, int inl)
166{
164 int ret; 167 int ret;
165 errno = 0; 168 errno = 0;
166 ret=UP_write(b->num,in,inl); 169 ret = UP_write(b->num, in, inl);
167 BIO_clear_retry_flags(b); 170 BIO_clear_retry_flags(b);
168 if (ret <= 0) 171 if (ret <= 0) {
169 {
170 if (BIO_fd_should_retry(ret)) 172 if (BIO_fd_should_retry(ret))
171 BIO_set_retry_write(b); 173 BIO_set_retry_write(b);
172 }
173 return(ret);
174 } 174 }
175 return (ret);
176}
175 177
176static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) 178static long
177 { 179fd_ctrl(BIO *b, int cmd, long num, void *ptr)
178 long ret=1; 180{
181 long ret = 1;
179 int *ip; 182 int *ip;
180 183
181 switch (cmd) 184 switch (cmd) {
182 {
183 case BIO_CTRL_RESET: 185 case BIO_CTRL_RESET:
184 num=0; 186 num = 0;
185 case BIO_C_FILE_SEEK: 187 case BIO_C_FILE_SEEK:
186 ret=(long)UP_lseek(b->num,num,0); 188 ret = (long)UP_lseek(b->num, num, 0);
187 break; 189 break;
188 case BIO_C_FILE_TELL: 190 case BIO_C_FILE_TELL:
189 case BIO_CTRL_INFO: 191 case BIO_CTRL_INFO:
190 ret=(long)UP_lseek(b->num,0,1); 192 ret = (long)UP_lseek(b->num, 0, 1);
191 break; 193 break;
192 case BIO_C_SET_FD: 194 case BIO_C_SET_FD:
193 fd_free(b); 195 fd_free(b);
194 b->num= *((int *)ptr); 196 b->num= *((int *)ptr);
195 b->shutdown=(int)num; 197 b->shutdown = (int)num;
196 b->init=1; 198 b->init = 1;
197 break; 199 break;
198 case BIO_C_GET_FD: 200 case BIO_C_GET_FD:
199 if (b->init) 201 if (b->init) {
200 { 202 ip = (int *)ptr;
201 ip=(int *)ptr; 203 if (ip != NULL)
202 if (ip != NULL) *ip=b->num; 204 *ip = b->num;
203 ret=b->num; 205 ret = b->num;
204 } 206 } else
205 else 207 ret = -1;
206 ret= -1;
207 break; 208 break;
208 case BIO_CTRL_GET_CLOSE: 209 case BIO_CTRL_GET_CLOSE:
209 ret=b->shutdown; 210 ret = b->shutdown;
210 break; 211 break;
211 case BIO_CTRL_SET_CLOSE: 212 case BIO_CTRL_SET_CLOSE:
212 b->shutdown=(int)num; 213 b->shutdown = (int)num;
213 break; 214 break;
214 case BIO_CTRL_PENDING: 215 case BIO_CTRL_PENDING:
215 case BIO_CTRL_WPENDING: 216 case BIO_CTRL_WPENDING:
216 ret=0; 217 ret = 0;
217 break; 218 break;
218 case BIO_CTRL_DUP: 219 case BIO_CTRL_DUP:
219 case BIO_CTRL_FLUSH: 220 case BIO_CTRL_FLUSH:
220 ret=1; 221 ret = 1;
221 break; 222 break;
222 default: 223 default:
223 ret=0; 224 ret = 0;
224 break; 225 break;
225 }
226 return(ret);
227 } 226 }
227 return (ret);
228}
228 229
229static int fd_puts(BIO *bp, const char *str) 230static int
230 { 231fd_puts(BIO *bp, const char *str)
231 int n,ret; 232{
233 int n, ret;
232 234
233 n=strlen(str); 235 n = strlen(str);
234 ret=fd_write(bp,str,n); 236 ret = fd_write(bp, str, n);
235 return(ret); 237 return (ret);
236 } 238}
237 239
238static int fd_gets(BIO *bp, char *buf, int size) 240static int
239 { 241fd_gets(BIO *bp, char *buf, int size)
240 int ret=0; 242{
241 char *ptr=buf; 243 int ret = 0;
242 char *end=buf+size-1; 244 char *ptr = buf;
245 char *end = buf + size - 1;
243 246
244 while ( (ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n') ) 247 while ((ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n'))
245 ptr++; 248 ptr++;
246 249
247 ptr[0]='\0'; 250 ptr[0] = '\0';
248 251
249 if (buf[0] != '\0') 252 if (buf[0] != '\0')
250 ret=strlen(buf); 253 ret = strlen(buf);
251 return(ret); 254 return (ret);
252 } 255}
253 256
254int BIO_fd_should_retry(int i) 257int
255 { 258BIO_fd_should_retry(int i)
259{
256 int err; 260 int err;
257 261
258 if ((i == 0) || (i == -1)) 262 if ((i == 0) || (i == -1)) {
259 { 263 err = errno;
260 err=errno;
261 264
262#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 265#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
263 if ((i == -1) && (err == 0)) 266 if ((i == -1) && (err == 0))
264 return(1); 267 return (1);
265#endif 268#endif
266 269
267 return(BIO_fd_non_fatal_error(err)); 270 return (BIO_fd_non_fatal_error(err));
268 }
269 return(0);
270 } 271 }
272 return (0);
273}
271 274
272int BIO_fd_non_fatal_error(int err) 275int
273 { 276BIO_fd_non_fatal_error(int err)
274 switch (err) 277{
275 { 278 switch (err) {
276 279
277#ifdef EWOULDBLOCK 280#ifdef EWOULDBLOCK
278# ifdef WSAEWOULDBLOCK 281# ifdef WSAEWOULDBLOCK
@@ -309,11 +312,11 @@ int BIO_fd_non_fatal_error(int err)
309#ifdef EALREADY 312#ifdef EALREADY
310 case EALREADY: 313 case EALREADY:
311#endif 314#endif
312 return(1); 315 return (1);
313 /* break; */ 316 /* break; */
314 default: 317 default:
315 break; 318 break;
316 }
317 return(0);
318 } 319 }
320 return (0);
321}
319#endif 322#endif
diff --git a/src/lib/libssl/src/crypto/bio/bss_file.c b/src/lib/libssl/src/crypto/bio/bss_file.c
index 638572ab7f..794f503a69 100644
--- a/src/lib/libssl/src/crypto/bio/bss_file.c
+++ b/src/lib/libssl/src/crypto/bio/bss_file.c
@@ -102,8 +102,8 @@ static int file_gets(BIO *h, char *str, int size);
102static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); 102static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2);
103static int file_new(BIO *h); 103static int file_new(BIO *h);
104static int file_free(BIO *data); 104static int file_free(BIO *data);
105static BIO_METHOD methods_filep= 105
106 { 106static BIO_METHOD methods_filep = {
107 BIO_TYPE_FILE, 107 BIO_TYPE_FILE,
108 "FILE pointer", 108 "FILE pointer",
109 file_write, 109 file_write,
@@ -114,15 +114,16 @@ static BIO_METHOD methods_filep=
114 file_new, 114 file_new,
115 file_free, 115 file_free,
116 NULL, 116 NULL,
117 }; 117};
118 118
119BIO *BIO_new_file(const char *filename, const char *mode) 119BIO
120 { 120*BIO_new_file(const char *filename, const char *mode)
121{
121 BIO *ret; 122 BIO *ret;
122 FILE *file=NULL; 123 FILE *file = NULL;
123 124
124#if defined(_WIN32) && defined(CP_UTF8) 125#if defined(_WIN32) && defined(CP_UTF8)
125 int sz, len_0 = (int)strlen(filename)+1; 126 int sz, len_0 = (int)strlen(filename) + 1;
126 DWORD flags; 127 DWORD flags;
127 128
128 /* 129 /*
@@ -137,173 +138,171 @@ BIO *BIO_new_file(const char *filename, const char *mode)
137 * ERROR_NO_UNICODE_TRANSLATION, in which case we fall 138 * ERROR_NO_UNICODE_TRANSLATION, in which case we fall
138 * back to fopen... 139 * back to fopen...
139 */ 140 */
140 if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS), 141 if ((sz = MultiByteToWideChar(CP_UTF8,(flags = MB_ERR_INVALID_CHARS),
141 filename,len_0,NULL,0))>0 || 142 filename, len_0, NULL, 0)) > 0 ||
142 (GetLastError()==ERROR_INVALID_FLAGS && 143 (GetLastError() == ERROR_INVALID_FLAGS &&
143 (sz=MultiByteToWideChar(CP_UTF8,(flags=0), 144 (sz = MultiByteToWideChar(CP_UTF8,(flags = 0),
144 filename,len_0,NULL,0))>0) 145 filename, len_0, NULL, 0)) > 0)) {
145 )
146 {
147 WCHAR wmode[8]; 146 WCHAR wmode[8];
148 WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); 147 WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
149 148
150 if (MultiByteToWideChar(CP_UTF8,flags, 149 if (MultiByteToWideChar(CP_UTF8, flags, filename, len_0,
151 filename,len_0,wfilename,sz) && 150 wfilename, sz) && MultiByteToWideChar(CP_UTF8, 0, mode,
152 MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1, 151 strlen(mode) + 1, wmode,
153 wmode,sizeof(wmode)/sizeof(wmode[0])) && 152 sizeof(wmode) / sizeof(wmode[0])) &&
154 (file=_wfopen(wfilename,wmode))==NULL && 153 (file = _wfopen(wfilename, wmode)) == NULL &&
155 (errno==ENOENT || errno==EBADF) 154 (errno == ENOENT || errno == EBADF)
156 ) /* UTF-8 decode succeeded, but no file, filename 155 ) /* UTF - 8 decode succeeded, but no file, filename
157 * could still have been locale-ized... */ 156 * could still have been locale-ized... */
158 file = fopen(filename,mode); 157 file = fopen(filename, mode);
159 } 158 } else if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) {
160 else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) 159 file = fopen(filename, mode);
161 { 160 }
162 file = fopen(filename,mode);
163 }
164#else 161#else
165 file=fopen(filename,mode); 162 file = fopen(filename, mode);
163
166#endif 164#endif
167 if (file == NULL) 165 if (file == NULL) {
168 {
169 SYSerr(SYS_F_FOPEN, errno); 166 SYSerr(SYS_F_FOPEN, errno);
170 ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); 167 ERR_add_error_data(5, "fopen('", filename, "', '", mode, "')");
171 if (errno == ENOENT) 168 if (errno == ENOENT)
172 BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); 169 BIOerr(BIO_F_BIO_NEW_FILE, BIO_R_NO_SUCH_FILE);
173 else 170 else
174 BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); 171 BIOerr(BIO_F_BIO_NEW_FILE, ERR_R_SYS_LIB);
175 return(NULL); 172 return (NULL);
176 } 173 }
177 if ((ret=BIO_new(BIO_s_file())) == NULL) 174 if ((ret = BIO_new(BIO_s_file())) == NULL) {
178 {
179 fclose(file); 175 fclose(file);
180 return(NULL); 176 return (NULL);
181 }
182
183 BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
184 BIO_set_fp(ret,file,BIO_CLOSE);
185 return(ret);
186 } 177 }
187 178
188BIO *BIO_new_fp(FILE *stream, int close_flag) 179 BIO_clear_flags(ret, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
189 { 180 BIO_set_fp(ret, file, BIO_CLOSE);
190 BIO *ret; 181 return (ret);
191 182}
192 if ((ret=BIO_new(BIO_s_file())) == NULL)
193 return(NULL);
194
195 BIO_set_flags(ret,BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */
196 BIO_set_fp(ret,stream,close_flag);
197 return(ret);
198 }
199 183
200BIO_METHOD *BIO_s_file(void) 184BIO
201 { 185*BIO_new_fp(FILE *stream, int close_flag)
202 return(&methods_filep); 186{
203 } 187 BIO *ret;
204 188
205static int file_new(BIO *bi) 189 if ((ret = BIO_new(BIO_s_file())) == NULL)
206 { 190 return (NULL);
207 bi->init=0; 191
208 bi->num=0; 192 BIO_set_flags(ret, BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */
209 bi->ptr=NULL; 193 BIO_set_fp(ret, stream, close_flag);
194 return (ret);
195}
196
197BIO_METHOD
198*BIO_s_file(void)
199{
200 return (&methods_filep);
201}
202
203static int
204file_new(BIO *bi)
205{
206 bi->init = 0;
207 bi->num = 0;
208 bi->ptr = NULL;
210 bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ 209 bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */
211 return(1); 210 return (1);
212 } 211}
213 212
214static int file_free(BIO *a) 213static int
215 { 214file_free(BIO *a)
216 if (a == NULL) return(0); 215{
217 if (a->shutdown) 216 if (a == NULL)
218 { 217 return (0);
219 if ((a->init) && (a->ptr != NULL)) 218 if (a->shutdown) {
220 { 219 if ((a->init) && (a->ptr != NULL)) {
221 if (a->flags&BIO_FLAGS_UPLINK) 220 if (a->flags&BIO_FLAGS_UPLINK)
222 UP_fclose (a->ptr); 221 UP_fclose (a->ptr);
223 else 222 else
224 fclose (a->ptr); 223 fclose (a->ptr);
225 a->ptr=NULL; 224 a->ptr = NULL;
226 a->flags=BIO_FLAGS_UPLINK; 225 a->flags = BIO_FLAGS_UPLINK;
227 }
228 a->init=0;
229 } 226 }
230 return(1); 227 a->init = 0;
231 } 228 }
232 229 return (1);
233static int file_read(BIO *b, char *out, int outl) 230}
234 {
235 int ret=0;
236 231
237 if (b->init && (out != NULL)) 232static int
238 { 233file_read(BIO *b, char *out, int outl)
234{
235 int ret = 0;
236
237 if (b->init && (out != NULL)) {
239 if (b->flags&BIO_FLAGS_UPLINK) 238 if (b->flags&BIO_FLAGS_UPLINK)
240 ret=UP_fread(out,1,(int)outl,b->ptr); 239 ret = UP_fread(out, 1,(int)outl, b->ptr);
241 else 240 else
242 ret=fread(out,1,(int)outl,(FILE *)b->ptr); 241 ret = fread(out, 1,(int)outl,(FILE *)b->ptr);
243 if(ret == 0 && (b->flags&BIO_FLAGS_UPLINK)?UP_ferror((FILE *)b->ptr):ferror((FILE *)b->ptr)) 242 if (ret == 0 && (b->flags & BIO_FLAGS_UPLINK) ?
244 { 243 UP_ferror((FILE *)b->ptr) : ferror((FILE *)b->ptr)) {
245 SYSerr(SYS_F_FREAD, errno); 244 SYSerr(SYS_F_FREAD, errno);
246 BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB); 245 BIOerr(BIO_F_FILE_READ, ERR_R_SYS_LIB);
247 ret=-1; 246 ret = -1;
248 }
249 } 247 }
250 return(ret);
251 } 248 }
249 return (ret);
250}
252 251
253static int file_write(BIO *b, const char *in, int inl) 252static int
254 { 253file_write(BIO *b, const char *in, int inl)
255 int ret=0; 254{
255 int ret = 0;
256 256
257 if (b->init && (in != NULL)) 257 if (b->init && (in != NULL)) {
258 {
259 if (b->flags&BIO_FLAGS_UPLINK) 258 if (b->flags&BIO_FLAGS_UPLINK)
260 ret=UP_fwrite(in,(int)inl,1,b->ptr); 259 ret = UP_fwrite(in,(int)inl, 1, b->ptr);
261 else 260 else
262 ret=fwrite(in,(int)inl,1,(FILE *)b->ptr); 261 ret = fwrite(in,(int)inl, 1,(FILE *)b->ptr);
263 if (ret) 262 if (ret)
264 ret=inl; 263 ret = inl;
265 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ 264 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */
266 /* according to Tim Hudson <tjh@cryptsoft.com>, the commented 265 /* according to Tim Hudson <tjh@cryptsoft.com>, the commented
267 * out version above can cause 'inl' write calls under 266 * out version above can cause 'inl' write calls under
268 * some stupid stdio implementations (VMS) */ 267 * some stupid stdio implementations (VMS) */
269 }
270 return(ret);
271 } 268 }
272 269 return (ret);
273static long file_ctrl(BIO *b, int cmd, long num, void *ptr) 270}
274 { 271
275 long ret=1; 272static long
276 FILE *fp=(FILE *)b->ptr; 273file_ctrl(BIO *b, int cmd, long num, void *ptr)
274{
275 long ret = 1;
276 FILE *fp = (FILE *)b->ptr;
277 FILE **fpp; 277 FILE **fpp;
278 char p[4]; 278 char p[4];
279 279
280 switch (cmd) 280 switch (cmd) {
281 {
282 case BIO_C_FILE_SEEK: 281 case BIO_C_FILE_SEEK:
283 case BIO_CTRL_RESET: 282 case BIO_CTRL_RESET:
284 if (b->flags&BIO_FLAGS_UPLINK) 283 if (b->flags&BIO_FLAGS_UPLINK)
285 ret=(long)UP_fseek(b->ptr,num,0); 284 ret = (long)UP_fseek(b->ptr, num, 0);
286 else 285 else
287 ret=(long)fseek(fp,num,0); 286 ret = (long)fseek(fp, num, 0);
288 break; 287 break;
289 case BIO_CTRL_EOF: 288 case BIO_CTRL_EOF:
290 if (b->flags&BIO_FLAGS_UPLINK) 289 if (b->flags&BIO_FLAGS_UPLINK)
291 ret=(long)UP_feof(fp); 290 ret = (long)UP_feof(fp);
292 else 291 else
293 ret=(long)feof(fp); 292 ret = (long)feof(fp);
294 break; 293 break;
295 case BIO_C_FILE_TELL: 294 case BIO_C_FILE_TELL:
296 case BIO_CTRL_INFO: 295 case BIO_CTRL_INFO:
297 if (b->flags&BIO_FLAGS_UPLINK) 296 if (b->flags&BIO_FLAGS_UPLINK)
298 ret=UP_ftell(b->ptr); 297 ret = UP_ftell(b->ptr);
299 else 298 else
300 ret=ftell(fp); 299 ret = ftell(fp);
301 break; 300 break;
302 case BIO_C_SET_FILE_PTR: 301 case BIO_C_SET_FILE_PTR:
303 file_free(b); 302 file_free(b);
304 b->shutdown=(int)num&BIO_CLOSE; 303 b->shutdown = (int)num&BIO_CLOSE;
305 b->ptr=ptr; 304 b->ptr = ptr;
306 b->init=1; 305 b->init = 1;
307#if BIO_FLAGS_UPLINK!=0 306#if BIO_FLAGS_UPLINK!=0
308#if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) 307#if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES)
309#define _IOB_ENTRIES 20 308#define _IOB_ENTRIES 20
@@ -311,8 +310,8 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
311#if defined(_IOB_ENTRIES) 310#if defined(_IOB_ENTRIES)
312 /* Safety net to catch purely internal BIO_set_fp calls */ 311 /* Safety net to catch purely internal BIO_set_fp calls */
313 if ((size_t)ptr >= (size_t)stdin && 312 if ((size_t)ptr >= (size_t)stdin &&
314 (size_t)ptr < (size_t)(stdin+_IOB_ENTRIES)) 313 (size_t)ptr < (size_t)(stdin + _IOB_ENTRIES))
315 BIO_clear_flags(b,BIO_FLAGS_UPLINK); 314 BIO_clear_flags(b, BIO_FLAGS_UPLINK);
316#endif 315#endif
317#endif 316#endif
318#ifdef UP_fsetmod 317#ifdef UP_fsetmod
@@ -322,102 +321,94 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
322#endif 321#endif
323 { 322 {
324#if defined(OPENSSL_SYS_WINDOWS) 323#if defined(OPENSSL_SYS_WINDOWS)
325 int fd = _fileno((FILE*)ptr); 324 int fd = _fileno((FILE*)ptr);
326 if (num & BIO_FP_TEXT) 325 if (num & BIO_FP_TEXT)
327 _setmode(fd,_O_TEXT); 326 _setmode(fd, _O_TEXT);
328 else 327 else
329 _setmode(fd,_O_BINARY); 328 _setmode(fd, _O_BINARY);
330#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) 329#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
331 int fd = fileno((FILE*)ptr); 330 int fd = fileno((FILE*)ptr);
332 /* Under CLib there are differences in file modes */ 331 /* Under CLib there are differences in file modes */
333 if (num & BIO_FP_TEXT) 332 if (num & BIO_FP_TEXT)
334 setmode(fd,O_TEXT); 333 setmode(fd, O_TEXT);
335 else
336 setmode(fd,O_BINARY);
337#elif defined(OPENSSL_SYS_MSDOS)
338 int fd = fileno((FILE*)ptr);
339 /* Set correct text/binary mode */
340 if (num & BIO_FP_TEXT)
341 _setmode(fd,_O_TEXT);
342 /* Dangerous to set stdin/stdout to raw (unless redirected) */
343 else
344 {
345 if (fd == STDIN_FILENO || fd == STDOUT_FILENO)
346 {
347 if (isatty(fd) <= 0)
348 _setmode(fd,_O_BINARY);
349 }
350 else 334 else
351 _setmode(fd,_O_BINARY); 335 setmode(fd, O_BINARY);
336#elif defined(OPENSSL_SYS_MSDOS)
337 int fd = fileno((FILE*)ptr);
338 /* Set correct text/binary mode */
339 if (num & BIO_FP_TEXT)
340 _setmode(fd, _O_TEXT);
341 /* Dangerous to set stdin/stdout to raw (unless redirected) */
342 else {
343 if (fd == STDIN_FILENO || fd == STDOUT_FILENO) {
344 if (isatty(fd) <= 0)
345 _setmode(fd, _O_BINARY);
346 } else
347 _setmode(fd, _O_BINARY);
352 } 348 }
353#elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) 349#elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
354 int fd = fileno((FILE*)ptr); 350 int fd = fileno((FILE*)ptr);
355 if (num & BIO_FP_TEXT) 351 if (num & BIO_FP_TEXT)
356 setmode(fd, O_TEXT); 352 setmode(fd, O_TEXT);
357 else 353 else
358 setmode(fd, O_BINARY); 354 setmode(fd, O_BINARY);
359#endif 355#endif
360 } 356 }
361 break; 357 break;
362 case BIO_C_SET_FILENAME: 358 case BIO_C_SET_FILENAME:
363 file_free(b); 359 file_free(b);
364 b->shutdown=(int)num&BIO_CLOSE; 360 b->shutdown = (int)num&BIO_CLOSE;
365 if (num & BIO_FP_APPEND) 361 if (num & BIO_FP_APPEND) {
366 {
367 if (num & BIO_FP_READ) 362 if (num & BIO_FP_READ)
368 BUF_strlcpy(p,"a+",sizeof p); 363 BUF_strlcpy(p, "a+", sizeof p);
369 else BUF_strlcpy(p,"a",sizeof p); 364 else BUF_strlcpy(p, "a", sizeof p);
370 } 365 } else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE))
371 else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) 366 BUF_strlcpy(p, "r+", sizeof p);
372 BUF_strlcpy(p,"r+",sizeof p);
373 else if (num & BIO_FP_WRITE) 367 else if (num & BIO_FP_WRITE)
374 BUF_strlcpy(p,"w",sizeof p); 368 BUF_strlcpy(p, "w", sizeof p);
375 else if (num & BIO_FP_READ) 369 else if (num & BIO_FP_READ)
376 BUF_strlcpy(p,"r",sizeof p); 370 BUF_strlcpy(p, "r", sizeof p);
377 else 371 else {
378 { 372 BIOerr(BIO_F_FILE_CTRL, BIO_R_BAD_FOPEN_MODE);
379 BIOerr(BIO_F_FILE_CTRL,BIO_R_BAD_FOPEN_MODE); 373 ret = 0;
380 ret=0;
381 break; 374 break;
382 } 375 }
383#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) 376#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
384 if (!(num & BIO_FP_TEXT)) 377 if (!(num & BIO_FP_TEXT))
385 strcat(p,"b"); 378 strcat(p, "b");
386 else 379 else
387 strcat(p,"t"); 380 strcat(p, "t");
388#endif 381#endif
389#if defined(OPENSSL_SYS_NETWARE) 382#if defined(OPENSSL_SYS_NETWARE)
390 if (!(num & BIO_FP_TEXT)) 383 if (!(num & BIO_FP_TEXT))
391 strcat(p,"b"); 384 strcat(p, "b");
392 else 385 else
393 strcat(p,"t"); 386 strcat(p, "t");
394#endif 387#endif
395 fp=fopen(ptr,p); 388 fp = fopen(ptr, p);
396 if (fp == NULL) 389 if (fp == NULL) {
397 {
398 SYSerr(SYS_F_FOPEN, errno); 390 SYSerr(SYS_F_FOPEN, errno);
399 ERR_add_error_data(5,"fopen('",ptr,"','",p,"')"); 391 ERR_add_error_data(5, "fopen('", ptr, "', '", p, "')");
400 BIOerr(BIO_F_FILE_CTRL,ERR_R_SYS_LIB); 392 BIOerr(BIO_F_FILE_CTRL, ERR_R_SYS_LIB);
401 ret=0; 393 ret = 0;
402 break; 394 break;
403 } 395 }
404 b->ptr=fp; 396 b->ptr = fp;
405 b->init=1; 397 b->init = 1;
406 BIO_clear_flags(b,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ 398 BIO_clear_flags(b, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
407 break; 399 break;
408 case BIO_C_GET_FILE_PTR: 400 case BIO_C_GET_FILE_PTR:
409 /* the ptr parameter is actually a FILE ** in this case. */ 401 /* the ptr parameter is actually a FILE ** in this case. */
410 if (ptr != NULL) 402 if (ptr != NULL) {
411 { 403 fpp = (FILE **)ptr;
412 fpp=(FILE **)ptr; 404 *fpp = (FILE *)b->ptr;
413 *fpp=(FILE *)b->ptr; 405 }
414 }
415 break; 406 break;
416 case BIO_CTRL_GET_CLOSE: 407 case BIO_CTRL_GET_CLOSE:
417 ret=(long)b->shutdown; 408 ret = (long)b->shutdown;
418 break; 409 break;
419 case BIO_CTRL_SET_CLOSE: 410 case BIO_CTRL_SET_CLOSE:
420 b->shutdown=(int)num; 411 b->shutdown = (int)num;
421 break; 412 break;
422 case BIO_CTRL_FLUSH: 413 case BIO_CTRL_FLUSH:
423 if (b->flags&BIO_FLAGS_UPLINK) 414 if (b->flags&BIO_FLAGS_UPLINK)
@@ -426,7 +417,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
426 fflush((FILE *)b->ptr); 417 fflush((FILE *)b->ptr);
427 break; 418 break;
428 case BIO_CTRL_DUP: 419 case BIO_CTRL_DUP:
429 ret=1; 420 ret = 1;
430 break; 421 break;
431 422
432 case BIO_CTRL_WPENDING: 423 case BIO_CTRL_WPENDING:
@@ -434,44 +425,41 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
434 case BIO_CTRL_PUSH: 425 case BIO_CTRL_PUSH:
435 case BIO_CTRL_POP: 426 case BIO_CTRL_POP:
436 default: 427 default:
437 ret=0; 428 ret = 0;
438 break; 429 break;
439 }
440 return(ret);
441 } 430 }
431 return (ret);
432}
442 433
443static int file_gets(BIO *bp, char *buf, int size) 434static int
444 { 435file_gets(BIO *bp, char *buf, int size)
445 int ret=0; 436{
437 int ret = 0;
446 438
447 buf[0]='\0'; 439 buf[0] = '\0';
448 if (bp->flags&BIO_FLAGS_UPLINK) 440 if (bp->flags&BIO_FLAGS_UPLINK) {
449 { 441 if (!UP_fgets(buf, size, bp->ptr))
450 if (!UP_fgets(buf,size,bp->ptr))
451 goto err; 442 goto err;
452 } 443 } else {
453 else 444 if (!fgets(buf, size,(FILE *)bp->ptr))
454 {
455 if (!fgets(buf,size,(FILE *)bp->ptr))
456 goto err; 445 goto err;
457 }
458 if (buf[0] != '\0')
459 ret=strlen(buf);
460 err:
461 return(ret);
462 } 446 }
447 if (buf[0] != '\0')
448 ret = strlen(buf);
449err:
450 return (ret);
451}
463 452
464static int file_puts(BIO *bp, const char *str) 453static int
465 { 454file_puts(BIO *bp, const char *str)
466 int n,ret; 455{
456 int n, ret;
467 457
468 n=strlen(str); 458 n = strlen(str);
469 ret=file_write(bp,str,n); 459 ret = file_write(bp, str, n);
470 return(ret); 460 return (ret);
471 } 461}
472 462
473#endif /* OPENSSL_NO_STDIO */ 463#endif /* OPENSSL_NO_STDIO */
474 464
475#endif /* HEADER_BSS_FILE_C */ 465#endif /* HEADER_BSS_FILE_C */
476
477
diff --git a/src/lib/libssl/src/crypto/bio/bss_log.c b/src/lib/libssl/src/crypto/bio/bss_log.c
index 1cc413a916..9225af4df2 100644
--- a/src/lib/libssl/src/crypto/bio/bss_log.c
+++ b/src/lib/libssl/src/crypto/bio/bss_log.c
@@ -80,7 +80,7 @@
80# if __INITIAL_POINTER_SIZE == 64 80# if __INITIAL_POINTER_SIZE == 64
81# pragma pointer_size save 81# pragma pointer_size save
82# pragma pointer_size 32 82# pragma pointer_size 32
83 void * _malloc32 (__size_t); 83void * _malloc32 (__size_t);
84# pragma pointer_size restore 84# pragma pointer_size restore
85# endif /* __INITIAL_POINTER_SIZE == 64 */ 85# endif /* __INITIAL_POINTER_SIZE == 64 */
86# endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ 86# endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */
@@ -131,9 +131,8 @@ static void xopenlog(BIO* bp, char* name, int level);
131static void xsyslog(BIO* bp, int priority, const char* string); 131static void xsyslog(BIO* bp, int priority, const char* string);
132static void xcloselog(BIO* bp); 132static void xcloselog(BIO* bp);
133 133
134static BIO_METHOD methods_slg= 134static BIO_METHOD methods_slg = {
135 { 135 BIO_TYPE_MEM, "syslog",
136 BIO_TYPE_MEM,"syslog",
137 slg_write, 136 slg_write,
138 NULL, 137 NULL,
139 slg_puts, 138 slg_puts,
@@ -142,43 +141,46 @@ static BIO_METHOD methods_slg=
142 slg_new, 141 slg_new,
143 slg_free, 142 slg_free,
144 NULL, 143 NULL,
145 }; 144};
146 145
147BIO_METHOD *BIO_s_log(void) 146BIO_METHOD
148 { 147*BIO_s_log(void)
149 return(&methods_slg); 148{
150 } 149 return (&methods_slg);
150}
151 151
152static int slg_new(BIO *bi) 152static int
153 { 153slg_new(BIO *bi)
154 bi->init=1; 154{
155 bi->num=0; 155 bi->init = 1;
156 bi->ptr=NULL; 156 bi->num = 0;
157 bi->ptr = NULL;
157 xopenlog(bi, "application", LOG_DAEMON); 158 xopenlog(bi, "application", LOG_DAEMON);
158 return(1); 159 return (1);
159 } 160}
160 161
161static int slg_free(BIO *a) 162static int
162 { 163slg_free(BIO *a)
163 if (a == NULL) return(0); 164{
165 if (a == NULL)
166 return (0);
164 xcloselog(a); 167 xcloselog(a);
165 return(1); 168 return (1);
166 } 169}
167 170
168static int slg_write(BIO *b, const char *in, int inl) 171static int
169 { 172slg_write(BIO *b, const char *in, int inl)
170 int ret= inl; 173{
174 int ret = inl;
171 char* buf; 175 char* buf;
172 char* pp; 176 char* pp;
173 int priority, i; 177 int priority, i;
174 static const struct 178 static const struct {
175 {
176 int strl; 179 int strl;
177 char str[10]; 180 char str[10];
178 int log_level; 181 int log_level;
179 } 182 }
180 mapping[] = 183 mapping[] = {
181 {
182 { 6, "PANIC ", LOG_EMERG }, 184 { 6, "PANIC ", LOG_EMERG },
183 { 6, "EMERG ", LOG_EMERG }, 185 { 6, "EMERG ", LOG_EMERG },
184 { 4, "EMR ", LOG_EMERG }, 186 { 4, "EMR ", LOG_EMERG },
@@ -199,69 +201,72 @@ static int slg_write(BIO *b, const char *in, int inl)
199 { 6, "DEBUG ", LOG_DEBUG }, 201 { 6, "DEBUG ", LOG_DEBUG },
200 { 4, "DBG ", LOG_DEBUG }, 202 { 4, "DBG ", LOG_DEBUG },
201 { 0, "", LOG_ERR } /* The default */ 203 { 0, "", LOG_ERR } /* The default */
202 }; 204 };
203 205
204 if((buf= (char *)OPENSSL_malloc(inl+ 1)) == NULL){ 206 if ((buf = (char *)OPENSSL_malloc(inl + 1)) == NULL) {
205 return(0); 207 return (0);
206 } 208 }
207 strncpy(buf, in, inl); 209 strncpy(buf, in, inl);
208 buf[inl]= '\0'; 210 buf[inl] = '\0';
209 211
210 i = 0; 212 i = 0;
211 while(strncmp(buf, mapping[i].str, mapping[i].strl) != 0) i++; 213 while (strncmp(buf, mapping[i].str, mapping[i].strl) != 0)
214 i++;
212 priority = mapping[i].log_level; 215 priority = mapping[i].log_level;
213 pp = buf + mapping[i].strl; 216 pp = buf + mapping[i].strl;
214 217
215 xsyslog(b, priority, pp); 218 xsyslog(b, priority, pp);
216 219
217 OPENSSL_free(buf); 220 OPENSSL_free(buf);
218 return(ret); 221 return (ret);
219 } 222}
220 223
221static long slg_ctrl(BIO *b, int cmd, long num, void *ptr) 224static long
222 { 225slg_ctrl(BIO *b, int cmd, long num, void *ptr)
223 switch (cmd) 226{
224 { 227 switch (cmd) {
225 case BIO_CTRL_SET: 228 case BIO_CTRL_SET:
226 xcloselog(b); 229 xcloselog(b);
227 xopenlog(b, ptr, num); 230 xopenlog(b, ptr, num);
228 break; 231 break;
229 default: 232 default:
230 break; 233 break;
231 }
232 return(0);
233 } 234 }
235 return (0);
236}
234 237
235static int slg_puts(BIO *bp, const char *str) 238static int
236 { 239slg_puts(BIO *bp, const char *str)
237 int n,ret; 240{
241 int n, ret;
238 242
239 n=strlen(str); 243 n = strlen(str);
240 ret=slg_write(bp,str,n); 244 ret = slg_write(bp, str, n);
241 return(ret); 245 return (ret);
242 } 246}
243 247
244#if defined(OPENSSL_SYS_WIN32) 248#if defined(OPENSSL_SYS_WIN32)
245 249
246static void xopenlog(BIO* bp, char* name, int level) 250static void
251xopenlog(BIO* bp, char* name, int level)
247{ 252{
248 if (check_winnt()) 253 if (check_winnt())
249 bp->ptr = RegisterEventSourceA(NULL,name); 254 bp->ptr = RegisterEventSourceA(NULL, name);
250 else 255 else
251 bp->ptr = NULL; 256 bp->ptr = NULL;
252} 257}
253 258
254static void xsyslog(BIO *bp, int priority, const char *string) 259static void
260xsyslog(BIO *bp, int priority, const char *string)
255{ 261{
256 LPCSTR lpszStrings[2]; 262 LPCSTR lpszStrings[2];
257 WORD evtype= EVENTLOG_ERROR_TYPE; 263 WORD evtype = EVENTLOG_ERROR_TYPE;
258 char pidbuf[DECIMAL_SIZE(DWORD)+4]; 264 char pidbuf[DECIMAL_SIZE(DWORD) + 4];
259 265
260 if (bp->ptr == NULL) 266 if (bp->ptr == NULL)
261 return; 267 return;
262 268
263 switch (priority) 269 switch (priority) {
264 {
265 case LOG_EMERG: 270 case LOG_EMERG:
266 case LOG_ALERT: 271 case LOG_ALERT:
267 case LOG_CRIT: 272 case LOG_CRIT:
@@ -280,33 +285,37 @@ static void xsyslog(BIO *bp, int priority, const char *string)
280 as error anyway. */ 285 as error anyway. */
281 evtype = EVENTLOG_ERROR_TYPE; 286 evtype = EVENTLOG_ERROR_TYPE;
282 break; 287 break;
283 } 288 }
284 289
285 sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); 290 sprintf(pidbuf, "[%u] ", GetCurrentProcessId());
286 lpszStrings[0] = pidbuf; 291 lpszStrings[0] = pidbuf;
287 lpszStrings[1] = string; 292 lpszStrings[1] = string;
288 293
289 ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, 294 ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0,
290 lpszStrings, NULL); 295 lpszStrings, NULL);
291} 296}
292 297
293static void xcloselog(BIO* bp) 298static void
299xcloselog(BIO* bp)
294{ 300{
295 if(bp->ptr) 301 if (bp->ptr)
296 DeregisterEventSource((HANDLE)(bp->ptr)); 302 DeregisterEventSource((HANDLE)(bp->ptr));
297 bp->ptr= NULL; 303 bp->ptr = NULL;
298} 304}
299 305
300#elif defined(OPENSSL_SYS_VMS) 306#elif defined(OPENSSL_SYS_VMS)
301 307
302static int VMS_OPC_target = LOG_DAEMON; 308static int VMS_OPC_target = LOG_DAEMON;
303 309
304static void xopenlog(BIO* bp, char* name, int level) 310static void
311xopenlog(BIO* bp, char* name, int level)
305{ 312{
306 VMS_OPC_target = level; 313 VMS_OPC_target = level;
314
307} 315}
308 316
309static void xsyslog(BIO *bp, int priority, const char *string) 317static void
318xsyslog(BIO *bp, int priority, const char *string)
310{ 319{
311 struct dsc$descriptor_s opc_dsc; 320 struct dsc$descriptor_s opc_dsc;
312 321
@@ -329,21 +338,28 @@ static void xsyslog(BIO *bp, int priority, const char *string)
329 338
330 char buf[10240]; 339 char buf[10240];
331 unsigned int len; 340 unsigned int len;
332 struct dsc$descriptor_s buf_dsc; 341 struct dsc$descriptor_s buf_dsc;
333 $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); 342 $DESCRIPTOR(fao_cmd, "!AZ: !AZ");
334 char *priority_tag; 343 char *priority_tag;
335 344
336 switch (priority) 345 switch (priority) {
337 { 346 case LOG_EMERG:
338 case LOG_EMERG: priority_tag = "Emergency"; break; 347 priority_tag = "Emergency"; break;
339 case LOG_ALERT: priority_tag = "Alert"; break; 348 case LOG_ALERT:
340 case LOG_CRIT: priority_tag = "Critical"; break; 349 priority_tag = "Alert"; break;
341 case LOG_ERR: priority_tag = "Error"; break; 350 case LOG_CRIT:
342 case LOG_WARNING: priority_tag = "Warning"; break; 351 priority_tag = "Critical"; break;
343 case LOG_NOTICE: priority_tag = "Notice"; break; 352 case LOG_ERR:
344 case LOG_INFO: priority_tag = "Info"; break; 353 priority_tag = "Error"; break;
345 case LOG_DEBUG: priority_tag = "DEBUG"; break; 354 case LOG_WARNING:
346 } 355 priority_tag = "Warning"; break;
356 case LOG_NOTICE:
357 priority_tag = "Notice"; break;
358 case LOG_INFO:
359 priority_tag = "Info"; break;
360 case LOG_DEBUG:
361 priority_tag = "DEBUG"; break;
362 }
347 363
348 buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 364 buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
349 buf_dsc.dsc$b_class = DSC$K_CLASS_S; 365 buf_dsc.dsc$b_class = DSC$K_CLASS_S;
@@ -353,7 +369,7 @@ static void xsyslog(BIO *bp, int priority, const char *string)
353 lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); 369 lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string);
354 370
355 /* We know there's an 8-byte header. That's documented. */ 371 /* We know there's an 8-byte header. That's documented. */
356 opcdef_p = OPCDEF_MALLOC( 8+ len); 372 opcdef_p = OPCDEF_MALLOC( 8 + len);
357 opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; 373 opcdef_p->opc$b_ms_type = OPC$_RQ_RQST;
358 memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); 374 memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3);
359 opcdef_p->opc$l_ms_rqstid = 0; 375 opcdef_p->opc$l_ms_rqstid = 0;
@@ -369,13 +385,15 @@ static void xsyslog(BIO *bp, int priority, const char *string)
369 OPENSSL_free(opcdef_p); 385 OPENSSL_free(opcdef_p);
370} 386}
371 387
372static void xcloselog(BIO* bp) 388static void
389xcloselog(BIO* bp)
373{ 390{
374} 391}
375 392
376#else /* Unix/Watt32 */ 393#else /* Unix/Watt32 */
377 394
378static void xopenlog(BIO* bp, char* name, int level) 395static void
396xopenlog(BIO* bp, char* name, int level)
379{ 397{
380#ifdef WATT32 /* djgpp/DOS */ 398#ifdef WATT32 /* djgpp/DOS */
381 openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); 399 openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level);
@@ -384,12 +402,14 @@ static void xopenlog(BIO* bp, char* name, int level)
384#endif 402#endif
385} 403}
386 404
387static void xsyslog(BIO *bp, int priority, const char *string) 405static void
406xsyslog(BIO *bp, int priority, const char *string)
388{ 407{
389 syslog(priority, "%s", string); 408 syslog(priority, "%s", string);
390} 409}
391 410
392static void xcloselog(BIO* bp) 411static void
412xcloselog(BIO* bp)
393{ 413{
394 closelog(); 414 closelog();
395} 415}
diff --git a/src/lib/libssl/src/crypto/bio/bss_mem.c b/src/lib/libssl/src/crypto/bio/bss_mem.c
index 37d4194e4b..a5192202bd 100644
--- a/src/lib/libssl/src/crypto/bio/bss_mem.c
+++ b/src/lib/libssl/src/crypto/bio/bss_mem.c
@@ -68,8 +68,8 @@ static int mem_gets(BIO *h, char *str, int size);
68static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); 68static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2);
69static int mem_new(BIO *h); 69static int mem_new(BIO *h);
70static int mem_free(BIO *data); 70static int mem_free(BIO *data);
71static BIO_METHOD mem_method= 71
72 { 72static BIO_METHOD mem_method = {
73 BIO_TYPE_MEM, 73 BIO_TYPE_MEM,
74 "memory buffer", 74 "memory buffer",
75 mem_write, 75 mem_write,
@@ -80,28 +80,31 @@ static BIO_METHOD mem_method=
80 mem_new, 80 mem_new,
81 mem_free, 81 mem_free,
82 NULL, 82 NULL,
83 }; 83};
84 84
85/* bio->num is used to hold the value to return on 'empty', if it is 85/* bio->num is used to hold the value to return on 'empty', if it is
86 * 0, should_retry is not set */ 86 * 0, should_retry is not set */
87 87
88BIO_METHOD *BIO_s_mem(void) 88BIO_METHOD
89 { 89*BIO_s_mem(void)
90 return(&mem_method); 90{
91 } 91 return (&mem_method);
92}
92 93
93BIO *BIO_new_mem_buf(void *buf, int len) 94BIO
95*BIO_new_mem_buf(void *buf, int len)
94{ 96{
95 BIO *ret; 97 BIO *ret;
96 BUF_MEM *b; 98 BUF_MEM *b;
97 size_t sz; 99 size_t sz;
98 100
99 if (!buf) { 101 if (!buf) {
100 BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); 102 BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER);
101 return NULL; 103 return NULL;
102 } 104 }
103 sz = (len<0) ? strlen(buf) : (size_t)len; 105 sz = (len < 0) ? strlen(buf) : (size_t)len;
104 if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; 106 if (!(ret = BIO_new(BIO_s_mem())))
107 return NULL;
105 b = (BUF_MEM *)ret->ptr; 108 b = (BUF_MEM *)ret->ptr;
106 b->data = buf; 109 b->data = buf;
107 b->length = sz; 110 b->length = sz;
@@ -112,208 +115,205 @@ BIO *BIO_new_mem_buf(void *buf, int len)
112 return ret; 115 return ret;
113} 116}
114 117
115static int mem_new(BIO *bi) 118static int
116 { 119mem_new(BIO *bi)
120{
117 BUF_MEM *b; 121 BUF_MEM *b;
118 122
119 if ((b=BUF_MEM_new()) == NULL) 123 if ((b = BUF_MEM_new()) == NULL)
120 return(0); 124 return (0);
121 bi->shutdown=1; 125 bi->shutdown = 1;
122 bi->init=1; 126 bi->init = 1;
123 bi->num= -1; 127 bi->num = -1;
124 bi->ptr=(char *)b; 128 bi->ptr = (char *)b;
125 return(1); 129 return (1);
126 } 130}
127 131
128static int mem_free(BIO *a) 132static int
129 { 133mem_free(BIO *a)
130 if (a == NULL) return(0); 134{
131 if (a->shutdown) 135 if (a == NULL)
132 { 136 return (0);
133 if ((a->init) && (a->ptr != NULL)) 137 if (a->shutdown) {
134 { 138 if ((a->init) && (a->ptr != NULL)) {
135 BUF_MEM *b; 139 BUF_MEM *b;
136 b = (BUF_MEM *)a->ptr; 140 b = (BUF_MEM *)a->ptr;
137 if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL; 141 if (a->flags & BIO_FLAGS_MEM_RDONLY)
138 BUF_MEM_free(b); 142 b->data = NULL;
139 a->ptr=NULL; 143 BUF_MEM_free(b);
140 } 144 a->ptr = NULL;
141 } 145 }
142 return(1);
143 } 146 }
144 147 return (1);
145static int mem_read(BIO *b, char *out, int outl) 148}
146 { 149
147 int ret= -1; 150static int
151mem_read(BIO *b, char *out, int outl)
152{
153 int ret = -1;
148 BUF_MEM *bm; 154 BUF_MEM *bm;
149 155
150 bm=(BUF_MEM *)b->ptr; 156 bm = (BUF_MEM *)b->ptr;
151 BIO_clear_retry_flags(b); 157 BIO_clear_retry_flags(b);
152 ret=(outl >=0 && (size_t)outl > bm->length)?(int)bm->length:outl; 158 ret = (outl >=0 && (size_t)outl > bm->length) ? (int)bm->length : outl;
153 if ((out != NULL) && (ret > 0)) { 159 if ((out != NULL) && (ret > 0)) {
154 memcpy(out,bm->data,ret); 160 memcpy(out, bm->data, ret);
155 bm->length-=ret; 161 bm->length -= ret;
156 if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; 162 if (b->flags & BIO_FLAGS_MEM_RDONLY)
163 bm->data += ret;
157 else { 164 else {
158 memmove(&(bm->data[0]),&(bm->data[ret]),bm->length); 165 memmove(&(bm->data[0]), &(bm->data[ret]), bm->length);
159 } 166 }
160 } else if (bm->length == 0) 167 } else if (bm->length == 0) {
161 {
162 ret = b->num; 168 ret = b->num;
163 if (ret != 0) 169 if (ret != 0)
164 BIO_set_retry_read(b); 170 BIO_set_retry_read(b);
165 }
166 return(ret);
167 } 171 }
172 return (ret);
173}
168 174
169static int mem_write(BIO *b, const char *in, int inl) 175static int
170 { 176mem_write(BIO *b, const char *in, int inl)
171 int ret= -1; 177{
178 int ret = -1;
172 int blen; 179 int blen;
173 BUF_MEM *bm; 180 BUF_MEM *bm;
174 181
175 bm=(BUF_MEM *)b->ptr; 182 bm = (BUF_MEM *)b->ptr;
176 if (in == NULL) 183 if (in == NULL) {
177 { 184 BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER);
178 BIOerr(BIO_F_MEM_WRITE,BIO_R_NULL_PARAMETER);
179 goto end; 185 goto end;
180 } 186 }
181 187
182 if(b->flags & BIO_FLAGS_MEM_RDONLY) { 188 if (b->flags & BIO_FLAGS_MEM_RDONLY) {
183 BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO); 189 BIOerr(BIO_F_MEM_WRITE, BIO_R_WRITE_TO_READ_ONLY_BIO);
184 goto end; 190 goto end;
185 } 191 }
186 192
187 BIO_clear_retry_flags(b); 193 BIO_clear_retry_flags(b);
188 blen=bm->length; 194 blen = bm->length;
189 if (BUF_MEM_grow_clean(bm,blen+inl) != (blen+inl)) 195 if (BUF_MEM_grow_clean(bm, blen + inl) != (blen + inl))
190 goto end; 196 goto end;
191 memcpy(&(bm->data[blen]),in,inl); 197 memcpy(&(bm->data[blen]), in, inl);
192 ret=inl; 198 ret = inl;
193end: 199end:
194 return(ret); 200 return (ret);
195 } 201}
196 202
197static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) 203static long
198 { 204mem_ctrl(BIO *b, int cmd, long num, void *ptr)
199 long ret=1; 205{
206 long ret = 1;
200 char **pptr; 207 char **pptr;
201 208
202 BUF_MEM *bm=(BUF_MEM *)b->ptr; 209 BUF_MEM *bm = (BUF_MEM *)b->ptr;
203 210
204 switch (cmd) 211 switch (cmd) {
205 {
206 case BIO_CTRL_RESET: 212 case BIO_CTRL_RESET:
207 if (bm->data != NULL) 213 if (bm->data != NULL) {
208 {
209 /* For read only case reset to the start again */ 214 /* For read only case reset to the start again */
210 if(b->flags & BIO_FLAGS_MEM_RDONLY) 215 if (b->flags & BIO_FLAGS_MEM_RDONLY) {
211 {
212 bm->data -= bm->max - bm->length; 216 bm->data -= bm->max - bm->length;
213 bm->length = bm->max; 217 bm->length = bm->max;
214 } 218 } else {
215 else 219 memset(bm->data, 0, bm->max);
216 { 220 bm->length = 0;
217 memset(bm->data,0,bm->max);
218 bm->length=0;
219 }
220 } 221 }
222 }
221 break; 223 break;
222 case BIO_CTRL_EOF: 224 case BIO_CTRL_EOF:
223 ret=(long)(bm->length == 0); 225 ret = (long)(bm->length == 0);
224 break; 226 break;
225 case BIO_C_SET_BUF_MEM_EOF_RETURN: 227 case BIO_C_SET_BUF_MEM_EOF_RETURN:
226 b->num=(int)num; 228 b->num = (int)num;
227 break; 229 break;
228 case BIO_CTRL_INFO: 230 case BIO_CTRL_INFO:
229 ret=(long)bm->length; 231 ret = (long)bm->length;
230 if (ptr != NULL) 232 if (ptr != NULL) {
231 { 233 pptr = (char **)ptr;
232 pptr=(char **)ptr; 234 *pptr = (char *)&(bm->data[0]);
233 *pptr=(char *)&(bm->data[0]); 235 }
234 }
235 break; 236 break;
236 case BIO_C_SET_BUF_MEM: 237 case BIO_C_SET_BUF_MEM:
237 mem_free(b); 238 mem_free(b);
238 b->shutdown=(int)num; 239 b->shutdown = (int)num;
239 b->ptr=ptr; 240 b->ptr = ptr;
240 break; 241 break;
241 case BIO_C_GET_BUF_MEM_PTR: 242 case BIO_C_GET_BUF_MEM_PTR:
242 if (ptr != NULL) 243 if (ptr != NULL) {
243 { 244 pptr = (char **)ptr;
244 pptr=(char **)ptr; 245 *pptr = (char *)bm;
245 *pptr=(char *)bm; 246 }
246 }
247 break; 247 break;
248 case BIO_CTRL_GET_CLOSE: 248 case BIO_CTRL_GET_CLOSE:
249 ret=(long)b->shutdown; 249 ret = (long)b->shutdown;
250 break; 250 break;
251 case BIO_CTRL_SET_CLOSE: 251 case BIO_CTRL_SET_CLOSE:
252 b->shutdown=(int)num; 252 b->shutdown = (int)num;
253 break; 253 break;
254 254
255 case BIO_CTRL_WPENDING: 255 case BIO_CTRL_WPENDING:
256 ret=0L; 256 ret = 0L;
257 break; 257 break;
258 case BIO_CTRL_PENDING: 258 case BIO_CTRL_PENDING:
259 ret=(long)bm->length; 259 ret = (long)bm->length;
260 break; 260 break;
261 case BIO_CTRL_DUP: 261 case BIO_CTRL_DUP:
262 case BIO_CTRL_FLUSH: 262 case BIO_CTRL_FLUSH:
263 ret=1; 263 ret = 1;
264 break; 264 break;
265 case BIO_CTRL_PUSH: 265 case BIO_CTRL_PUSH:
266 case BIO_CTRL_POP: 266 case BIO_CTRL_POP:
267 default: 267 default:
268 ret=0; 268 ret = 0;
269 break; 269 break;
270 }
271 return(ret);
272 } 270 }
271 return (ret);
272}
273 273
274static int mem_gets(BIO *bp, char *buf, int size) 274static int
275 { 275mem_gets(BIO *bp, char *buf, int size)
276 int i,j; 276{
277 int ret= -1; 277 int i, j;
278 int ret = -1;
278 char *p; 279 char *p;
279 BUF_MEM *bm=(BUF_MEM *)bp->ptr; 280 BUF_MEM *bm = (BUF_MEM *)bp->ptr;
280 281
281 BIO_clear_retry_flags(bp); 282 BIO_clear_retry_flags(bp);
282 j=bm->length; 283 j = bm->length;
283 if ((size-1) < j) j=size-1; 284 if ((size - 1) < j)
284 if (j <= 0) 285 j = size - 1;
285 { 286 if (j <= 0) {
286 *buf='\0'; 287 *buf = '\0';
287 return 0; 288 return 0;
288 } 289 }
289 p=bm->data; 290 p = bm->data;
290 for (i=0; i<j; i++) 291 for (i = 0; i < j; i++) {
291 { 292 if (p[i] == '\n') {
292 if (p[i] == '\n')
293 {
294 i++; 293 i++;
295 break; 294 break;
296 }
297 } 295 }
296 }
298 297
299 /* 298 /*
300 * i is now the max num of bytes to copy, either j or up to 299 * i is now the max num of bytes to copy, either j or up to
301 * and including the first newline 300 * and including the first newline
302 */ 301 */
303 302
304 i=mem_read(bp,buf,i); 303 i = mem_read(bp, buf, i);
305 if (i > 0) buf[i]='\0'; 304 if (i > 0)
306 ret=i; 305 buf[i] = '\0';
307 return(ret); 306 ret = i;
308 } 307 return (ret);
308}
309 309
310static int mem_puts(BIO *bp, const char *str) 310static int
311 { 311mem_puts(BIO *bp, const char *str)
312 int n,ret; 312{
313 int n, ret;
313 314
314 n=strlen(str); 315 n = strlen(str);
315 ret=mem_write(bp,str,n); 316 ret = mem_write(bp, str, n);
316 /* memory semantics is that it will always work */ 317 /* memory semantics is that it will always work */
317 return(ret); 318 return (ret);
318 } 319}
319
diff --git a/src/lib/libssl/src/crypto/bio/bss_null.c b/src/lib/libssl/src/crypto/bio/bss_null.c
index 46b73339df..51aed2ac4b 100644
--- a/src/lib/libssl/src/crypto/bio/bss_null.c
+++ b/src/lib/libssl/src/crypto/bio/bss_null.c
@@ -68,8 +68,8 @@ static int null_gets(BIO *h, char *str, int size);
68static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); 68static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2);
69static int null_new(BIO *h); 69static int null_new(BIO *h);
70static int null_free(BIO *data); 70static int null_free(BIO *data);
71static BIO_METHOD null_method= 71
72 { 72static BIO_METHOD null_method = {
73 BIO_TYPE_NULL, 73 BIO_TYPE_NULL,
74 "NULL", 74 "NULL",
75 null_write, 75 null_write,
@@ -80,50 +80,56 @@ static BIO_METHOD null_method=
80 null_new, 80 null_new,
81 null_free, 81 null_free,
82 NULL, 82 NULL,
83 }; 83};
84 84
85BIO_METHOD *BIO_s_null(void) 85BIO_METHOD
86 { 86*BIO_s_null(void)
87 return(&null_method); 87{
88 } 88 return (&null_method);
89}
89 90
90static int null_new(BIO *bi) 91static int
91 { 92null_new(BIO *bi)
92 bi->init=1; 93{
93 bi->num=0; 94 bi->init = 1;
94 bi->ptr=(NULL); 95 bi->num = 0;
95 return(1); 96 bi->ptr = (NULL);
96 } 97 return (1);
98}
97 99
98static int null_free(BIO *a) 100static int
99 { 101null_free(BIO *a)
100 if (a == NULL) return(0); 102{
101 return(1); 103 if (a == NULL)
102 } 104 return (0);
103 105 return (1);
104static int null_read(BIO *b, char *out, int outl) 106}
105 {
106 return(0);
107 }
108 107
109static int null_write(BIO *b, const char *in, int inl) 108static int
110 { 109null_read(BIO *b, char *out, int outl)
111 return(inl); 110{
112 } 111 return (0);
112}
113
114static int
115null_write(BIO *b, const char *in, int inl)
116{
117 return (inl);
118}
113 119
114static long null_ctrl(BIO *b, int cmd, long num, void *ptr) 120static long
115 { 121null_ctrl(BIO *b, int cmd, long num, void *ptr)
116 long ret=1; 122{
123 long ret = 1;
117 124
118 switch (cmd) 125 switch (cmd) {
119 {
120 case BIO_CTRL_RESET: 126 case BIO_CTRL_RESET:
121 case BIO_CTRL_EOF: 127 case BIO_CTRL_EOF:
122 case BIO_CTRL_SET: 128 case BIO_CTRL_SET:
123 case BIO_CTRL_SET_CLOSE: 129 case BIO_CTRL_SET_CLOSE:
124 case BIO_CTRL_FLUSH: 130 case BIO_CTRL_FLUSH:
125 case BIO_CTRL_DUP: 131 case BIO_CTRL_DUP:
126 ret=1; 132 ret = 1;
127 break; 133 break;
128 case BIO_CTRL_GET_CLOSE: 134 case BIO_CTRL_GET_CLOSE:
129 case BIO_CTRL_INFO: 135 case BIO_CTRL_INFO:
@@ -131,20 +137,22 @@ static long null_ctrl(BIO *b, int cmd, long num, void *ptr)
131 case BIO_CTRL_PENDING: 137 case BIO_CTRL_PENDING:
132 case BIO_CTRL_WPENDING: 138 case BIO_CTRL_WPENDING:
133 default: 139 default:
134 ret=0; 140 ret = 0;
135 break; 141 break;
136 }
137 return(ret);
138 } 142 }
143 return (ret);
144}
139 145
140static int null_gets(BIO *bp, char *buf, int size) 146static int
141 { 147null_gets(BIO *bp, char *buf, int size)
142 return(0); 148{
143 } 149 return (0);
144 150}
145static int null_puts(BIO *bp, const char *str)
146 {
147 if (str == NULL) return(0);
148 return(strlen(str));
149 }
150 151
152static int
153null_puts(BIO *bp, const char *str)
154{
155 if (str == NULL)
156 return (0);
157 return (strlen(str));
158}
diff --git a/src/lib/libssl/src/crypto/bio/bss_rtcp.c b/src/lib/libssl/src/crypto/bio/bss_rtcp.c
index 7dae485564..84d01e58b4 100644
--- a/src/lib/libssl/src/crypto/bio/bss_rtcp.c
+++ b/src/lib/libssl/src/crypto/bio/bss_rtcp.c
@@ -73,31 +73,32 @@
73 73
74typedef unsigned short io_channel; 74typedef unsigned short io_channel;
75/*************************************************************************/ 75/*************************************************************************/
76struct io_status { short status, count; long flags; }; 76 struct io_status { short status, count;
77 long flags;
78};
77 79
78struct rpc_msg { /* Should have member alignment inhibited */ 80 struct rpc_msg { /* Should have member alignment inhibited */
79 char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ 81 char channel; /* 'A'-app data. 'R'-remote client 'G'-global */
80 char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ 82 char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */
81 unsigned short int length; /* Amount of data returned or max to return */ 83 unsigned short int length; /* Amount of data returned or max to return */
82 char data[4092]; /* variable data */ 84 char data[4092]; /* variable data */
83}; 85};
84#define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) 86#define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092)
85 87
86struct rpc_ctx { 88struct rpc_ctx {
87 int filled, pos; 89 int filled, pos;
88 struct rpc_msg msg; 90 struct rpc_msg msg;
89}; 91};
90 92
91static int rtcp_write(BIO *h,const char *buf,int num); 93static int rtcp_write(BIO *h, const char *buf, int num);
92static int rtcp_read(BIO *h,char *buf,int size); 94static int rtcp_read(BIO *h, char *buf, int size);
93static int rtcp_puts(BIO *h,const char *str); 95static int rtcp_puts(BIO *h, const char *str);
94static int rtcp_gets(BIO *h,char *str,int size); 96static int rtcp_gets(BIO *h, char *str, int size);
95static long rtcp_ctrl(BIO *h,int cmd,long arg1,void *arg2); 97static long rtcp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
96static int rtcp_new(BIO *h); 98static int rtcp_new(BIO *h);
97static int rtcp_free(BIO *data); 99static int rtcp_free(BIO *data);
98 100
99static BIO_METHOD rtcp_method= 101static BIO_METHOD rtcp_method = {
100 {
101 BIO_TYPE_FD, 102 BIO_TYPE_FD,
102 "RTCP", 103 "RTCP",
103 rtcp_write, 104 rtcp_write,
@@ -108,12 +109,13 @@ static BIO_METHOD rtcp_method=
108 rtcp_new, 109 rtcp_new,
109 rtcp_free, 110 rtcp_free,
110 NULL, 111 NULL,
111 }; 112};
112 113
113BIO_METHOD *BIO_s_rtcp(void) 114BIO_METHOD
114 { 115*BIO_s_rtcp(void)
115 return(&rtcp_method); 116{
116 } 117 return (&rtcp_method);
118}
117/*****************************************************************************/ 119/*****************************************************************************/
118/* Decnet I/O routines. 120/* Decnet I/O routines.
119 */ 121 */
@@ -123,25 +125,28 @@ BIO_METHOD *BIO_s_rtcp(void)
123#pragma message disable DOLLARID 125#pragma message disable DOLLARID
124#endif 126#endif
125 127
126static int get ( io_channel chan, char *buffer, int maxlen, int *length ) 128static int get(io_channel chan, char *buffer, int maxlen, int *length)
127{ 129{
128 int status; 130 int status;
129 struct io_status iosb; 131 struct io_status iosb;
130 status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0, 132 status = sys$qiow(0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen,
131 buffer, maxlen, 0, 0, 0, 0 ); 133 0, 0, 0, 0 );
132 if ( (status&1) == 1 ) status = iosb.status; 134 if ((status & 1) == 1)
133 if ( (status&1) == 1 ) *length = iosb.count; 135 status = iosb.status;
134 return status; 136 if ((status & 1) == 1 )
137 *length = iosb.count;
138 return status;
135} 139}
136 140
137static int put ( io_channel chan, char *buffer, int length ) 141static int put(io_channel chan, char *buffer, int length)
138{ 142{
139 int status; 143 int status;
140 struct io_status iosb; 144 struct io_status iosb;
141 status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, 145 status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer,
142 buffer, length, 0, 0, 0, 0 ); 146 length, 0, 0, 0, 0 );
143 if ( (status&1) == 1 ) status = iosb.status; 147 if ((status & 1) == 1)
144 return status; 148 status = iosb.status;
149 return status;
145} 150}
146 151
147#ifdef __DECC 152#ifdef __DECC
@@ -150,109 +155,127 @@ static int put ( io_channel chan, char *buffer, int length )
150 155
151/***************************************************************************/ 156/***************************************************************************/
152 157
153static int rtcp_new(BIO *bi) 158static int
159rtcp_new(BIO *bi)
154{ 160{
155 struct rpc_ctx *ctx; 161 struct rpc_ctx *ctx;
156 bi->init=1; 162 bi->init = 1;
157 bi->num=0; 163 bi->num = 0;
158 bi->flags = 0; 164 bi->flags = 0;
159 bi->ptr=OPENSSL_malloc(sizeof(struct rpc_ctx)); 165 bi->ptr = OPENSSL_malloc(sizeof(struct rpc_ctx));
160 ctx = (struct rpc_ctx *) bi->ptr; 166 ctx = (struct rpc_ctx *)bi->ptr;
161 ctx->filled = 0; 167 ctx->filled = 0;
162 ctx->pos = 0; 168 ctx->pos = 0;
163 return(1); 169 return (1);
164} 170}
165 171
166static int rtcp_free(BIO *a) 172static int
173rtcp_free(BIO *a)
167{ 174{
168 if (a == NULL) return(0); 175 if (a == NULL)
169 if ( a->ptr ) OPENSSL_free ( a->ptr ); 176 return (0);
177 if (a->ptr)
178 OPENSSL_free(a->ptr);
170 a->ptr = NULL; 179 a->ptr = NULL;
171 return(1); 180 return (1);
172} 181}
173 182
174static int rtcp_read(BIO *b, char *out, int outl) 183static int
184rtcp_read(BIO *b, char *out, int outl)
175{ 185{
176 int status, length; 186 int status, length;
177 struct rpc_ctx *ctx; 187 struct rpc_ctx *ctx;
178 /* 188 /*
179 * read data, return existing. 189 * read data, return existing.
180 */ 190 */
181 ctx = (struct rpc_ctx *) b->ptr; 191 ctx = (struct rpc_ctx *)b->ptr;
182 if ( ctx->pos < ctx->filled ) { 192 if (ctx->pos < ctx->filled) {
183 length = ctx->filled - ctx->pos; 193 length = ctx->filled - ctx->pos;
184 if ( length > outl ) length = outl; 194 if (length > outl)
185 memmove ( out, &ctx->msg.data[ctx->pos], length ); 195 length = outl;
186 ctx->pos += length; 196 memmove(out, &ctx->msg.data[ctx->pos], length);
187 return length; 197 ctx->pos += length;
188 } 198 return length;
189 /* 199 }
190 * Requst more data from R channel. 200 /*
191 */ 201 * Requst more data from R channel.
192 ctx->msg.channel = 'R'; 202 */
193 ctx->msg.function = 'G'; 203 ctx->msg.channel = 'R';
194 ctx->msg.length = sizeof(ctx->msg.data); 204 ctx->msg.function = 'G';
195 status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE ); 205 ctx->msg.length = sizeof(ctx->msg.data);
196 if ( (status&1) == 0 ) { 206 status = put(b->num, (char *)&ctx->msg, RPC_HDR_SIZE);
197 return -1; 207 if ((status & 1) == 0 ) {
198 } 208 return -1;
199 /* 209 }
200 * Read. 210 /*
201 */ 211 * Read.
202 ctx->pos = ctx->filled = 0; 212 */
203 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); 213 ctx->pos = ctx->filled = 0;
204 if ( (status&1) == 0 ) length = -1; 214 status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), &length);
205 if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) { 215 if ((status & 1) == 0)
206 length = -1; 216 length = -1;
207 } 217 if (ctx->msg.channel != 'R' || ctx->msg.function != 'C') {
208 ctx->filled = length - RPC_HDR_SIZE; 218 length = -1;
209 219 }
210 if ( ctx->pos < ctx->filled ) { 220 ctx->filled = length - RPC_HDR_SIZE;
211 length = ctx->filled - ctx->pos; 221
212 if ( length > outl ) length = outl; 222 if (ctx->pos < ctx->filled) {
213 memmove ( out, ctx->msg.data, length ); 223 length = ctx->filled - ctx->pos;
214 ctx->pos += length; 224 if (length > outl)
215 return length; 225 length = outl;
216 } 226 memmove(out, ctx->msg.data, length);
227 ctx->pos += length;
228 return length;
229 }
217 230
218 return length; 231 return length;
219} 232}
220 233
221static int rtcp_write(BIO *b, const char *in, int inl) 234static int
235rtcp_write(BIO *b, const char *in, int inl)
222{ 236{
223 int status, i, segment, length; 237 int status, i, segment, length;
224 struct rpc_ctx *ctx; 238 struct rpc_ctx *ctx;
225 /* 239 /*
226 * Output data, send in chunks no larger that sizeof(ctx->msg.data). 240 * Output data, send in chunks no larger that sizeof(ctx->msg.data).
227 */ 241 */
228 ctx = (struct rpc_ctx *) b->ptr; 242 ctx = (struct rpc_ctx *)b->ptr;
229 for ( i = 0; i < inl; i += segment ) { 243 for (i = 0; i < inl; i += segment) {
230 segment = inl - i; 244 segment = inl - i;
231 if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data); 245 if (segment > sizeof(ctx->msg.data))
232 ctx->msg.channel = 'R'; 246 segment = sizeof(ctx->msg.data);
233 ctx->msg.function = 'P'; 247 ctx->msg.channel = 'R';
234 ctx->msg.length = segment; 248 ctx->msg.function = 'P';
235 memmove ( ctx->msg.data, &in[i], segment ); 249 ctx->msg.length = segment;
236 status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE ); 250 memmove(ctx->msg.data, &in[i], segment);
237 if ((status&1) == 0 ) { i = -1; break; } 251 status = put(b->num, (char *) &ctx->msg,
252 segment + RPC_HDR_SIZE);
253 if ((status & 1) == 0) {
254 i = -1;
255 break;
256 }
238 257
239 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); 258 status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg),
240 if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; } 259 &length );
241 if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) { 260 if (((status&1) == 0) || (length < RPC_HDR_SIZE)) {
242 printf("unexpected response when confirming put %c %c\n", 261 i = -1;
243 ctx->msg.channel, ctx->msg.function ); 262 break;
263 }
264 if ((ctx->msg.channel != 'R') || (ctx->msg.function != 'C')) {
265 printf("unexpected response when confirming put %c %c\n",
266 ctx->msg.channel, ctx->msg.function );
244 267
268 }
245 } 269 }
246 } 270 return (i);
247 return(i);
248} 271}
249 272
250static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) 273static long
251 { 274rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
252 long ret=1; 275{
276 long ret = 1;
253 277
254 switch (cmd) 278 switch (cmd) {
255 {
256 case BIO_CTRL_RESET: 279 case BIO_CTRL_RESET:
257 case BIO_CTRL_EOF: 280 case BIO_CTRL_EOF:
258 ret = 1; 281 ret = 1;
@@ -260,11 +283,11 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
260 case BIO_C_SET_FD: 283 case BIO_C_SET_FD:
261 b->num = num; 284 b->num = num;
262 ret = 1; 285 ret = 1;
263 break; 286 break;
264 case BIO_CTRL_SET_CLOSE: 287 case BIO_CTRL_SET_CLOSE:
265 case BIO_CTRL_FLUSH: 288 case BIO_CTRL_FLUSH:
266 case BIO_CTRL_DUP: 289 case BIO_CTRL_DUP:
267 ret=1; 290 ret = 1;
268 break; 291 break;
269 case BIO_CTRL_GET_CLOSE: 292 case BIO_CTRL_GET_CLOSE:
270 case BIO_CTRL_INFO: 293 case BIO_CTRL_INFO:
@@ -272,23 +295,26 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr)
272 case BIO_CTRL_PENDING: 295 case BIO_CTRL_PENDING:
273 case BIO_CTRL_WPENDING: 296 case BIO_CTRL_WPENDING:
274 default: 297 default:
275 ret=0; 298 ret = 0;
276 break; 299 break;
277 }
278 return(ret);
279 }
280
281static int rtcp_gets(BIO *bp, char *buf, int size)
282 {
283 return(0);
284 } 300 }
301 return (ret);
302}
285 303
286static int rtcp_puts(BIO *bp, const char *str) 304static int
305rtcp_gets(BIO *bp, char *buf, int size)
287{ 306{
288 int length; 307 return (0);
289 if (str == NULL) return(0);
290 length = strlen ( str );
291 if ( length == 0 ) return (0);
292 return rtcp_write ( bp,str, length );
293} 308}
294 309
310static int
311rtcp_puts(BIO *bp, const char *str)
312{
313 int length;
314 if (str == NULL)
315 return (0);
316 length = strlen(str);
317 if (length == 0)
318 return (0);
319 return rtcp_write(bp, str, length);
320}
diff --git a/src/lib/libssl/src/crypto/bio/bss_sock.c b/src/lib/libssl/src/crypto/bio/bss_sock.c
index eb2965970c..f6d3bf7365 100644
--- a/src/lib/libssl/src/crypto/bio/bss_sock.c
+++ b/src/lib/libssl/src/crypto/bio/bss_sock.c
@@ -79,8 +79,7 @@ static int sock_new(BIO *h);
79static int sock_free(BIO *data); 79static int sock_free(BIO *data);
80int BIO_sock_should_retry(int s); 80int BIO_sock_should_retry(int s);
81 81
82static BIO_METHOD methods_sockp= 82static BIO_METHOD methods_sockp = {
83 {
84 BIO_TYPE_SOCKET, 83 BIO_TYPE_SOCKET,
85 "socket", 84 "socket",
86 sock_write, 85 sock_write,
@@ -91,152 +90,155 @@ static BIO_METHOD methods_sockp=
91 sock_new, 90 sock_new,
92 sock_free, 91 sock_free,
93 NULL, 92 NULL,
94 }; 93};
95 94
96BIO_METHOD *BIO_s_socket(void) 95BIO_METHOD
97 { 96*BIO_s_socket(void)
98 return(&methods_sockp); 97{
99 } 98 return (&methods_sockp);
99}
100 100
101BIO *BIO_new_socket(int fd, int close_flag) 101BIO
102 { 102*BIO_new_socket(int fd, int close_flag)
103{
103 BIO *ret; 104 BIO *ret;
104 105
105 ret=BIO_new(BIO_s_socket()); 106 ret = BIO_new(BIO_s_socket());
106 if (ret == NULL) return(NULL); 107 if (ret == NULL)
107 BIO_set_fd(ret,fd,close_flag); 108 return (NULL);
108 return(ret); 109 BIO_set_fd(ret, fd, close_flag);
109 } 110 return (ret);
111}
110 112
111static int sock_new(BIO *bi) 113static int
112 { 114sock_new(BIO *bi)
113 bi->init=0; 115{
114 bi->num=0; 116 bi->init = 0;
115 bi->ptr=NULL; 117 bi->num = 0;
116 bi->flags=0; 118 bi->ptr = NULL;
117 return(1); 119 bi->flags = 0;
118 } 120 return (1);
121}
119 122
120static int sock_free(BIO *a) 123static int
121 { 124sock_free(BIO *a)
122 if (a == NULL) return(0); 125{
123 if (a->shutdown) 126 if (a == NULL)
124 { 127 return (0);
125 if (a->init) 128 if (a->shutdown) {
126 { 129 if (a->init) {
127 shutdown(a->num, SHUT_RDWR); 130 shutdown(a->num, SHUT_RDWR);
128 close(a->num); 131 close(a->num);
129 }
130 a->init=0;
131 a->flags=0;
132 } 132 }
133 return(1); 133 a->init = 0;
134 a->flags = 0;
134 } 135 }
135 136 return (1);
136static int sock_read(BIO *b, char *out, int outl) 137}
137 {
138 int ret=0;
139 138
140 if (out != NULL) 139static int
141 { 140sock_read(BIO *b, char *out, int outl)
141{
142 int ret = 0;
143
144 if (out != NULL) {
142 errno = 0; 145 errno = 0;
143 ret=read(b->num,out,outl); 146 ret = read(b->num, out, outl);
144 BIO_clear_retry_flags(b); 147 BIO_clear_retry_flags(b);
145 if (ret <= 0) 148 if (ret <= 0) {
146 {
147 if (BIO_sock_should_retry(ret)) 149 if (BIO_sock_should_retry(ret))
148 BIO_set_retry_read(b); 150 BIO_set_retry_read(b);
149 }
150 } 151 }
151 return(ret);
152 } 152 }
153 return (ret);
154}
153 155
154static int sock_write(BIO *b, const char *in, int inl) 156static int
155 { 157sock_write(BIO *b, const char *in, int inl)
158{
156 int ret; 159 int ret;
157 160
158 errno = 0; 161 errno = 0;
159 ret=write(b->num,in,inl); 162 ret = write(b->num, in, inl);
160 BIO_clear_retry_flags(b); 163 BIO_clear_retry_flags(b);
161 if (ret <= 0) 164 if (ret <= 0) {
162 {
163 if (BIO_sock_should_retry(ret)) 165 if (BIO_sock_should_retry(ret))
164 BIO_set_retry_write(b); 166 BIO_set_retry_write(b);
165 }
166 return(ret);
167 } 167 }
168 return (ret);
169}
168 170
169static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) 171static long
170 { 172sock_ctrl(BIO *b, int cmd, long num, void *ptr)
171 long ret=1; 173{
174 long ret = 1;
172 int *ip; 175 int *ip;
173 176
174 switch (cmd) 177 switch (cmd) {
175 {
176 case BIO_C_SET_FD: 178 case BIO_C_SET_FD:
177 sock_free(b); 179 sock_free(b);
178 b->num= *((int *)ptr); 180 b->num= *((int *)ptr);
179 b->shutdown=(int)num; 181 b->shutdown = (int)num;
180 b->init=1; 182 b->init = 1;
181 break; 183 break;
182 case BIO_C_GET_FD: 184 case BIO_C_GET_FD:
183 if (b->init) 185 if (b->init) {
184 { 186 ip = (int *)ptr;
185 ip=(int *)ptr; 187 if (ip != NULL)
186 if (ip != NULL) *ip=b->num; 188 *ip = b->num;
187 ret=b->num; 189 ret = b->num;
188 } 190 } else
189 else 191 ret = -1;
190 ret= -1;
191 break; 192 break;
192 case BIO_CTRL_GET_CLOSE: 193 case BIO_CTRL_GET_CLOSE:
193 ret=b->shutdown; 194 ret = b->shutdown;
194 break; 195 break;
195 case BIO_CTRL_SET_CLOSE: 196 case BIO_CTRL_SET_CLOSE:
196 b->shutdown=(int)num; 197 b->shutdown = (int)num;
197 break; 198 break;
198 case BIO_CTRL_DUP: 199 case BIO_CTRL_DUP:
199 case BIO_CTRL_FLUSH: 200 case BIO_CTRL_FLUSH:
200 ret=1; 201 ret = 1;
201 break; 202 break;
202 default: 203 default:
203 ret=0; 204 ret = 0;
204 break; 205 break;
205 }
206 return(ret);
207 } 206 }
207 return (ret);
208}
208 209
209static int sock_puts(BIO *bp, const char *str) 210static int
210 { 211sock_puts(BIO *bp, const char *str)
211 int n,ret; 212{
213 int n, ret;
212 214
213 n=strlen(str); 215 n = strlen(str);
214 ret=sock_write(bp,str,n); 216 ret = sock_write(bp, str, n);
215 return(ret); 217 return (ret);
216 } 218}
217 219
218int BIO_sock_should_retry(int i) 220int
219 { 221BIO_sock_should_retry(int i)
222{
220 int err; 223 int err;
221 224
222 if ((i == 0) || (i == -1)) 225 if ((i == 0) || (i == -1)) {
223 { 226 err = errno;
224 err=errno;
225 227
226#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 228#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
227 if ((i == -1) && (err == 0)) 229 if ((i == -1) && (err == 0))
228 return(1); 230 return (1);
229#endif 231#endif
230 232
231 return(BIO_sock_non_fatal_error(err)); 233 return (BIO_sock_non_fatal_error(err));
232 }
233 return(0);
234 } 234 }
235 return (0);
236}
235 237
236int BIO_sock_non_fatal_error(int err) 238int
237 { 239BIO_sock_non_fatal_error(int err)
238 switch (err) 240{
239 { 241 switch (err) {
240#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) 242#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
241# if defined(WSAEWOULDBLOCK) 243# if defined(WSAEWOULDBLOCK)
242 case WSAEWOULDBLOCK: 244 case WSAEWOULDBLOCK:
@@ -284,12 +286,12 @@ int BIO_sock_non_fatal_error(int err)
284#ifdef EALREADY 286#ifdef EALREADY
285 case EALREADY: 287 case EALREADY:
286#endif 288#endif
287 return(1); 289 return (1);
288 /* break; */ 290 /* break; */
289 default: 291 default:
290 break; 292 break;
291 }
292 return(0);
293 } 293 }
294 return (0);
295}
294 296
295#endif /* #ifndef OPENSSL_NO_SOCK */ 297#endif /* #ifndef OPENSSL_NO_SOCK */