diff options
| author | markus <> | 2002-09-05 12:51:50 +0000 |
|---|---|---|
| committer | markus <> | 2002-09-05 12:51:50 +0000 |
| commit | 15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch) | |
| tree | bf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/bio | |
| parent | 027351f729b9e837200dae6e1520cda6577ab930 (diff) | |
| download | openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2 openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip | |
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/bio')
| -rw-r--r-- | src/lib/libcrypto/bio/b_dump.c | 129 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/b_print.c | 771 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/b_sock.c | 386 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bf_buff.c | 120 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bf_lbuf.c | 12 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bf_nbio.c | 79 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bf_null.c | 73 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bio.h | 456 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bio_cb.c | 15 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bio_err.c | 149 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bio_lib.c | 208 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_acpt.c | 167 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_bio.c | 318 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_conn.c | 220 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_fd.c | 226 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_file.c | 91 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_log.c | 325 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_mem.c | 130 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_null.c | 57 | ||||
| -rw-r--r-- | src/lib/libcrypto/bio/bss_sock.c | 220 |
20 files changed, 2749 insertions, 1403 deletions
diff --git a/src/lib/libcrypto/bio/b_dump.c b/src/lib/libcrypto/bio/b_dump.c index db84ad3d47..8397cfab6a 100644 --- a/src/lib/libcrypto/bio/b_dump.c +++ b/src/lib/libcrypto/bio/b_dump.c | |||
| @@ -62,64 +62,91 @@ | |||
| 62 | 62 | ||
| 63 | #include <stdio.h> | 63 | #include <stdio.h> |
| 64 | #include "cryptlib.h" | 64 | #include "cryptlib.h" |
| 65 | #include "bio.h" | 65 | #include <openssl/bio.h> |
| 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 | 70 | ||
| 70 | int BIO_dump(bio,s,len) | 71 | int BIO_dump(BIO *bio, const char *s, int len) |
| 71 | BIO *bio; | 72 | { |
| 72 | char *s; | 73 | return BIO_dump_indent(bio, s, len, 0); |
| 73 | int len; | 74 | } |
| 74 | { | ||
| 75 | int ret=0; | ||
| 76 | char buf[160+1],tmp[20]; | ||
| 77 | int i,j,rows,trunc; | ||
| 78 | unsigned char ch; | ||
| 79 | |||
| 80 | trunc=0; | ||
| 81 | 75 | ||
| 76 | int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) | ||
| 77 | { | ||
| 78 | int ret=0; | ||
| 79 | char buf[288+1],tmp[20],str[128+1]; | ||
| 80 | int i,j,rows,trunc; | ||
| 81 | unsigned char ch; | ||
| 82 | int dump_width; | ||
| 83 | |||
| 84 | trunc=0; | ||
| 85 | |||
| 82 | #ifdef TRUNCATE | 86 | #ifdef TRUNCATE |
| 83 | for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) | 87 | for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) |
| 84 | trunc++; | 88 | trunc++; |
| 85 | #endif | 89 | #endif |
| 86 | 90 | ||
| 87 | rows=(len/DUMP_WIDTH); | 91 | if (indent < 0) |
| 88 | if ((rows*DUMP_WIDTH)<len) | 92 | indent = 0; |
| 89 | rows++; | 93 | if (indent) |
| 90 | for(i=0;i<rows;i++) { | 94 | { |
| 91 | buf[0]='\0'; /* start with empty string */ | 95 | if (indent > 128) indent=128; |
| 92 | sprintf(tmp,"%04x - ",i*DUMP_WIDTH); | 96 | memset(str,' ',indent); |
| 93 | strcpy(buf,tmp); | 97 | } |
| 94 | for(j=0;j<DUMP_WIDTH;j++) { | 98 | str[indent]='\0'; |
| 95 | if (((i*DUMP_WIDTH)+j)>=len) { | 99 | |
| 96 | strcat(buf," "); | 100 | dump_width=DUMP_WIDTH_LESS_INDENT(indent); |
| 97 | } else { | 101 | rows=(len/dump_width); |
| 98 | ch=((unsigned char)*((char *)(s)+i*DUMP_WIDTH+j)) & 0xff; | 102 | if ((rows*dump_width)<len) |
| 99 | sprintf(tmp,"%02x%c",ch,j==7?'-':' '); | 103 | rows++; |
| 100 | strcat(buf,tmp); | 104 | for(i=0;i<rows;i++) |
| 101 | } | 105 | { |
| 102 | } | 106 | buf[0]='\0'; /* start with empty string */ |
| 103 | strcat(buf," "); | 107 | strcpy(buf,str); |
| 104 | for(j=0;j<DUMP_WIDTH;j++) { | 108 | sprintf(tmp,"%04x - ",i*dump_width); |
| 105 | if (((i*DUMP_WIDTH)+j)>=len) | 109 | strcat(buf,tmp); |
| 106 | break; | 110 | for(j=0;j<dump_width;j++) |
| 107 | ch=((unsigned char)*((char *)(s)+i*DUMP_WIDTH+j)) & 0xff; | 111 | { |
| 108 | sprintf(tmp,"%c",((ch>=' ')&&(ch<='~'))?ch:'.'); | 112 | if (((i*dump_width)+j)>=len) |
| 109 | strcat(buf,tmp); | 113 | { |
| 110 | } | 114 | strcat(buf," "); |
| 111 | strcat(buf,"\n"); | 115 | } |
| 112 | /* if this is the last call then update the ddt_dump thing so that | 116 | else |
| 113 | * we will move the selection point in the debug window | 117 | { |
| 114 | */ | 118 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; |
| 115 | ret+=BIO_write(bio,(char *)buf,strlen(buf)); | 119 | sprintf(tmp,"%02x%c",ch,j==7?'-':' '); |
| 116 | } | 120 | strcat(buf,tmp); |
| 121 | } | ||
| 122 | } | ||
| 123 | strcat(buf," "); | ||
| 124 | for(j=0;j<dump_width;j++) | ||
| 125 | { | ||
| 126 | if (((i*dump_width)+j)>=len) | ||
| 127 | break; | ||
| 128 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; | ||
| 129 | #ifndef CHARSET_EBCDIC | ||
| 130 | sprintf(tmp,"%c",((ch>=' ')&&(ch<='~'))?ch:'.'); | ||
| 131 | #else | ||
| 132 | sprintf(tmp,"%c",((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) | ||
| 133 | ? os_toebcdic[ch] | ||
| 134 | : '.'); | ||
| 135 | #endif | ||
| 136 | strcat(buf,tmp); | ||
| 137 | } | ||
| 138 | strcat(buf,"\n"); | ||
| 139 | /* if this is the last call then update the ddt_dump thing so that | ||
| 140 | * we will move the selection point in the debug window | ||
| 141 | */ | ||
| 142 | ret+=BIO_write(bio,(char *)buf,strlen(buf)); | ||
| 143 | } | ||
| 117 | #ifdef TRUNCATE | 144 | #ifdef TRUNCATE |
| 118 | if (trunc > 0) { | 145 | if (trunc > 0) |
| 119 | sprintf(buf,"%04x - <SPACES/NULS>\n",len+trunc); | 146 | { |
| 120 | ret+=BIO_write(bio,(char *)buf,strlen(buf)); | 147 | sprintf(buf,"%s%04x - <SPACES/NULS>\n",str,len+trunc); |
| 121 | } | 148 | ret+=BIO_write(bio,(char *)buf,strlen(buf)); |
| 149 | } | ||
| 122 | #endif | 150 | #endif |
| 123 | return(ret); | 151 | return(ret); |
| 124 | } | 152 | } |
| 125 | |||
diff --git a/src/lib/libcrypto/bio/b_print.c b/src/lib/libcrypto/bio/b_print.c index cdadeb839a..3ce1290772 100644 --- a/src/lib/libcrypto/bio/b_print.c +++ b/src/lib/libcrypto/bio/b_print.c | |||
| @@ -56,37 +56,774 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | /* disable assert() unless BIO_DEBUG has been defined */ | ||
| 60 | #ifndef BIO_DEBUG | ||
| 61 | # ifndef NDEBUG | ||
| 62 | # define NDEBUG | ||
| 63 | # endif | ||
| 64 | #endif | ||
| 65 | |||
| 59 | /* | 66 | /* |
| 60 | * Stolen from tjh's ssl/ssl_trc.c stuff. | 67 | * Stolen from tjh's ssl/ssl_trc.c stuff. |
| 61 | */ | 68 | */ |
| 62 | 69 | ||
| 63 | #include <stdio.h> | 70 | #include <stdio.h> |
| 71 | #include <string.h> | ||
| 72 | #include <ctype.h> | ||
| 73 | #include <assert.h> | ||
| 74 | #include <limits.h> | ||
| 64 | #include "cryptlib.h" | 75 | #include "cryptlib.h" |
| 65 | #include "bio.h" | 76 | #ifndef NO_SYS_TYPES_H |
| 77 | #include <sys/types.h> | ||
| 78 | #endif | ||
| 79 | #include <openssl/bn.h> /* To get BN_LLONG properly defined */ | ||
| 80 | #include <openssl/bio.h> | ||
| 81 | |||
| 82 | #ifdef BN_LLONG | ||
| 83 | # ifndef HAVE_LONG_LONG | ||
| 84 | # define HAVE_LONG_LONG 1 | ||
| 85 | # endif | ||
| 86 | #endif | ||
| 87 | |||
| 88 | /***************************************************************************/ | ||
| 89 | |||
| 90 | /* | ||
| 91 | * Copyright Patrick Powell 1995 | ||
| 92 | * This code is based on code written by Patrick Powell <papowell@astart.com> | ||
| 93 | * It may be used for any purpose as long as this notice remains intact | ||
| 94 | * on all source code distributions. | ||
| 95 | */ | ||
| 96 | |||
| 97 | /* | ||
| 98 | * This code contains numerious changes and enhancements which were | ||
| 99 | * made by lots of contributors over the last years to Patrick Powell's | ||
| 100 | * original code: | ||
| 101 | * | ||
| 102 | * o Patrick Powell <papowell@astart.com> (1995) | ||
| 103 | * o Brandon Long <blong@fiction.net> (1996, for Mutt) | ||
| 104 | * o Thomas Roessler <roessler@guug.de> (1998, for Mutt) | ||
| 105 | * o Michael Elkins <me@cs.hmc.edu> (1998, for Mutt) | ||
| 106 | * o Andrew Tridgell <tridge@samba.org> (1998, for Samba) | ||
| 107 | * o Luke Mewburn <lukem@netbsd.org> (1999, for LukemFTP) | ||
| 108 | * o Ralf S. Engelschall <rse@engelschall.com> (1999, for Pth) | ||
| 109 | * o ... (for OpenSSL) | ||
| 110 | */ | ||
| 111 | |||
| 112 | #if HAVE_LONG_DOUBLE | ||
| 113 | #define LDOUBLE long double | ||
| 114 | #else | ||
| 115 | #define LDOUBLE double | ||
| 116 | #endif | ||
| 117 | |||
| 118 | #if HAVE_LONG_LONG | ||
| 119 | # if defined(OPENSSL_SYS_WIN32) && !defined(__GNUC__) | ||
| 120 | # define LLONG _int64 | ||
| 121 | # else | ||
| 122 | # define LLONG long long | ||
| 123 | # endif | ||
| 124 | #else | ||
| 125 | #define LLONG long | ||
| 126 | #endif | ||
| 127 | |||
| 128 | static void fmtstr (char **, char **, size_t *, size_t *, | ||
| 129 | const char *, int, int, int); | ||
| 130 | static void fmtint (char **, char **, size_t *, size_t *, | ||
| 131 | LLONG, int, int, int, int); | ||
| 132 | static void fmtfp (char **, char **, size_t *, size_t *, | ||
| 133 | LDOUBLE, int, int, int); | ||
| 134 | static void doapr_outch (char **, char **, size_t *, size_t *, int); | ||
| 135 | static void _dopr(char **sbuffer, char **buffer, | ||
| 136 | size_t *maxlen, size_t *retlen, int *truncated, | ||
| 137 | const char *format, va_list args); | ||
| 138 | |||
| 139 | /* format read states */ | ||
| 140 | #define DP_S_DEFAULT 0 | ||
| 141 | #define DP_S_FLAGS 1 | ||
| 142 | #define DP_S_MIN 2 | ||
| 143 | #define DP_S_DOT 3 | ||
| 144 | #define DP_S_MAX 4 | ||
| 145 | #define DP_S_MOD 5 | ||
| 146 | #define DP_S_CONV 6 | ||
| 147 | #define DP_S_DONE 7 | ||
| 148 | |||
| 149 | /* format flags - Bits */ | ||
| 150 | #define DP_F_MINUS (1 << 0) | ||
| 151 | #define DP_F_PLUS (1 << 1) | ||
| 152 | #define DP_F_SPACE (1 << 2) | ||
| 153 | #define DP_F_NUM (1 << 3) | ||
| 154 | #define DP_F_ZERO (1 << 4) | ||
| 155 | #define DP_F_UP (1 << 5) | ||
| 156 | #define DP_F_UNSIGNED (1 << 6) | ||
| 157 | |||
| 158 | /* conversion flags */ | ||
| 159 | #define DP_C_SHORT 1 | ||
| 160 | #define DP_C_LONG 2 | ||
| 161 | #define DP_C_LDOUBLE 3 | ||
| 162 | #define DP_C_LLONG 4 | ||
| 163 | |||
| 164 | /* some handy macros */ | ||
| 165 | #define char_to_int(p) (p - '0') | ||
| 166 | #define OSSL_MAX(p,q) ((p >= q) ? p : q) | ||
| 167 | |||
| 168 | static void | ||
| 169 | _dopr( | ||
| 170 | char **sbuffer, | ||
| 171 | char **buffer, | ||
| 172 | size_t *maxlen, | ||
| 173 | size_t *retlen, | ||
| 174 | int *truncated, | ||
| 175 | const char *format, | ||
| 176 | va_list args) | ||
| 177 | { | ||
| 178 | char ch; | ||
| 179 | LLONG value; | ||
| 180 | LDOUBLE fvalue; | ||
| 181 | char *strvalue; | ||
| 182 | int min; | ||
| 183 | int max; | ||
| 184 | int state; | ||
| 185 | int flags; | ||
| 186 | int cflags; | ||
| 187 | size_t currlen; | ||
| 188 | |||
| 189 | state = DP_S_DEFAULT; | ||
| 190 | flags = currlen = cflags = min = 0; | ||
| 191 | max = -1; | ||
| 192 | ch = *format++; | ||
| 193 | |||
| 194 | while (state != DP_S_DONE) { | ||
| 195 | if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) | ||
| 196 | state = DP_S_DONE; | ||
| 197 | |||
| 198 | switch (state) { | ||
| 199 | case DP_S_DEFAULT: | ||
| 200 | if (ch == '%') | ||
| 201 | state = DP_S_FLAGS; | ||
| 202 | else | ||
| 203 | doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); | ||
| 204 | ch = *format++; | ||
| 205 | break; | ||
| 206 | case DP_S_FLAGS: | ||
| 207 | switch (ch) { | ||
| 208 | case '-': | ||
| 209 | flags |= DP_F_MINUS; | ||
| 210 | ch = *format++; | ||
| 211 | break; | ||
| 212 | case '+': | ||
| 213 | flags |= DP_F_PLUS; | ||
| 214 | ch = *format++; | ||
| 215 | break; | ||
| 216 | case ' ': | ||
| 217 | flags |= DP_F_SPACE; | ||
| 218 | ch = *format++; | ||
| 219 | break; | ||
| 220 | case '#': | ||
| 221 | flags |= DP_F_NUM; | ||
| 222 | ch = *format++; | ||
| 223 | break; | ||
| 224 | case '0': | ||
| 225 | flags |= DP_F_ZERO; | ||
| 226 | ch = *format++; | ||
| 227 | break; | ||
| 228 | default: | ||
| 229 | state = DP_S_MIN; | ||
| 230 | break; | ||
| 231 | } | ||
| 232 | break; | ||
| 233 | case DP_S_MIN: | ||
| 234 | if (isdigit((unsigned char)ch)) { | ||
| 235 | min = 10 * min + char_to_int(ch); | ||
| 236 | ch = *format++; | ||
| 237 | } else if (ch == '*') { | ||
| 238 | min = va_arg(args, int); | ||
| 239 | ch = *format++; | ||
| 240 | state = DP_S_DOT; | ||
| 241 | } else | ||
| 242 | state = DP_S_DOT; | ||
| 243 | break; | ||
| 244 | case DP_S_DOT: | ||
| 245 | if (ch == '.') { | ||
| 246 | state = DP_S_MAX; | ||
| 247 | ch = *format++; | ||
| 248 | } else | ||
| 249 | state = DP_S_MOD; | ||
| 250 | break; | ||
| 251 | case DP_S_MAX: | ||
| 252 | if (isdigit((unsigned char)ch)) { | ||
| 253 | if (max < 0) | ||
| 254 | max = 0; | ||
| 255 | max = 10 * max + char_to_int(ch); | ||
| 256 | ch = *format++; | ||
| 257 | } else if (ch == '*') { | ||
| 258 | max = va_arg(args, int); | ||
| 259 | ch = *format++; | ||
| 260 | state = DP_S_MOD; | ||
| 261 | } else | ||
| 262 | state = DP_S_MOD; | ||
| 263 | break; | ||
| 264 | case DP_S_MOD: | ||
| 265 | switch (ch) { | ||
| 266 | case 'h': | ||
| 267 | cflags = DP_C_SHORT; | ||
| 268 | ch = *format++; | ||
| 269 | break; | ||
| 270 | case 'l': | ||
| 271 | if (*format == 'l') { | ||
| 272 | cflags = DP_C_LLONG; | ||
| 273 | format++; | ||
| 274 | } else | ||
| 275 | cflags = DP_C_LONG; | ||
| 276 | ch = *format++; | ||
| 277 | break; | ||
| 278 | case 'q': | ||
| 279 | cflags = DP_C_LLONG; | ||
| 280 | ch = *format++; | ||
| 281 | break; | ||
| 282 | case 'L': | ||
| 283 | cflags = DP_C_LDOUBLE; | ||
| 284 | ch = *format++; | ||
| 285 | break; | ||
| 286 | default: | ||
| 287 | break; | ||
| 288 | } | ||
| 289 | state = DP_S_CONV; | ||
| 290 | break; | ||
| 291 | case DP_S_CONV: | ||
| 292 | switch (ch) { | ||
| 293 | case 'd': | ||
| 294 | case 'i': | ||
| 295 | switch (cflags) { | ||
| 296 | case DP_C_SHORT: | ||
| 297 | value = (short int)va_arg(args, int); | ||
| 298 | break; | ||
| 299 | case DP_C_LONG: | ||
| 300 | value = va_arg(args, long int); | ||
| 301 | break; | ||
| 302 | case DP_C_LLONG: | ||
| 303 | value = va_arg(args, LLONG); | ||
| 304 | break; | ||
| 305 | default: | ||
| 306 | value = va_arg(args, int); | ||
| 307 | break; | ||
| 308 | } | ||
| 309 | fmtint(sbuffer, buffer, &currlen, maxlen, | ||
| 310 | value, 10, min, max, flags); | ||
| 311 | break; | ||
| 312 | case 'X': | ||
| 313 | flags |= DP_F_UP; | ||
| 314 | /* FALLTHROUGH */ | ||
| 315 | case 'x': | ||
| 316 | case 'o': | ||
| 317 | case 'u': | ||
| 318 | flags |= DP_F_UNSIGNED; | ||
| 319 | switch (cflags) { | ||
| 320 | case DP_C_SHORT: | ||
| 321 | value = (unsigned short int)va_arg(args, unsigned int); | ||
| 322 | break; | ||
| 323 | case DP_C_LONG: | ||
| 324 | value = (LLONG) va_arg(args, | ||
| 325 | unsigned long int); | ||
| 326 | break; | ||
| 327 | case DP_C_LLONG: | ||
| 328 | value = va_arg(args, unsigned LLONG); | ||
| 329 | break; | ||
| 330 | default: | ||
| 331 | value = (LLONG) va_arg(args, | ||
| 332 | unsigned int); | ||
| 333 | break; | ||
| 334 | } | ||
| 335 | fmtint(sbuffer, buffer, &currlen, maxlen, value, | ||
| 336 | ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), | ||
| 337 | min, max, flags); | ||
| 338 | break; | ||
| 339 | case 'f': | ||
| 340 | if (cflags == DP_C_LDOUBLE) | ||
| 341 | fvalue = va_arg(args, LDOUBLE); | ||
| 342 | else | ||
| 343 | fvalue = va_arg(args, double); | ||
| 344 | fmtfp(sbuffer, buffer, &currlen, maxlen, | ||
| 345 | fvalue, min, max, flags); | ||
| 346 | break; | ||
| 347 | case 'E': | ||
| 348 | flags |= DP_F_UP; | ||
| 349 | case 'e': | ||
| 350 | if (cflags == DP_C_LDOUBLE) | ||
| 351 | fvalue = va_arg(args, LDOUBLE); | ||
| 352 | else | ||
| 353 | fvalue = va_arg(args, double); | ||
| 354 | break; | ||
| 355 | case 'G': | ||
| 356 | flags |= DP_F_UP; | ||
| 357 | case 'g': | ||
| 358 | if (cflags == DP_C_LDOUBLE) | ||
| 359 | fvalue = va_arg(args, LDOUBLE); | ||
| 360 | else | ||
| 361 | fvalue = va_arg(args, double); | ||
| 362 | break; | ||
| 363 | case 'c': | ||
| 364 | doapr_outch(sbuffer, buffer, &currlen, maxlen, | ||
| 365 | va_arg(args, int)); | ||
| 366 | break; | ||
| 367 | case 's': | ||
| 368 | strvalue = va_arg(args, char *); | ||
| 369 | if (max < 0) { | ||
| 370 | if (buffer) | ||
| 371 | max = INT_MAX; | ||
| 372 | else | ||
| 373 | max = *maxlen; | ||
| 374 | } | ||
| 375 | fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, | ||
| 376 | flags, min, max); | ||
| 377 | break; | ||
| 378 | case 'p': | ||
| 379 | value = (long)va_arg(args, void *); | ||
| 380 | fmtint(sbuffer, buffer, &currlen, maxlen, | ||
| 381 | value, 16, min, max, flags); | ||
| 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 | } | ||
| 431 | |||
| 432 | static void | ||
| 433 | fmtstr( | ||
| 434 | char **sbuffer, | ||
| 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 | { | ||
| 443 | int padlen, strln; | ||
| 444 | int cnt = 0; | ||
| 445 | |||
| 446 | if (value == 0) | ||
| 447 | value = "<NULL>"; | ||
| 448 | for (strln = 0; value[strln]; ++strln) | ||
| 449 | ; | ||
| 450 | padlen = min - strln; | ||
| 451 | if (padlen < 0) | ||
| 452 | padlen = 0; | ||
| 453 | if (flags & DP_F_MINUS) | ||
| 454 | padlen = -padlen; | ||
| 455 | |||
| 456 | while ((padlen > 0) && (cnt < max)) { | ||
| 457 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 458 | --padlen; | ||
| 459 | ++cnt; | ||
| 460 | } | ||
| 461 | while (*value && (cnt < max)) { | ||
| 462 | doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); | ||
| 463 | ++cnt; | ||
| 464 | } | ||
| 465 | while ((padlen < 0) && (cnt < max)) { | ||
| 466 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 467 | ++padlen; | ||
| 468 | ++cnt; | ||
| 469 | } | ||
| 470 | } | ||
| 471 | |||
| 472 | static void | ||
| 473 | fmtint( | ||
| 474 | char **sbuffer, | ||
| 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 | { | ||
| 484 | int signvalue = 0; | ||
| 485 | unsigned LLONG uvalue; | ||
| 486 | char convert[20]; | ||
| 487 | int place = 0; | ||
| 488 | int spadlen = 0; | ||
| 489 | int zpadlen = 0; | ||
| 490 | int caps = 0; | ||
| 491 | |||
| 492 | if (max < 0) | ||
| 493 | max = 0; | ||
| 494 | uvalue = value; | ||
| 495 | if (!(flags & DP_F_UNSIGNED)) { | ||
| 496 | if (value < 0) { | ||
| 497 | signvalue = '-'; | ||
| 498 | uvalue = -value; | ||
| 499 | } else if (flags & DP_F_PLUS) | ||
| 500 | signvalue = '+'; | ||
| 501 | else if (flags & DP_F_SPACE) | ||
| 502 | signvalue = ' '; | ||
| 503 | } | ||
| 504 | if (flags & DP_F_UP) | ||
| 505 | caps = 1; | ||
| 506 | do { | ||
| 507 | convert[place++] = | ||
| 508 | (caps ? "0123456789ABCDEF" : "0123456789abcdef") | ||
| 509 | [uvalue % (unsigned) base]; | ||
| 510 | uvalue = (uvalue / (unsigned) base); | ||
| 511 | } while (uvalue && (place < 20)); | ||
| 512 | if (place == 20) | ||
| 513 | place--; | ||
| 514 | convert[place] = 0; | ||
| 515 | |||
| 516 | zpadlen = max - place; | ||
| 517 | spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0); | ||
| 518 | if (zpadlen < 0) | ||
| 519 | zpadlen = 0; | ||
| 520 | if (spadlen < 0) | ||
| 521 | spadlen = 0; | ||
| 522 | if (flags & DP_F_ZERO) { | ||
| 523 | zpadlen = OSSL_MAX(zpadlen, spadlen); | ||
| 524 | spadlen = 0; | ||
| 525 | } | ||
| 526 | if (flags & DP_F_MINUS) | ||
| 527 | spadlen = -spadlen; | ||
| 528 | |||
| 529 | /* spaces */ | ||
| 530 | while (spadlen > 0) { | ||
| 531 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 532 | --spadlen; | ||
| 533 | } | ||
| 534 | |||
| 535 | /* sign */ | ||
| 536 | if (signvalue) | ||
| 537 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | ||
| 538 | |||
| 539 | /* zeros */ | ||
| 540 | if (zpadlen > 0) { | ||
| 541 | while (zpadlen > 0) { | ||
| 542 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | ||
| 543 | --zpadlen; | ||
| 544 | } | ||
| 545 | } | ||
| 546 | /* digits */ | ||
| 547 | while (place > 0) | ||
| 548 | doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); | ||
| 549 | |||
| 550 | /* left justified spaces */ | ||
| 551 | while (spadlen < 0) { | ||
| 552 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 553 | ++spadlen; | ||
| 554 | } | ||
| 555 | return; | ||
| 556 | } | ||
| 557 | |||
| 558 | static LDOUBLE | ||
| 559 | abs_val(LDOUBLE value) | ||
| 560 | { | ||
| 561 | LDOUBLE result = value; | ||
| 562 | if (value < 0) | ||
| 563 | result = -value; | ||
| 564 | return result; | ||
| 565 | } | ||
| 566 | |||
| 567 | static LDOUBLE | ||
| 568 | pow10(int exp) | ||
| 569 | { | ||
| 570 | LDOUBLE result = 1; | ||
| 571 | while (exp) { | ||
| 572 | result *= 10; | ||
| 573 | exp--; | ||
| 574 | } | ||
| 575 | return result; | ||
| 576 | } | ||
| 577 | |||
| 578 | static long | ||
| 579 | roundv(LDOUBLE value) | ||
| 580 | { | ||
| 581 | long intpart; | ||
| 582 | intpart = (long) value; | ||
| 583 | value = value - intpart; | ||
| 584 | if (value >= 0.5) | ||
| 585 | intpart++; | ||
| 586 | return intpart; | ||
| 587 | } | ||
| 588 | |||
| 589 | static void | ||
| 590 | fmtfp( | ||
| 591 | char **sbuffer, | ||
| 592 | char **buffer, | ||
| 593 | size_t *currlen, | ||
| 594 | size_t *maxlen, | ||
| 595 | LDOUBLE fvalue, | ||
| 596 | int min, | ||
| 597 | int max, | ||
| 598 | int flags) | ||
| 599 | { | ||
| 600 | int signvalue = 0; | ||
| 601 | LDOUBLE ufvalue; | ||
| 602 | char iconvert[20]; | ||
| 603 | char fconvert[20]; | ||
| 604 | int iplace = 0; | ||
| 605 | int fplace = 0; | ||
| 606 | int padlen = 0; | ||
| 607 | int zpadlen = 0; | ||
| 608 | int caps = 0; | ||
| 609 | long intpart; | ||
| 610 | long fracpart; | ||
| 611 | |||
| 612 | if (max < 0) | ||
| 613 | max = 6; | ||
| 614 | ufvalue = abs_val(fvalue); | ||
| 615 | if (fvalue < 0) | ||
| 616 | signvalue = '-'; | ||
| 617 | else if (flags & DP_F_PLUS) | ||
| 618 | signvalue = '+'; | ||
| 619 | else if (flags & DP_F_SPACE) | ||
| 620 | signvalue = ' '; | ||
| 66 | 621 | ||
| 67 | int BIO_printf ( VAR_PLIST( BIO *, bio ) ) | 622 | intpart = (long)ufvalue; |
| 68 | VAR_ALIST | 623 | |
| 624 | /* sorry, we only support 9 digits past the decimal because of our | ||
| 625 | conversion method */ | ||
| 626 | if (max > 9) | ||
| 627 | max = 9; | ||
| 628 | |||
| 629 | /* we "cheat" by converting the fractional part to integer by | ||
| 630 | multiplying by a factor of 10 */ | ||
| 631 | fracpart = roundv((pow10(max)) * (ufvalue - intpart)); | ||
| 632 | |||
| 633 | if (fracpart >= pow10(max)) { | ||
| 634 | intpart++; | ||
| 635 | fracpart -= (long)pow10(max); | ||
| 636 | } | ||
| 637 | |||
| 638 | /* convert integer part */ | ||
| 639 | do { | ||
| 640 | iconvert[iplace++] = | ||
| 641 | (caps ? "0123456789ABCDEF" | ||
| 642 | : "0123456789abcdef")[intpart % 10]; | ||
| 643 | intpart = (intpart / 10); | ||
| 644 | } while (intpart && (iplace < 20)); | ||
| 645 | if (iplace == 20) | ||
| 646 | iplace--; | ||
| 647 | iconvert[iplace] = 0; | ||
| 648 | |||
| 649 | /* convert fractional part */ | ||
| 650 | do { | ||
| 651 | fconvert[fplace++] = | ||
| 652 | (caps ? "0123456789ABCDEF" | ||
| 653 | : "0123456789abcdef")[fracpart % 10]; | ||
| 654 | fracpart = (fracpart / 10); | ||
| 655 | } while (fplace < max); | ||
| 656 | if (fplace == 20) | ||
| 657 | fplace--; | ||
| 658 | fconvert[fplace] = 0; | ||
| 659 | |||
| 660 | /* -1 for decimal point, another -1 if we are printing a sign */ | ||
| 661 | padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); | ||
| 662 | zpadlen = max - fplace; | ||
| 663 | if (zpadlen < 0) | ||
| 664 | zpadlen = 0; | ||
| 665 | if (padlen < 0) | ||
| 666 | padlen = 0; | ||
| 667 | if (flags & DP_F_MINUS) | ||
| 668 | padlen = -padlen; | ||
| 669 | |||
| 670 | if ((flags & DP_F_ZERO) && (padlen > 0)) { | ||
| 671 | if (signvalue) { | ||
| 672 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | ||
| 673 | --padlen; | ||
| 674 | signvalue = 0; | ||
| 675 | } | ||
| 676 | while (padlen > 0) { | ||
| 677 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | ||
| 678 | --padlen; | ||
| 679 | } | ||
| 680 | } | ||
| 681 | while (padlen > 0) { | ||
| 682 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 683 | --padlen; | ||
| 684 | } | ||
| 685 | if (signvalue) | ||
| 686 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | ||
| 687 | |||
| 688 | while (iplace > 0) | ||
| 689 | doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); | ||
| 690 | |||
| 691 | /* | ||
| 692 | * Decimal point. This should probably use locale to find the correct | ||
| 693 | * char to print out. | ||
| 694 | */ | ||
| 695 | if (max > 0) { | ||
| 696 | doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); | ||
| 697 | |||
| 698 | while (fplace > 0) | ||
| 699 | doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); | ||
| 700 | } | ||
| 701 | while (zpadlen > 0) { | ||
| 702 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | ||
| 703 | --zpadlen; | ||
| 704 | } | ||
| 705 | |||
| 706 | while (padlen < 0) { | ||
| 707 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | ||
| 708 | ++padlen; | ||
| 709 | } | ||
| 710 | } | ||
| 711 | |||
| 712 | static void | ||
| 713 | doapr_outch( | ||
| 714 | char **sbuffer, | ||
| 715 | char **buffer, | ||
| 716 | size_t *currlen, | ||
| 717 | size_t *maxlen, | ||
| 718 | int c) | ||
| 719 | { | ||
| 720 | /* If we haven't at least one buffer, someone has doe a big booboo */ | ||
| 721 | assert(*sbuffer != NULL || buffer != NULL); | ||
| 722 | |||
| 723 | if (buffer) { | ||
| 724 | while (*currlen >= *maxlen) { | ||
| 725 | if (*buffer == NULL) { | ||
| 726 | if (*maxlen == 0) | ||
| 727 | *maxlen = 1024; | ||
| 728 | *buffer = OPENSSL_malloc(*maxlen); | ||
| 729 | if (*currlen > 0) { | ||
| 730 | assert(*sbuffer != NULL); | ||
| 731 | memcpy(*buffer, *sbuffer, *currlen); | ||
| 732 | } | ||
| 733 | *sbuffer = NULL; | ||
| 734 | } else { | ||
| 735 | *maxlen += 1024; | ||
| 736 | *buffer = OPENSSL_realloc(*buffer, *maxlen); | ||
| 737 | } | ||
| 738 | } | ||
| 739 | /* What to do if *buffer is NULL? */ | ||
| 740 | assert(*sbuffer != NULL || *buffer != NULL); | ||
| 741 | } | ||
| 742 | |||
| 743 | if (*currlen < *maxlen) { | ||
| 744 | if (*sbuffer) | ||
| 745 | (*sbuffer)[(*currlen)++] = (char)c; | ||
| 746 | else | ||
| 747 | (*buffer)[(*currlen)++] = (char)c; | ||
| 748 | } | ||
| 749 | |||
| 750 | return; | ||
| 751 | } | ||
| 752 | |||
| 753 | /***************************************************************************/ | ||
| 754 | |||
| 755 | int BIO_printf (BIO *bio, const char *format, ...) | ||
| 69 | { | 756 | { |
| 70 | VAR_BDEFN(args, BIO *, bio); | 757 | va_list args; |
| 71 | char *format; | ||
| 72 | int ret; | 758 | int ret; |
| 73 | MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */ | ||
| 74 | 759 | ||
| 75 | VAR_INIT(args, BIO *, bio); | 760 | va_start(args, format); |
| 76 | VAR_ARG(args, char *, format); | ||
| 77 | 761 | ||
| 78 | hugebuf[0]='\0'; | 762 | ret = BIO_vprintf(bio, format, args); |
| 79 | 763 | ||
| 80 | /* no-one uses _doprnt anymore and it appears to be broken under SunOS 4.1.4 */ | 764 | va_end(args); |
| 81 | #if 0 && defined(sun) && !defined(VAR_ANSI) /**/ | 765 | return(ret); |
| 82 | _doprnt(hugebuf,format,args); | 766 | } |
| 83 | #else /* !sun */ | ||
| 84 | vsprintf(hugebuf,format,args); | ||
| 85 | #endif /* sun */ | ||
| 86 | 767 | ||
| 87 | ret=BIO_write(bio,hugebuf,strlen(hugebuf)); | 768 | int BIO_vprintf (BIO *bio, const char *format, va_list args) |
| 769 | { | ||
| 770 | int ret; | ||
| 771 | size_t retlen; | ||
| 772 | char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable | ||
| 773 | in small-stack environments, like threads | ||
| 774 | or DOS programs. */ | ||
| 775 | char *hugebufp = hugebuf; | ||
| 776 | size_t hugebufsize = sizeof(hugebuf); | ||
| 777 | char *dynbuf = NULL; | ||
| 778 | int ignored; | ||
| 88 | 779 | ||
| 89 | VAR_END( args ); | 780 | dynbuf = NULL; |
| 781 | CRYPTO_push_info("doapr()"); | ||
| 782 | _dopr(&hugebufp, &dynbuf, &hugebufsize, | ||
| 783 | &retlen, &ignored, format, args); | ||
| 784 | if (dynbuf) | ||
| 785 | { | ||
| 786 | ret=BIO_write(bio, dynbuf, (int)retlen); | ||
| 787 | OPENSSL_free(dynbuf); | ||
| 788 | } | ||
| 789 | else | ||
| 790 | { | ||
| 791 | ret=BIO_write(bio, hugebuf, (int)retlen); | ||
| 792 | } | ||
| 793 | CRYPTO_pop_info(); | ||
| 90 | return(ret); | 794 | return(ret); |
| 91 | } | 795 | } |
| 92 | 796 | ||
| 797 | /* As snprintf is not available everywhere, we provide our own implementation. | ||
| 798 | * This function has nothing to do with BIOs, but it's closely related | ||
| 799 | * to BIO_printf, and we need *some* name prefix ... | ||
| 800 | * (XXX the function should be renamed, but to what?) */ | ||
| 801 | int BIO_snprintf(char *buf, size_t n, const char *format, ...) | ||
| 802 | { | ||
| 803 | va_list args; | ||
| 804 | int ret; | ||
| 805 | |||
| 806 | va_start(args, format); | ||
| 807 | |||
| 808 | ret = BIO_vsnprintf(buf, n, format, args); | ||
| 809 | |||
| 810 | va_end(args); | ||
| 811 | return(ret); | ||
| 812 | } | ||
| 813 | |||
| 814 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | ||
| 815 | { | ||
| 816 | size_t retlen; | ||
| 817 | int truncated; | ||
| 818 | |||
| 819 | _dopr(&buf, NULL, &n, &retlen, &truncated, format, args); | ||
| 820 | |||
| 821 | if (truncated) | ||
| 822 | /* In case of truncation, return -1 like traditional snprintf. | ||
| 823 | * (Current drafts for ISO/IEC 9899 say snprintf should return | ||
| 824 | * the number of characters that would have been written, | ||
| 825 | * had the buffer been large enough.) */ | ||
| 826 | return -1; | ||
| 827 | else | ||
| 828 | return (retlen <= INT_MAX) ? retlen : -1; | ||
| 829 | } | ||
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c index a45909527c..dcaef68ea7 100644 --- a/src/lib/libcrypto/bio/b_sock.c +++ b/src/lib/libcrypto/bio/b_sock.c | |||
| @@ -56,32 +56,30 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef NO_SOCK | 59 | #ifndef OPENSSL_NO_SOCK |
| 60 | 60 | ||
| 61 | #include <stdio.h> | 61 | #include <stdio.h> |
| 62 | #include <stdlib.h> | 62 | #include <stdlib.h> |
| 63 | #include <errno.h> | 63 | #include <errno.h> |
| 64 | #define USE_SOCKETS | 64 | #define USE_SOCKETS |
| 65 | #include "cryptlib.h" | 65 | #include "cryptlib.h" |
| 66 | #include "bio.h" | 66 | #include <openssl/bio.h> |
| 67 | 67 | ||
| 68 | /* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */ | 68 | #ifdef OPENSSL_SYS_WIN16 |
| 69 | |||
| 70 | #ifdef WIN16 | ||
| 71 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ | 69 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ |
| 72 | #else | 70 | #else |
| 73 | #define SOCKET_PROTOCOL IPPROTO_TCP | 71 | #define SOCKET_PROTOCOL IPPROTO_TCP |
| 74 | #endif | 72 | #endif |
| 75 | 73 | ||
| 76 | #ifdef SO_MAXCONN | 74 | #ifdef SO_MAXCONN |
| 77 | #define MAX_LISTEN SOMAXCONN | ||
| 78 | #elif defined(SO_MAXCONN) | ||
| 79 | #define MAX_LISTEN SO_MAXCONN | 75 | #define MAX_LISTEN SO_MAXCONN |
| 76 | #elif defined(SOMAXCONN) | ||
| 77 | #define MAX_LISTEN SOMAXCONN | ||
| 80 | #else | 78 | #else |
| 81 | #define MAX_LISTEN 32 | 79 | #define MAX_LISTEN 32 |
| 82 | #endif | 80 | #endif |
| 83 | 81 | ||
| 84 | #ifdef WINDOWS | 82 | #ifdef OPENSSL_SYS_WINDOWS |
| 85 | static int wsa_init_done=0; | 83 | static int wsa_init_done=0; |
| 86 | #endif | 84 | #endif |
| 87 | 85 | ||
| @@ -96,59 +94,67 @@ static struct ghbn_cache_st | |||
| 96 | unsigned long order; | 94 | unsigned long order; |
| 97 | } ghbn_cache[GHBN_NUM]; | 95 | } ghbn_cache[GHBN_NUM]; |
| 98 | 96 | ||
| 99 | #ifndef NOPROTO | 97 | static int get_ip(const char *str,unsigned char *ip); |
| 100 | static int get_ip(char *str,unsigned char *ip); | 98 | #if 0 |
| 101 | static void ghbn_free(struct hostent *a); | 99 | static void ghbn_free(struct hostent *a); |
| 102 | static struct hostent *ghbn_dup(struct hostent *a); | 100 | static struct hostent *ghbn_dup(struct hostent *a); |
| 103 | #else | ||
| 104 | static int get_ip(); | ||
| 105 | static void ghbn_free(); | ||
| 106 | static struct hostent *ghbn_dup(); | ||
| 107 | #endif | 101 | #endif |
| 108 | 102 | int BIO_get_host_ip(const char *str, unsigned char *ip) | |
| 109 | int BIO_get_host_ip(str,ip) | ||
| 110 | char *str; | ||
| 111 | unsigned char *ip; | ||
| 112 | { | 103 | { |
| 113 | int i; | 104 | int i; |
| 105 | int err = 1; | ||
| 106 | int locked = 0; | ||
| 114 | struct hostent *he; | 107 | struct hostent *he; |
| 115 | 108 | ||
| 116 | i=get_ip(str,ip); | 109 | i=get_ip(str,ip); |
| 117 | if (i > 0) return(1); | ||
| 118 | if (i < 0) | 110 | if (i < 0) |
| 119 | { | 111 | { |
| 120 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); | 112 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); |
| 121 | ERR_add_error_data(2,"host=",str); | 113 | goto err; |
| 122 | return(0); | ||
| 123 | } | 114 | } |
| 124 | else | ||
| 125 | { /* do a gethostbyname */ | ||
| 126 | if (!BIO_sock_init()) return(0); | ||
| 127 | 115 | ||
| 128 | he=BIO_gethostbyname(str); | 116 | /* At this point, we have something that is most probably correct |
| 129 | if (he == NULL) | 117 | in some way, so let's init the socket. */ |
| 130 | { | 118 | if (BIO_sock_init() != 1) |
| 131 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); | 119 | return 0; /* don't generate another error code here */ |
| 132 | ERR_add_error_data(2,"host=",str); | ||
| 133 | return(0); | ||
| 134 | } | ||
| 135 | 120 | ||
| 136 | /* cast to short because of win16 winsock definition */ | 121 | /* If the string actually contained an IP address, we need not do |
| 137 | if ((short)he->h_addrtype != AF_INET) | 122 | anything more */ |
| 138 | { | 123 | if (i > 0) return(1); |
| 139 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | 124 | |
| 140 | ERR_add_error_data(2,"host=",str); | 125 | /* do a gethostbyname */ |
| 141 | return(0); | 126 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 142 | } | 127 | locked = 1; |
| 143 | for (i=0; i<4; i++) | 128 | he=BIO_gethostbyname(str); |
| 144 | ip[i]=he->h_addr_list[0][i]; | 129 | if (he == NULL) |
| 130 | { | ||
| 131 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); | ||
| 132 | goto err; | ||
| 145 | } | 133 | } |
| 146 | return(1); | 134 | |
| 135 | /* cast to short because of win16 winsock definition */ | ||
| 136 | if ((short)he->h_addrtype != AF_INET) | ||
| 137 | { | ||
| 138 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | ||
| 139 | goto err; | ||
| 140 | } | ||
| 141 | for (i=0; i<4; i++) | ||
| 142 | ip[i]=he->h_addr_list[0][i]; | ||
| 143 | err = 0; | ||
| 144 | |||
| 145 | err: | ||
| 146 | if (locked) | ||
| 147 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | ||
| 148 | if (err) | ||
| 149 | { | ||
| 150 | ERR_add_error_data(2,"host=",str); | ||
| 151 | return 0; | ||
| 152 | } | ||
| 153 | else | ||
| 154 | return 1; | ||
| 147 | } | 155 | } |
| 148 | 156 | ||
| 149 | int BIO_get_port(str,port_ptr) | 157 | int BIO_get_port(const char *str, unsigned short *port_ptr) |
| 150 | char *str; | ||
| 151 | short *port_ptr; | ||
| 152 | { | 158 | { |
| 153 | int i; | 159 | int i; |
| 154 | struct servent *s; | 160 | struct servent *s; |
| @@ -163,8 +169,19 @@ short *port_ptr; | |||
| 163 | *port_ptr=(unsigned short)i; | 169 | *port_ptr=(unsigned short)i; |
| 164 | else | 170 | else |
| 165 | { | 171 | { |
| 166 | s=getservbyname(str,"tcp"); | 172 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); |
| 167 | if (s == NULL) | 173 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 174 | * parameter is 'char *', instead of 'const char *' | ||
| 175 | */ | ||
| 176 | s=getservbyname( | ||
| 177 | #ifndef CONST_STRICT | ||
| 178 | (char *) | ||
| 179 | #endif | ||
| 180 | str,"tcp"); | ||
| 181 | if(s != NULL) | ||
| 182 | *port_ptr=ntohs((unsigned short)s->s_port); | ||
| 183 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); | ||
| 184 | if(s == NULL) | ||
| 168 | { | 185 | { |
| 169 | if (strcmp(str,"http") == 0) | 186 | if (strcmp(str,"http") == 0) |
| 170 | *port_ptr=80; | 187 | *port_ptr=80; |
| @@ -190,31 +207,30 @@ short *port_ptr; | |||
| 190 | ERR_add_error_data(3,"service='",str,"'"); | 207 | ERR_add_error_data(3,"service='",str,"'"); |
| 191 | return(0); | 208 | return(0); |
| 192 | } | 209 | } |
| 193 | return(1); | ||
| 194 | } | 210 | } |
| 195 | *port_ptr=htons((unsigned short)s->s_port); | ||
| 196 | } | 211 | } |
| 197 | return(1); | 212 | return(1); |
| 198 | } | 213 | } |
| 199 | 214 | ||
| 200 | int BIO_sock_error(sock) | 215 | int BIO_sock_error(int sock) |
| 201 | int sock; | ||
| 202 | { | 216 | { |
| 203 | int j,i,size; | 217 | int j,i; |
| 218 | int size; | ||
| 204 | 219 | ||
| 205 | size=sizeof(int); | 220 | size=sizeof(int); |
| 206 | 221 | /* Note: under Windows the third parameter is of type (char *) | |
| 207 | i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(char *)&j,&size); | 222 | * whereas under other systems it is (void *) if you don't have |
| 223 | * a cast it will choke the compiler: if you do have a cast then | ||
| 224 | * you can either go for (char *) or (void *). | ||
| 225 | */ | ||
| 226 | i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); | ||
| 208 | if (i < 0) | 227 | if (i < 0) |
| 209 | return(1); | 228 | return(1); |
| 210 | else | 229 | else |
| 211 | return(j); | 230 | return(j); |
| 212 | } | 231 | } |
| 213 | 232 | ||
| 214 | long BIO_ghbn_ctrl(cmd,iarg,parg) | 233 | long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) |
| 215 | int cmd; | ||
| 216 | int iarg; | ||
| 217 | char *parg; | ||
| 218 | { | 234 | { |
| 219 | int i; | 235 | int i; |
| 220 | char **p; | 236 | char **p; |
| @@ -223,13 +239,13 @@ char *parg; | |||
| 223 | { | 239 | { |
| 224 | case BIO_GHBN_CTRL_HITS: | 240 | case BIO_GHBN_CTRL_HITS: |
| 225 | return(BIO_ghbn_hits); | 241 | return(BIO_ghbn_hits); |
| 226 | break; | 242 | /* break; */ |
| 227 | case BIO_GHBN_CTRL_MISSES: | 243 | case BIO_GHBN_CTRL_MISSES: |
| 228 | return(BIO_ghbn_miss); | 244 | return(BIO_ghbn_miss); |
| 229 | break; | 245 | /* break; */ |
| 230 | case BIO_GHBN_CTRL_CACHE_SIZE: | 246 | case BIO_GHBN_CTRL_CACHE_SIZE: |
| 231 | return(GHBN_NUM); | 247 | return(GHBN_NUM); |
| 232 | break; | 248 | /* break; */ |
| 233 | case BIO_GHBN_CTRL_GET_ENTRY: | 249 | case BIO_GHBN_CTRL_GET_ENTRY: |
| 234 | if ((iarg >= 0) && (iarg <GHBN_NUM) && | 250 | if ((iarg >= 0) && (iarg <GHBN_NUM) && |
| 235 | (ghbn_cache[iarg].order > 0)) | 251 | (ghbn_cache[iarg].order > 0)) |
| @@ -241,7 +257,7 @@ char *parg; | |||
| 241 | return(1); | 257 | return(1); |
| 242 | } | 258 | } |
| 243 | return(0); | 259 | return(0); |
| 244 | break; | 260 | /* break; */ |
| 245 | case BIO_GHBN_CTRL_FLUSH: | 261 | case BIO_GHBN_CTRL_FLUSH: |
| 246 | for (i=0; i<GHBN_NUM; i++) | 262 | for (i=0; i<GHBN_NUM; i++) |
| 247 | ghbn_cache[i].order=0; | 263 | ghbn_cache[i].order=0; |
| @@ -252,85 +268,105 @@ char *parg; | |||
| 252 | return(1); | 268 | return(1); |
| 253 | } | 269 | } |
| 254 | 270 | ||
| 255 | static struct hostent *ghbn_dup(a) | 271 | #if 0 |
| 256 | struct hostent *a; | 272 | static struct hostent *ghbn_dup(struct hostent *a) |
| 257 | { | 273 | { |
| 258 | struct hostent *ret; | 274 | struct hostent *ret; |
| 259 | int i,j; | 275 | int i,j; |
| 260 | 276 | ||
| 261 | ret=(struct hostent *)malloc(sizeof(struct hostent)); | 277 | MemCheck_off(); |
| 278 | ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); | ||
| 262 | if (ret == NULL) return(NULL); | 279 | if (ret == NULL) return(NULL); |
| 263 | memset(ret,0,sizeof(struct hostent)); | 280 | memset(ret,0,sizeof(struct hostent)); |
| 264 | 281 | ||
| 265 | for (i=0; a->h_aliases[i] != NULL; i++) | 282 | for (i=0; a->h_aliases[i] != NULL; i++) |
| 266 | ; | 283 | ; |
| 267 | i++; | 284 | i++; |
| 268 | ret->h_aliases=(char **)malloc(sizeof(char *)*i); | 285 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); |
| 269 | memset(ret->h_aliases,0,sizeof(char *)*i); | 286 | if (ret->h_aliases == NULL) |
| 270 | if (ret == NULL) goto err; | 287 | goto err; |
| 288 | memset(ret->h_aliases, 0, i*sizeof(char *)); | ||
| 271 | 289 | ||
| 272 | for (i=0; a->h_addr_list[i] != NULL; i++) | 290 | for (i=0; a->h_addr_list[i] != NULL; i++) |
| 273 | ; | 291 | ; |
| 274 | i++; | 292 | i++; |
| 275 | ret->h_addr_list=(char **)malloc(sizeof(char *)*i); | 293 | ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); |
| 276 | memset(ret->h_addr_list,0,sizeof(char *)*i); | 294 | if (ret->h_addr_list == NULL) |
| 277 | if (ret->h_addr_list == NULL) goto err; | 295 | goto err; |
| 296 | memset(ret->h_addr_list, 0, i*sizeof(char *)); | ||
| 278 | 297 | ||
| 279 | j=strlen(a->h_name)+1; | 298 | j=strlen(a->h_name)+1; |
| 280 | if ((ret->h_name=malloc(j)) == NULL) goto err; | 299 | if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; |
| 281 | memcpy((char *)ret->h_name,a->h_name,j); | 300 | memcpy((char *)ret->h_name,a->h_name,j); |
| 282 | for (i=0; a->h_aliases[i] != NULL; i++) | 301 | for (i=0; a->h_aliases[i] != NULL; i++) |
| 283 | { | 302 | { |
| 284 | j=strlen(a->h_aliases[i])+1; | 303 | j=strlen(a->h_aliases[i])+1; |
| 285 | if ((ret->h_aliases[i]=malloc(j)) == NULL) goto err; | 304 | if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; |
| 286 | memcpy(ret->h_aliases[i],a->h_aliases[i],j); | 305 | memcpy(ret->h_aliases[i],a->h_aliases[i],j); |
| 287 | } | 306 | } |
| 288 | ret->h_length=a->h_length; | 307 | ret->h_length=a->h_length; |
| 289 | ret->h_addrtype=a->h_addrtype; | 308 | ret->h_addrtype=a->h_addrtype; |
| 290 | for (i=0; a->h_addr_list[i] != NULL; i++) | 309 | for (i=0; a->h_addr_list[i] != NULL; i++) |
| 291 | { | 310 | { |
| 292 | if ((ret->h_addr_list[i]=malloc(a->h_length)) == NULL) | 311 | if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL) |
| 293 | goto err; | 312 | goto err; |
| 294 | memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); | 313 | memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); |
| 295 | } | 314 | } |
| 296 | return(ret); | 315 | if (0) |
| 316 | { | ||
| 297 | err: | 317 | err: |
| 298 | if (ret != NULL) | 318 | if (ret != NULL) |
| 299 | ghbn_free(ret); | 319 | ghbn_free(ret); |
| 300 | return(NULL); | 320 | ret=NULL; |
| 321 | } | ||
| 322 | MemCheck_on(); | ||
| 323 | return(ret); | ||
| 301 | } | 324 | } |
| 302 | 325 | ||
| 303 | static void ghbn_free(a) | 326 | static void ghbn_free(struct hostent *a) |
| 304 | struct hostent *a; | ||
| 305 | { | 327 | { |
| 306 | int i; | 328 | int i; |
| 307 | 329 | ||
| 330 | if(a == NULL) | ||
| 331 | return; | ||
| 332 | |||
| 308 | if (a->h_aliases != NULL) | 333 | if (a->h_aliases != NULL) |
| 309 | { | 334 | { |
| 310 | for (i=0; a->h_aliases[i] != NULL; i++) | 335 | for (i=0; a->h_aliases[i] != NULL; i++) |
| 311 | free(a->h_aliases[i]); | 336 | OPENSSL_free(a->h_aliases[i]); |
| 312 | free(a->h_aliases); | 337 | OPENSSL_free(a->h_aliases); |
| 313 | } | 338 | } |
| 314 | if (a->h_addr_list != NULL) | 339 | if (a->h_addr_list != NULL) |
| 315 | { | 340 | { |
| 316 | for (i=0; a->h_addr_list[i] != NULL; i++) | 341 | for (i=0; a->h_addr_list[i] != NULL; i++) |
| 317 | free(a->h_addr_list[i]); | 342 | OPENSSL_free(a->h_addr_list[i]); |
| 318 | free(a->h_addr_list); | 343 | OPENSSL_free(a->h_addr_list); |
| 319 | } | 344 | } |
| 320 | if (a->h_name != NULL) free((char *)a->h_name); | 345 | if (a->h_name != NULL) OPENSSL_free(a->h_name); |
| 321 | free(a); | 346 | OPENSSL_free(a); |
| 322 | } | 347 | } |
| 323 | 348 | ||
| 324 | struct hostent *BIO_gethostbyname(name) | 349 | #endif |
| 325 | char *name; | 350 | |
| 351 | struct hostent *BIO_gethostbyname(const char *name) | ||
| 326 | { | 352 | { |
| 353 | #if 1 | ||
| 354 | /* Caching gethostbyname() results forever is wrong, | ||
| 355 | * so we have to let the true gethostbyname() worry about this */ | ||
| 356 | return gethostbyname(name); | ||
| 357 | #else | ||
| 327 | struct hostent *ret; | 358 | struct hostent *ret; |
| 328 | int i,lowi=0,j; | 359 | int i,lowi=0,j; |
| 329 | unsigned long low= (unsigned long)-1; | 360 | unsigned long low= (unsigned long)-1; |
| 330 | 361 | ||
| 331 | /* return(gethostbyname(name)); */ | ||
| 332 | 362 | ||
| 333 | CRYPTO_w_lock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); | 363 | # if 0 |
| 364 | /* It doesn't make sense to use locking here: The function interface | ||
| 365 | * is not thread-safe, because threads can never be sure when | ||
| 366 | * some other thread destroys the data they were given a pointer to. | ||
| 367 | */ | ||
| 368 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | ||
| 369 | # endif | ||
| 334 | j=strlen(name); | 370 | j=strlen(name); |
| 335 | if (j < 128) | 371 | if (j < 128) |
| 336 | { | 372 | { |
| @@ -354,17 +390,39 @@ char *name; | |||
| 354 | if (i == GHBN_NUM) /* no hit*/ | 390 | if (i == GHBN_NUM) /* no hit*/ |
| 355 | { | 391 | { |
| 356 | BIO_ghbn_miss++; | 392 | BIO_ghbn_miss++; |
| 357 | ret=gethostbyname(name); | 393 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 358 | 394 | * parameter is 'char *', instead of 'const char *' | |
| 359 | if (ret == NULL) return(NULL); | 395 | */ |
| 360 | if (j > 128) return(ret); /* too big to cache */ | 396 | ret=gethostbyname( |
| 397 | # ifndef CONST_STRICT | ||
| 398 | (char *) | ||
| 399 | # endif | ||
| 400 | name); | ||
| 401 | |||
| 402 | if (ret == NULL) | ||
| 403 | goto end; | ||
| 404 | if (j > 128) /* too big to cache */ | ||
| 405 | { | ||
| 406 | # if 0 | ||
| 407 | /* If we were trying to make this function thread-safe (which | ||
| 408 | * is bound to fail), we'd have to give up in this case | ||
| 409 | * (or allocate more memory). */ | ||
| 410 | ret = NULL; | ||
| 411 | # endif | ||
| 412 | goto end; | ||
| 413 | } | ||
| 361 | 414 | ||
| 362 | /* else add to cache */ | 415 | /* else add to cache */ |
| 363 | if (ghbn_cache[lowi].ent != NULL) | 416 | if (ghbn_cache[lowi].ent != NULL) |
| 364 | ghbn_free(ghbn_cache[lowi].ent); | 417 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ |
| 418 | ghbn_cache[lowi].name[0] = '\0'; | ||
| 365 | 419 | ||
| 420 | if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) | ||
| 421 | { | ||
| 422 | BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE); | ||
| 423 | goto end; | ||
| 424 | } | ||
| 366 | strncpy(ghbn_cache[lowi].name,name,128); | 425 | strncpy(ghbn_cache[lowi].name,name,128); |
| 367 | ghbn_cache[lowi].ent=ghbn_dup(ret); | ||
| 368 | ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; | 426 | ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; |
| 369 | } | 427 | } |
| 370 | else | 428 | else |
| @@ -373,13 +431,18 @@ char *name; | |||
| 373 | ret= ghbn_cache[i].ent; | 431 | ret= ghbn_cache[i].ent; |
| 374 | ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; | 432 | ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; |
| 375 | } | 433 | } |
| 376 | CRYPTO_w_unlock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); | 434 | end: |
| 435 | # if 0 | ||
| 436 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | ||
| 437 | # endif | ||
| 377 | return(ret); | 438 | return(ret); |
| 439 | #endif | ||
| 378 | } | 440 | } |
| 379 | 441 | ||
| 380 | int BIO_sock_init() | 442 | |
| 443 | int BIO_sock_init(void) | ||
| 381 | { | 444 | { |
| 382 | #ifdef WINDOWS | 445 | #ifdef OPENSSL_SYS_WINDOWS |
| 383 | static struct WSAData wsa_state; | 446 | static struct WSAData wsa_state; |
| 384 | 447 | ||
| 385 | if (!wsa_init_done) | 448 | if (!wsa_init_done) |
| @@ -399,13 +462,13 @@ int BIO_sock_init() | |||
| 399 | return(-1); | 462 | return(-1); |
| 400 | } | 463 | } |
| 401 | } | 464 | } |
| 402 | #endif /* WINDOWS */ | 465 | #endif /* OPENSSL_SYS_WINDOWS */ |
| 403 | return(1); | 466 | return(1); |
| 404 | } | 467 | } |
| 405 | 468 | ||
| 406 | void BIO_sock_cleanup() | 469 | void BIO_sock_cleanup(void) |
| 407 | { | 470 | { |
| 408 | #ifdef WINDOWS | 471 | #ifdef OPENSSL_SYS_WINDOWS |
| 409 | if (wsa_init_done) | 472 | if (wsa_init_done) |
| 410 | { | 473 | { |
| 411 | wsa_init_done=0; | 474 | wsa_init_done=0; |
| @@ -415,10 +478,9 @@ void BIO_sock_cleanup() | |||
| 415 | #endif | 478 | #endif |
| 416 | } | 479 | } |
| 417 | 480 | ||
| 418 | int BIO_socket_ioctl(fd,type,arg) | 481 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 |
| 419 | int fd; | 482 | |
| 420 | long type; | 483 | int BIO_socket_ioctl(int fd, long type, unsigned long *arg) |
| 421 | unsigned long *arg; | ||
| 422 | { | 484 | { |
| 423 | int i; | 485 | int i; |
| 424 | 486 | ||
| @@ -427,12 +489,11 @@ unsigned long *arg; | |||
| 427 | SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); | 489 | SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); |
| 428 | return(i); | 490 | return(i); |
| 429 | } | 491 | } |
| 492 | #endif /* __VMS_VER */ | ||
| 430 | 493 | ||
| 431 | /* The reason I have implemented this instead of using sscanf is because | 494 | /* The reason I have implemented this instead of using sscanf is because |
| 432 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ | 495 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ |
| 433 | static int get_ip(str,ip) | 496 | static int get_ip(const char *str, unsigned char ip[4]) |
| 434 | char *str; | ||
| 435 | unsigned char ip[4]; | ||
| 436 | { | 497 | { |
| 437 | unsigned int tmp[4]; | 498 | unsigned int tmp[4]; |
| 438 | int num=0,c,ok=0; | 499 | int num=0,c,ok=0; |
| @@ -446,16 +507,16 @@ unsigned char ip[4]; | |||
| 446 | { | 507 | { |
| 447 | ok=1; | 508 | ok=1; |
| 448 | tmp[num]=tmp[num]*10+c-'0'; | 509 | tmp[num]=tmp[num]*10+c-'0'; |
| 449 | if (tmp[num] > 255) return(-1); | 510 | if (tmp[num] > 255) return(0); |
| 450 | } | 511 | } |
| 451 | else if (c == '.') | 512 | else if (c == '.') |
| 452 | { | 513 | { |
| 453 | if (!ok) return(-1); | 514 | if (!ok) return(-1); |
| 454 | if (num == 3) break; | 515 | if (num == 3) return(0); |
| 455 | num++; | 516 | num++; |
| 456 | ok=0; | 517 | ok=0; |
| 457 | } | 518 | } |
| 458 | else if ((num == 3) && ok) | 519 | else if (c == '\0' && (num == 3) && ok) |
| 459 | break; | 520 | break; |
| 460 | else | 521 | else |
| 461 | return(0); | 522 | return(0); |
| @@ -467,18 +528,19 @@ unsigned char ip[4]; | |||
| 467 | return(1); | 528 | return(1); |
| 468 | } | 529 | } |
| 469 | 530 | ||
| 470 | int BIO_get_accept_socket(host) | 531 | int BIO_get_accept_socket(char *host, int bind_mode) |
| 471 | char *host; | ||
| 472 | { | 532 | { |
| 473 | int ret=0; | 533 | int ret=0; |
| 474 | struct sockaddr_in server; | 534 | struct sockaddr_in server,client; |
| 475 | int s= -1; | 535 | int s=INVALID_SOCKET,cs; |
| 476 | unsigned char ip[4]; | 536 | unsigned char ip[4]; |
| 477 | short port; | 537 | unsigned short port; |
| 478 | char *str,*h,*p,*e; | 538 | char *str=NULL,*e; |
| 539 | const char *h,*p; | ||
| 479 | unsigned long l; | 540 | unsigned long l; |
| 541 | int err_num; | ||
| 480 | 542 | ||
| 481 | if (!BIO_sock_init()) return(INVALID_SOCKET); | 543 | if (BIO_sock_init() != 1) return(INVALID_SOCKET); |
| 482 | 544 | ||
| 483 | if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET); | 545 | if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET); |
| 484 | 546 | ||
| @@ -504,25 +566,26 @@ char *host; | |||
| 504 | h="*"; | 566 | h="*"; |
| 505 | } | 567 | } |
| 506 | 568 | ||
| 507 | if (!BIO_get_port(p,&port)) return(INVALID_SOCKET); | 569 | if (!BIO_get_port(p,&port)) goto err; |
| 508 | 570 | ||
| 509 | memset((char *)&server,0,sizeof(server)); | 571 | memset((char *)&server,0,sizeof(server)); |
| 510 | server.sin_family=AF_INET; | 572 | server.sin_family=AF_INET; |
| 511 | server.sin_port=htons((unsigned short)port); | 573 | server.sin_port=htons(port); |
| 512 | 574 | ||
| 513 | if (strcmp(h,"*") == 0) | 575 | if (strcmp(h,"*") == 0) |
| 514 | server.sin_addr.s_addr=INADDR_ANY; | 576 | server.sin_addr.s_addr=INADDR_ANY; |
| 515 | else | 577 | else |
| 516 | { | 578 | { |
| 517 | if (!BIO_get_host_ip(h,&(ip[0]))) return(INVALID_SOCKET); | 579 | if (!BIO_get_host_ip(h,&(ip[0]))) goto err; |
| 518 | l=(unsigned long) | 580 | l=(unsigned long) |
| 519 | ((unsigned long)ip[0]<<24L)| | 581 | ((unsigned long)ip[0]<<24L)| |
| 520 | ((unsigned long)ip[0]<<16L)| | 582 | ((unsigned long)ip[1]<<16L)| |
| 521 | ((unsigned long)ip[0]<< 8L)| | 583 | ((unsigned long)ip[2]<< 8L)| |
| 522 | ((unsigned long)ip[0]); | 584 | ((unsigned long)ip[3]); |
| 523 | server.sin_addr.s_addr=htonl(l); | 585 | server.sin_addr.s_addr=htonl(l); |
| 524 | } | 586 | } |
| 525 | 587 | ||
| 588 | again: | ||
| 526 | s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); | 589 | s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); |
| 527 | if (s == INVALID_SOCKET) | 590 | if (s == INVALID_SOCKET) |
| 528 | { | 591 | { |
| @@ -531,9 +594,45 @@ char *host; | |||
| 531 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); | 594 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); |
| 532 | goto err; | 595 | goto err; |
| 533 | } | 596 | } |
| 597 | |||
| 598 | #ifdef SO_REUSEADDR | ||
| 599 | if (bind_mode == BIO_BIND_REUSEADDR) | ||
| 600 | { | ||
| 601 | int i=1; | ||
| 602 | |||
| 603 | ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); | ||
| 604 | bind_mode=BIO_BIND_NORMAL; | ||
| 605 | } | ||
| 606 | #endif | ||
| 534 | if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) | 607 | if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) |
| 535 | { | 608 | { |
| 536 | SYSerr(SYS_F_BIND,get_last_socket_error()); | 609 | #ifdef SO_REUSEADDR |
| 610 | err_num=get_last_socket_error(); | ||
| 611 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && | ||
| 612 | (err_num == EADDRINUSE)) | ||
| 613 | { | ||
| 614 | memcpy((char *)&client,(char *)&server,sizeof(server)); | ||
| 615 | if (strcmp(h,"*") == 0) | ||
| 616 | client.sin_addr.s_addr=htonl(0x7F000001); | ||
| 617 | cs=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); | ||
| 618 | if (cs != INVALID_SOCKET) | ||
| 619 | { | ||
| 620 | int ii; | ||
| 621 | ii=connect(cs,(struct sockaddr *)&client, | ||
| 622 | sizeof(client)); | ||
| 623 | closesocket(cs); | ||
| 624 | if (ii == INVALID_SOCKET) | ||
| 625 | { | ||
| 626 | bind_mode=BIO_BIND_REUSEADDR; | ||
| 627 | closesocket(s); | ||
| 628 | goto again; | ||
| 629 | } | ||
| 630 | /* else error */ | ||
| 631 | } | ||
| 632 | /* else error */ | ||
| 633 | } | ||
| 634 | #endif | ||
| 635 | SYSerr(SYS_F_BIND,err_num); | ||
| 537 | ERR_add_error_data(3,"port='",host,"'"); | 636 | ERR_add_error_data(3,"port='",host,"'"); |
| 538 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); | 637 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); |
| 539 | goto err; | 638 | goto err; |
| @@ -547,35 +646,35 @@ char *host; | |||
| 547 | } | 646 | } |
| 548 | ret=1; | 647 | ret=1; |
| 549 | err: | 648 | err: |
| 550 | if (str != NULL) Free(str); | 649 | if (str != NULL) OPENSSL_free(str); |
| 551 | if ((ret == 0) && (s != INVALID_SOCKET)) | 650 | if ((ret == 0) && (s != INVALID_SOCKET)) |
| 552 | { | 651 | { |
| 553 | #ifdef WINDOWS | ||
| 554 | closesocket(s); | 652 | closesocket(s); |
| 555 | #else | ||
| 556 | close(s); | ||
| 557 | #endif | ||
| 558 | s= INVALID_SOCKET; | 653 | s= INVALID_SOCKET; |
| 559 | } | 654 | } |
| 560 | return(s); | 655 | return(s); |
| 561 | } | 656 | } |
| 562 | 657 | ||
| 563 | int BIO_accept(sock,addr) | 658 | int BIO_accept(int sock, char **addr) |
| 564 | int sock; | ||
| 565 | char **addr; | ||
| 566 | { | 659 | { |
| 567 | int ret=INVALID_SOCKET; | 660 | int ret=INVALID_SOCKET; |
| 568 | static struct sockaddr_in from; | 661 | static struct sockaddr_in from; |
| 569 | unsigned long l; | 662 | unsigned long l; |
| 570 | short port; | 663 | unsigned short port; |
| 571 | int len; | 664 | int len; |
| 572 | char *p; | 665 | char *p; |
| 573 | 666 | ||
| 574 | memset((char *)&from,0,sizeof(from)); | 667 | memset((char *)&from,0,sizeof(from)); |
| 575 | len=sizeof(from); | 668 | len=sizeof(from); |
| 576 | ret=accept(sock,(struct sockaddr *)&from,&len); | 669 | /* Note: under VMS with SOCKETSHR the fourth parameter is currently |
| 670 | * of type (int *) whereas under other systems it is (void *) if | ||
| 671 | * you don't have a cast it will choke the compiler: if you do | ||
| 672 | * have a cast then you can either go for (int *) or (void *). | ||
| 673 | */ | ||
| 674 | ret=accept(sock,(struct sockaddr *)&from,(void *)&len); | ||
| 577 | if (ret == INVALID_SOCKET) | 675 | if (ret == INVALID_SOCKET) |
| 578 | { | 676 | { |
| 677 | if(BIO_sock_should_retry(ret)) return -2; | ||
| 579 | SYSerr(SYS_F_ACCEPT,get_last_socket_error()); | 678 | SYSerr(SYS_F_ACCEPT,get_last_socket_error()); |
| 580 | BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); | 679 | BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); |
| 581 | goto end; | 680 | goto end; |
| @@ -587,7 +686,7 @@ char **addr; | |||
| 587 | port=ntohs(from.sin_port); | 686 | port=ntohs(from.sin_port); |
| 588 | if (*addr == NULL) | 687 | if (*addr == NULL) |
| 589 | { | 688 | { |
| 590 | if ((p=Malloc(24)) == NULL) | 689 | if ((p=OPENSSL_malloc(24)) == NULL) |
| 591 | { | 690 | { |
| 592 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | 691 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); |
| 593 | goto end; | 692 | goto end; |
| @@ -604,9 +703,7 @@ end: | |||
| 604 | return(ret); | 703 | return(ret); |
| 605 | } | 704 | } |
| 606 | 705 | ||
| 607 | int BIO_set_tcp_ndelay(s,on) | 706 | int BIO_set_tcp_ndelay(int s, int on) |
| 608 | int s; | ||
| 609 | int on; | ||
| 610 | { | 707 | { |
| 611 | int ret=0; | 708 | int ret=0; |
| 612 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) | 709 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) |
| @@ -626,3 +723,14 @@ int on; | |||
| 626 | } | 723 | } |
| 627 | #endif | 724 | #endif |
| 628 | 725 | ||
| 726 | int BIO_socket_nbio(int s, int mode) | ||
| 727 | { | ||
| 728 | int ret= -1; | ||
| 729 | unsigned long l; | ||
| 730 | |||
| 731 | l=mode; | ||
| 732 | #ifdef FIONBIO | ||
| 733 | ret=BIO_socket_ioctl(s,FIONBIO,&l); | ||
| 734 | #endif | ||
| 735 | return(ret == 0); | ||
| 736 | } | ||
diff --git a/src/lib/libcrypto/bio/bf_buff.c b/src/lib/libcrypto/bio/bf_buff.c index 7912b88473..6ccda06596 100644 --- a/src/lib/libcrypto/bio/bf_buff.c +++ b/src/lib/libcrypto/bio/bf_buff.c | |||
| @@ -59,28 +59,17 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include "bio.h" | 62 | #include <openssl/bio.h> |
| 63 | #include "evp.h" | 63 | |
| 64 | 64 | static int buffer_write(BIO *h, const char *buf,int num); | |
| 65 | #ifndef NOPROTO | 65 | static int buffer_read(BIO *h, char *buf, int size); |
| 66 | static int buffer_write(BIO *h,char *buf,int num); | 66 | static int buffer_puts(BIO *h, const char *str); |
| 67 | static int buffer_read(BIO *h,char *buf,int size); | 67 | static int buffer_gets(BIO *h, char *str, int size); |
| 68 | static int buffer_puts(BIO *h,char *str); | 68 | static long buffer_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static int buffer_gets(BIO *h,char *str,int size); | ||
| 70 | static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 71 | static int buffer_new(BIO *h); | 69 | static int buffer_new(BIO *h); |
| 72 | static int buffer_free(BIO *data); | 70 | static int buffer_free(BIO *data); |
| 73 | #else | 71 | static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 74 | static int buffer_write(); | 72 | #define DEFAULT_BUFFER_SIZE 4096 |
| 75 | static int buffer_read(); | ||
| 76 | static int buffer_puts(); | ||
| 77 | static int buffer_gets(); | ||
| 78 | static long buffer_ctrl(); | ||
| 79 | static int buffer_new(); | ||
| 80 | static int buffer_free(); | ||
| 81 | #endif | ||
| 82 | |||
| 83 | #define DEFAULT_BUFFER_SIZE 1024 | ||
| 84 | 73 | ||
| 85 | static BIO_METHOD methods_buffer= | 74 | static BIO_METHOD methods_buffer= |
| 86 | { | 75 | { |
| @@ -93,24 +82,24 @@ static BIO_METHOD methods_buffer= | |||
| 93 | buffer_ctrl, | 82 | buffer_ctrl, |
| 94 | buffer_new, | 83 | buffer_new, |
| 95 | buffer_free, | 84 | buffer_free, |
| 85 | buffer_callback_ctrl, | ||
| 96 | }; | 86 | }; |
| 97 | 87 | ||
| 98 | BIO_METHOD *BIO_f_buffer() | 88 | BIO_METHOD *BIO_f_buffer(void) |
| 99 | { | 89 | { |
| 100 | return(&methods_buffer); | 90 | return(&methods_buffer); |
| 101 | } | 91 | } |
| 102 | 92 | ||
| 103 | static int buffer_new(bi) | 93 | static int buffer_new(BIO *bi) |
| 104 | BIO *bi; | ||
| 105 | { | 94 | { |
| 106 | BIO_F_BUFFER_CTX *ctx; | 95 | BIO_F_BUFFER_CTX *ctx; |
| 107 | 96 | ||
| 108 | ctx=(BIO_F_BUFFER_CTX *)Malloc(sizeof(BIO_F_BUFFER_CTX)); | 97 | ctx=(BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); |
| 109 | if (ctx == NULL) return(0); | 98 | if (ctx == NULL) return(0); |
| 110 | ctx->ibuf=(char *)Malloc(DEFAULT_BUFFER_SIZE); | 99 | ctx->ibuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); |
| 111 | if (ctx->ibuf == NULL) { Free(ctx); return(0); } | 100 | if (ctx->ibuf == NULL) { OPENSSL_free(ctx); return(0); } |
| 112 | ctx->obuf=(char *)Malloc(DEFAULT_BUFFER_SIZE); | 101 | ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); |
| 113 | if (ctx->obuf == NULL) { Free(ctx->ibuf); Free(ctx); return(0); } | 102 | if (ctx->obuf == NULL) { OPENSSL_free(ctx->ibuf); OPENSSL_free(ctx); return(0); } |
| 114 | ctx->ibuf_size=DEFAULT_BUFFER_SIZE; | 103 | ctx->ibuf_size=DEFAULT_BUFFER_SIZE; |
| 115 | ctx->obuf_size=DEFAULT_BUFFER_SIZE; | 104 | ctx->obuf_size=DEFAULT_BUFFER_SIZE; |
| 116 | ctx->ibuf_len=0; | 105 | ctx->ibuf_len=0; |
| @@ -124,26 +113,22 @@ BIO *bi; | |||
| 124 | return(1); | 113 | return(1); |
| 125 | } | 114 | } |
| 126 | 115 | ||
| 127 | static int buffer_free(a) | 116 | static int buffer_free(BIO *a) |
| 128 | BIO *a; | ||
| 129 | { | 117 | { |
| 130 | BIO_F_BUFFER_CTX *b; | 118 | BIO_F_BUFFER_CTX *b; |
| 131 | 119 | ||
| 132 | if (a == NULL) return(0); | 120 | if (a == NULL) return(0); |
| 133 | b=(BIO_F_BUFFER_CTX *)a->ptr; | 121 | b=(BIO_F_BUFFER_CTX *)a->ptr; |
| 134 | if (b->ibuf != NULL) Free(b->ibuf); | 122 | if (b->ibuf != NULL) OPENSSL_free(b->ibuf); |
| 135 | if (b->obuf != NULL) Free(b->obuf); | 123 | if (b->obuf != NULL) OPENSSL_free(b->obuf); |
| 136 | Free(a->ptr); | 124 | OPENSSL_free(a->ptr); |
| 137 | a->ptr=NULL; | 125 | a->ptr=NULL; |
| 138 | a->init=0; | 126 | a->init=0; |
| 139 | a->flags=0; | 127 | a->flags=0; |
| 140 | return(1); | 128 | return(1); |
| 141 | } | 129 | } |
| 142 | 130 | ||
| 143 | static int buffer_read(b,out,outl) | 131 | static int buffer_read(BIO *b, char *out, int outl) |
| 144 | BIO *b; | ||
| 145 | char *out; | ||
| 146 | int outl; | ||
| 147 | { | 132 | { |
| 148 | int i,num=0; | 133 | int i,num=0; |
| 149 | BIO_F_BUFFER_CTX *ctx; | 134 | BIO_F_BUFFER_CTX *ctx; |
| @@ -209,10 +194,7 @@ start: | |||
| 209 | goto start; | 194 | goto start; |
| 210 | } | 195 | } |
| 211 | 196 | ||
| 212 | static int buffer_write(b,in,inl) | 197 | static int buffer_write(BIO *b, const char *in, int inl) |
| 213 | BIO *b; | ||
| 214 | char *in; | ||
| 215 | int inl; | ||
| 216 | { | 198 | { |
| 217 | int i,num=0; | 199 | int i,num=0; |
| 218 | BIO_F_BUFFER_CTX *ctx; | 200 | BIO_F_BUFFER_CTX *ctx; |
| @@ -285,11 +267,7 @@ start: | |||
| 285 | goto start; | 267 | goto start; |
| 286 | } | 268 | } |
| 287 | 269 | ||
| 288 | static long buffer_ctrl(b,cmd,num,ptr) | 270 | static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 289 | BIO *b; | ||
| 290 | int cmd; | ||
| 291 | long num; | ||
| 292 | char *ptr; | ||
| 293 | { | 271 | { |
| 294 | BIO *dbio; | 272 | BIO *dbio; |
| 295 | BIO_F_BUFFER_CTX *ctx; | 273 | BIO_F_BUFFER_CTX *ctx; |
| @@ -307,6 +285,7 @@ char *ptr; | |||
| 307 | ctx->ibuf_len=0; | 285 | ctx->ibuf_len=0; |
| 308 | ctx->obuf_off=0; | 286 | ctx->obuf_off=0; |
| 309 | ctx->obuf_len=0; | 287 | ctx->obuf_len=0; |
| 288 | if (b->next_bio == NULL) return(0); | ||
| 310 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 289 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| 311 | break; | 290 | break; |
| 312 | case BIO_CTRL_INFO: | 291 | case BIO_CTRL_INFO: |
| @@ -323,19 +302,25 @@ char *ptr; | |||
| 323 | case BIO_CTRL_WPENDING: | 302 | case BIO_CTRL_WPENDING: |
| 324 | ret=(long)ctx->obuf_len; | 303 | ret=(long)ctx->obuf_len; |
| 325 | if (ret == 0) | 304 | if (ret == 0) |
| 305 | { | ||
| 306 | if (b->next_bio == NULL) return(0); | ||
| 326 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 307 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| 308 | } | ||
| 327 | break; | 309 | break; |
| 328 | case BIO_CTRL_PENDING: | 310 | case BIO_CTRL_PENDING: |
| 329 | ret=(long)ctx->ibuf_len; | 311 | ret=(long)ctx->ibuf_len; |
| 330 | if (ret == 0) | 312 | if (ret == 0) |
| 313 | { | ||
| 314 | if (b->next_bio == NULL) return(0); | ||
| 331 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 315 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| 316 | } | ||
| 332 | break; | 317 | break; |
| 333 | case BIO_C_SET_BUFF_READ_DATA: | 318 | case BIO_C_SET_BUFF_READ_DATA: |
| 334 | if (num > ctx->ibuf_size) | 319 | if (num > ctx->ibuf_size) |
| 335 | { | 320 | { |
| 336 | p1=Malloc((int)num); | 321 | p1=OPENSSL_malloc((int)num); |
| 337 | if (p1 == NULL) goto malloc_error; | 322 | if (p1 == NULL) goto malloc_error; |
| 338 | if (ctx->ibuf != NULL) Free(ctx->ibuf); | 323 | if (ctx->ibuf != NULL) OPENSSL_free(ctx->ibuf); |
| 339 | ctx->ibuf=p1; | 324 | ctx->ibuf=p1; |
| 340 | } | 325 | } |
| 341 | ctx->ibuf_off=0; | 326 | ctx->ibuf_off=0; |
| @@ -367,21 +352,21 @@ char *ptr; | |||
| 367 | p2=ctx->obuf; | 352 | p2=ctx->obuf; |
| 368 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) | 353 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) |
| 369 | { | 354 | { |
| 370 | p1=(char *)Malloc((int)num); | 355 | p1=(char *)OPENSSL_malloc((int)num); |
| 371 | if (p1 == NULL) goto malloc_error; | 356 | if (p1 == NULL) goto malloc_error; |
| 372 | } | 357 | } |
| 373 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) | 358 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) |
| 374 | { | 359 | { |
| 375 | p2=(char *)Malloc((int)num); | 360 | p2=(char *)OPENSSL_malloc((int)num); |
| 376 | if (p2 == NULL) | 361 | if (p2 == NULL) |
| 377 | { | 362 | { |
| 378 | if (p1 != ctx->ibuf) Free(p1); | 363 | if (p1 != ctx->ibuf) OPENSSL_free(p1); |
| 379 | goto malloc_error; | 364 | goto malloc_error; |
| 380 | } | 365 | } |
| 381 | } | 366 | } |
| 382 | if (ctx->ibuf != p1) | 367 | if (ctx->ibuf != p1) |
| 383 | { | 368 | { |
| 384 | Free(ctx->ibuf); | 369 | OPENSSL_free(ctx->ibuf); |
| 385 | ctx->ibuf=p1; | 370 | ctx->ibuf=p1; |
| 386 | ctx->ibuf_off=0; | 371 | ctx->ibuf_off=0; |
| 387 | ctx->ibuf_len=0; | 372 | ctx->ibuf_len=0; |
| @@ -389,7 +374,7 @@ char *ptr; | |||
| 389 | } | 374 | } |
| 390 | if (ctx->obuf != p2) | 375 | if (ctx->obuf != p2) |
| 391 | { | 376 | { |
| 392 | Free(ctx->obuf); | 377 | OPENSSL_free(ctx->obuf); |
| 393 | ctx->obuf=p2; | 378 | ctx->obuf=p2; |
| 394 | ctx->obuf_off=0; | 379 | ctx->obuf_off=0; |
| 395 | ctx->obuf_len=0; | 380 | ctx->obuf_len=0; |
| @@ -397,12 +382,14 @@ char *ptr; | |||
| 397 | } | 382 | } |
| 398 | break; | 383 | break; |
| 399 | case BIO_C_DO_STATE_MACHINE: | 384 | case BIO_C_DO_STATE_MACHINE: |
| 385 | if (b->next_bio == NULL) return(0); | ||
| 400 | BIO_clear_retry_flags(b); | 386 | BIO_clear_retry_flags(b); |
| 401 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 387 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| 402 | BIO_copy_next_retry(b); | 388 | BIO_copy_next_retry(b); |
| 403 | break; | 389 | break; |
| 404 | 390 | ||
| 405 | case BIO_CTRL_FLUSH: | 391 | case BIO_CTRL_FLUSH: |
| 392 | if (b->next_bio == NULL) return(0); | ||
| 406 | if (ctx->obuf_len <= 0) | 393 | if (ctx->obuf_len <= 0) |
| 407 | { | 394 | { |
| 408 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 395 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| @@ -432,6 +419,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_ | |||
| 432 | break; | 419 | break; |
| 433 | } | 420 | } |
| 434 | } | 421 | } |
| 422 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | ||
| 435 | break; | 423 | break; |
| 436 | case BIO_CTRL_DUP: | 424 | case BIO_CTRL_DUP: |
| 437 | dbio=(BIO *)ptr; | 425 | dbio=(BIO *)ptr; |
| @@ -440,6 +428,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_ | |||
| 440 | ret=0; | 428 | ret=0; |
| 441 | break; | 429 | break; |
| 442 | default: | 430 | default: |
| 431 | if (b->next_bio == NULL) return(0); | ||
| 443 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 432 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); |
| 444 | break; | 433 | break; |
| 445 | } | 434 | } |
| @@ -449,10 +438,21 @@ malloc_error: | |||
| 449 | return(0); | 438 | return(0); |
| 450 | } | 439 | } |
| 451 | 440 | ||
| 452 | static int buffer_gets(b,buf,size) | 441 | static long buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 453 | BIO *b; | 442 | { |
| 454 | char *buf; | 443 | long ret=1; |
| 455 | int size; | 444 | |
| 445 | if (b->next_bio == NULL) return(0); | ||
| 446 | switch (cmd) | ||
| 447 | { | ||
| 448 | default: | ||
| 449 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
| 450 | break; | ||
| 451 | } | ||
| 452 | return(ret); | ||
| 453 | } | ||
| 454 | |||
| 455 | static int buffer_gets(BIO *b, char *buf, int size) | ||
| 456 | { | 456 | { |
| 457 | BIO_F_BUFFER_CTX *ctx; | 457 | BIO_F_BUFFER_CTX *ctx; |
| 458 | int num=0,i,flag; | 458 | int num=0,i,flag; |
| @@ -503,10 +503,8 @@ int size; | |||
| 503 | } | 503 | } |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | static int buffer_puts(b,str) | 506 | static int buffer_puts(BIO *b, const char *str) |
| 507 | BIO *b; | ||
| 508 | char *str; | ||
| 509 | { | 507 | { |
| 510 | return(BIO_write(b,str,strlen(str))); | 508 | return(buffer_write(b,str,strlen(str))); |
| 511 | } | 509 | } |
| 512 | 510 | ||
diff --git a/src/lib/libcrypto/bio/bf_lbuf.c b/src/lib/libcrypto/bio/bf_lbuf.c index 7bcf8ed941..ec0f7eb0b7 100644 --- a/src/lib/libcrypto/bio/bf_lbuf.c +++ b/src/lib/libcrypto/bio/bf_lbuf.c | |||
| @@ -200,7 +200,7 @@ static int linebuffer_write(BIO *b, const char *in, int inl) | |||
| 200 | } | 200 | } |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | #ifdef DEBUG | 203 | #if 0 |
| 204 | BIO_write(b->next_bio, "<*<", 3); | 204 | BIO_write(b->next_bio, "<*<", 3); |
| 205 | #endif | 205 | #endif |
| 206 | i=BIO_write(b->next_bio, | 206 | i=BIO_write(b->next_bio, |
| @@ -210,13 +210,13 @@ BIO_write(b->next_bio, "<*<", 3); | |||
| 210 | ctx->obuf_len = orig_olen; | 210 | ctx->obuf_len = orig_olen; |
| 211 | BIO_copy_next_retry(b); | 211 | BIO_copy_next_retry(b); |
| 212 | 212 | ||
| 213 | #ifdef DEBUG | 213 | #if 0 |
| 214 | BIO_write(b->next_bio, ">*>", 3); | 214 | BIO_write(b->next_bio, ">*>", 3); |
| 215 | #endif | 215 | #endif |
| 216 | if (i < 0) return((num > 0)?num:i); | 216 | if (i < 0) return((num > 0)?num:i); |
| 217 | if (i == 0) return(num); | 217 | if (i == 0) return(num); |
| 218 | } | 218 | } |
| 219 | #ifdef DEBUG | 219 | #if 0 |
| 220 | BIO_write(b->next_bio, ">*>", 3); | 220 | BIO_write(b->next_bio, ">*>", 3); |
| 221 | #endif | 221 | #endif |
| 222 | if (i < ctx->obuf_len) | 222 | if (i < ctx->obuf_len) |
| @@ -229,20 +229,20 @@ BIO_write(b->next_bio, ">*>", 3); | |||
| 229 | buffer if a NL was found and there is anything to write. */ | 229 | buffer if a NL was found and there is anything to write. */ |
| 230 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) | 230 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) |
| 231 | { | 231 | { |
| 232 | #ifdef DEBUG | 232 | #if 0 |
| 233 | BIO_write(b->next_bio, "<*<", 3); | 233 | BIO_write(b->next_bio, "<*<", 3); |
| 234 | #endif | 234 | #endif |
| 235 | i=BIO_write(b->next_bio,in,p - in); | 235 | i=BIO_write(b->next_bio,in,p - in); |
| 236 | if (i <= 0) | 236 | if (i <= 0) |
| 237 | { | 237 | { |
| 238 | BIO_copy_next_retry(b); | 238 | BIO_copy_next_retry(b); |
| 239 | #ifdef DEBUG | 239 | #if 0 |
| 240 | BIO_write(b->next_bio, ">*>", 3); | 240 | BIO_write(b->next_bio, ">*>", 3); |
| 241 | #endif | 241 | #endif |
| 242 | if (i < 0) return((num > 0)?num:i); | 242 | if (i < 0) return((num > 0)?num:i); |
| 243 | if (i == 0) return(num); | 243 | if (i == 0) return(num); |
| 244 | } | 244 | } |
| 245 | #ifdef DEBUG | 245 | #if 0 |
| 246 | BIO_write(b->next_bio, ">*>", 3); | 246 | BIO_write(b->next_bio, ">*>", 3); |
| 247 | #endif | 247 | #endif |
| 248 | num+=i; | 248 | num+=i; |
diff --git a/src/lib/libcrypto/bio/bf_nbio.c b/src/lib/libcrypto/bio/bf_nbio.c index 034b3024df..1ce2bfacc0 100644 --- a/src/lib/libcrypto/bio/bf_nbio.c +++ b/src/lib/libcrypto/bio/bf_nbio.c | |||
| @@ -59,31 +59,20 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include "rand.h" | 62 | #include <openssl/rand.h> |
| 63 | #include "bio.h" | 63 | #include <openssl/bio.h> |
| 64 | #include "evp.h" | ||
| 65 | 64 | ||
| 66 | /* BIO_put and BIO_get both add to the digest, | 65 | /* BIO_put and BIO_get both add to the digest, |
| 67 | * BIO_gets returns the digest */ | 66 | * BIO_gets returns the digest */ |
| 68 | 67 | ||
| 69 | #ifndef NOPROTO | 68 | static int nbiof_write(BIO *h,const char *buf,int num); |
| 70 | static int nbiof_write(BIO *h,char *buf,int num); | ||
| 71 | static int nbiof_read(BIO *h,char *buf,int size); | 69 | static int nbiof_read(BIO *h,char *buf,int size); |
| 72 | static int nbiof_puts(BIO *h,char *str); | 70 | static int nbiof_puts(BIO *h,const char *str); |
| 73 | static int nbiof_gets(BIO *h,char *str,int size); | 71 | static int nbiof_gets(BIO *h,char *str,int size); |
| 74 | static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 72 | static long nbiof_ctrl(BIO *h,int cmd,long arg1,void *arg2); |
| 75 | static int nbiof_new(BIO *h); | 73 | static int nbiof_new(BIO *h); |
| 76 | static int nbiof_free(BIO *data); | 74 | static int nbiof_free(BIO *data); |
| 77 | #else | 75 | static long nbiof_callback_ctrl(BIO *h,int cmd,bio_info_cb *fp); |
| 78 | static int nbiof_write(); | ||
| 79 | static int nbiof_read(); | ||
| 80 | static int nbiof_puts(); | ||
| 81 | static int nbiof_gets(); | ||
| 82 | static long nbiof_ctrl(); | ||
| 83 | static int nbiof_new(); | ||
| 84 | static int nbiof_free(); | ||
| 85 | #endif | ||
| 86 | |||
| 87 | typedef struct nbio_test_st | 76 | typedef struct nbio_test_st |
| 88 | { | 77 | { |
| 89 | /* only set if we sent a 'should retry' error */ | 78 | /* only set if we sent a 'should retry' error */ |
| @@ -102,19 +91,19 @@ static BIO_METHOD methods_nbiof= | |||
| 102 | nbiof_ctrl, | 91 | nbiof_ctrl, |
| 103 | nbiof_new, | 92 | nbiof_new, |
| 104 | nbiof_free, | 93 | nbiof_free, |
| 94 | nbiof_callback_ctrl, | ||
| 105 | }; | 95 | }; |
| 106 | 96 | ||
| 107 | BIO_METHOD *BIO_f_nbio_test() | 97 | BIO_METHOD *BIO_f_nbio_test(void) |
| 108 | { | 98 | { |
| 109 | return(&methods_nbiof); | 99 | return(&methods_nbiof); |
| 110 | } | 100 | } |
| 111 | 101 | ||
| 112 | static int nbiof_new(bi) | 102 | static int nbiof_new(BIO *bi) |
| 113 | BIO *bi; | ||
| 114 | { | 103 | { |
| 115 | NBIO_TEST *nt; | 104 | NBIO_TEST *nt; |
| 116 | 105 | ||
| 117 | nt=(NBIO_TEST *)Malloc(sizeof(NBIO_TEST)); | 106 | if (!(nt=(NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) return(0); |
| 118 | nt->lrn= -1; | 107 | nt->lrn= -1; |
| 119 | nt->lwn= -1; | 108 | nt->lwn= -1; |
| 120 | bi->ptr=(char *)nt; | 109 | bi->ptr=(char *)nt; |
| @@ -123,22 +112,18 @@ BIO *bi; | |||
| 123 | return(1); | 112 | return(1); |
| 124 | } | 113 | } |
| 125 | 114 | ||
| 126 | static int nbiof_free(a) | 115 | static int nbiof_free(BIO *a) |
| 127 | BIO *a; | ||
| 128 | { | 116 | { |
| 129 | if (a == NULL) return(0); | 117 | if (a == NULL) return(0); |
| 130 | if (a->ptr != NULL) | 118 | if (a->ptr != NULL) |
| 131 | Free(a->ptr); | 119 | OPENSSL_free(a->ptr); |
| 132 | a->ptr=NULL; | 120 | a->ptr=NULL; |
| 133 | a->init=0; | 121 | a->init=0; |
| 134 | a->flags=0; | 122 | a->flags=0; |
| 135 | return(1); | 123 | return(1); |
| 136 | } | 124 | } |
| 137 | 125 | ||
| 138 | static int nbiof_read(b,out,outl) | 126 | static int nbiof_read(BIO *b, char *out, int outl) |
| 139 | BIO *b; | ||
| 140 | char *out; | ||
| 141 | int outl; | ||
| 142 | { | 127 | { |
| 143 | NBIO_TEST *nt; | 128 | NBIO_TEST *nt; |
| 144 | int ret=0; | 129 | int ret=0; |
| @@ -153,7 +138,7 @@ int outl; | |||
| 153 | 138 | ||
| 154 | BIO_clear_retry_flags(b); | 139 | BIO_clear_retry_flags(b); |
| 155 | #if 0 | 140 | #if 0 |
| 156 | RAND_bytes(&n,1); | 141 | RAND_pseudo_bytes(&n,1); |
| 157 | num=(n&0x07); | 142 | num=(n&0x07); |
| 158 | 143 | ||
| 159 | if (outl > num) outl=num; | 144 | if (outl > num) outl=num; |
| @@ -173,10 +158,7 @@ int outl; | |||
| 173 | return(ret); | 158 | return(ret); |
| 174 | } | 159 | } |
| 175 | 160 | ||
| 176 | static int nbiof_write(b,in,inl) | 161 | static int nbiof_write(BIO *b, const char *in, int inl) |
| 177 | BIO *b; | ||
| 178 | char *in; | ||
| 179 | int inl; | ||
| 180 | { | 162 | { |
| 181 | NBIO_TEST *nt; | 163 | NBIO_TEST *nt; |
| 182 | int ret=0; | 164 | int ret=0; |
| @@ -197,7 +179,7 @@ int inl; | |||
| 197 | } | 179 | } |
| 198 | else | 180 | else |
| 199 | { | 181 | { |
| 200 | RAND_bytes(&n,1); | 182 | RAND_pseudo_bytes(&n,1); |
| 201 | num=(n&7); | 183 | num=(n&7); |
| 202 | } | 184 | } |
| 203 | 185 | ||
| @@ -221,11 +203,7 @@ int inl; | |||
| 221 | return(ret); | 203 | return(ret); |
| 222 | } | 204 | } |
| 223 | 205 | ||
| 224 | static long nbiof_ctrl(b,cmd,num,ptr) | 206 | static long nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 225 | BIO *b; | ||
| 226 | int cmd; | ||
| 227 | long num; | ||
| 228 | char *ptr; | ||
| 229 | { | 207 | { |
| 230 | long ret; | 208 | long ret; |
| 231 | 209 | ||
| @@ -247,19 +225,28 @@ char *ptr; | |||
| 247 | return(ret); | 225 | return(ret); |
| 248 | } | 226 | } |
| 249 | 227 | ||
| 250 | static int nbiof_gets(bp,buf,size) | 228 | static long nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 251 | BIO *bp; | 229 | { |
| 252 | char *buf; | 230 | long ret=1; |
| 253 | int size; | 231 | |
| 232 | if (b->next_bio == NULL) return(0); | ||
| 233 | switch (cmd) | ||
| 234 | { | ||
| 235 | default: | ||
| 236 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
| 237 | break; | ||
| 238 | } | ||
| 239 | return(ret); | ||
| 240 | } | ||
| 241 | |||
| 242 | static int nbiof_gets(BIO *bp, char *buf, int size) | ||
| 254 | { | 243 | { |
| 255 | if (bp->next_bio == NULL) return(0); | 244 | if (bp->next_bio == NULL) return(0); |
| 256 | return(BIO_gets(bp->next_bio,buf,size)); | 245 | return(BIO_gets(bp->next_bio,buf,size)); |
| 257 | } | 246 | } |
| 258 | 247 | ||
| 259 | 248 | ||
| 260 | static int nbiof_puts(bp,str) | 249 | static int nbiof_puts(BIO *bp, const char *str) |
| 261 | BIO *bp; | ||
| 262 | char *str; | ||
| 263 | { | 250 | { |
| 264 | if (bp->next_bio == NULL) return(0); | 251 | if (bp->next_bio == NULL) return(0); |
| 265 | return(BIO_puts(bp->next_bio,str)); | 252 | return(BIO_puts(bp->next_bio,str)); |
diff --git a/src/lib/libcrypto/bio/bf_null.c b/src/lib/libcrypto/bio/bf_null.c index a47a65741a..c1bf39a904 100644 --- a/src/lib/libcrypto/bio/bf_null.c +++ b/src/lib/libcrypto/bio/bf_null.c | |||
| @@ -59,30 +59,19 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include "bio.h" | 62 | #include <openssl/bio.h> |
| 63 | #include "evp.h" | ||
| 64 | 63 | ||
| 65 | /* BIO_put and BIO_get both add to the digest, | 64 | /* BIO_put and BIO_get both add to the digest, |
| 66 | * BIO_gets returns the digest */ | 65 | * BIO_gets returns the digest */ |
| 67 | 66 | ||
| 68 | #ifndef NOPROTO | 67 | static int nullf_write(BIO *h, const char *buf, int num); |
| 69 | static int nullf_write(BIO *h,char *buf,int num); | 68 | static int nullf_read(BIO *h, char *buf, int size); |
| 70 | static int nullf_read(BIO *h,char *buf,int size); | 69 | static int nullf_puts(BIO *h, const char *str); |
| 71 | static int nullf_puts(BIO *h,char *str); | 70 | static int nullf_gets(BIO *h, char *str, int size); |
| 72 | static int nullf_gets(BIO *h,char *str,int size); | 71 | static long nullf_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 73 | static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 74 | static int nullf_new(BIO *h); | 72 | static int nullf_new(BIO *h); |
| 75 | static int nullf_free(BIO *data); | 73 | static int nullf_free(BIO *data); |
| 76 | #else | 74 | static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 77 | static int nullf_write(); | ||
| 78 | static int nullf_read(); | ||
| 79 | static int nullf_puts(); | ||
| 80 | static int nullf_gets(); | ||
| 81 | static long nullf_ctrl(); | ||
| 82 | static int nullf_new(); | ||
| 83 | static int nullf_free(); | ||
| 84 | #endif | ||
| 85 | |||
| 86 | static BIO_METHOD methods_nullf= | 75 | static BIO_METHOD methods_nullf= |
| 87 | { | 76 | { |
| 88 | BIO_TYPE_NULL_FILTER, | 77 | BIO_TYPE_NULL_FILTER, |
| @@ -94,15 +83,15 @@ static BIO_METHOD methods_nullf= | |||
| 94 | nullf_ctrl, | 83 | nullf_ctrl, |
| 95 | nullf_new, | 84 | nullf_new, |
| 96 | nullf_free, | 85 | nullf_free, |
| 86 | nullf_callback_ctrl, | ||
| 97 | }; | 87 | }; |
| 98 | 88 | ||
| 99 | BIO_METHOD *BIO_f_null() | 89 | BIO_METHOD *BIO_f_null(void) |
| 100 | { | 90 | { |
| 101 | return(&methods_nullf); | 91 | return(&methods_nullf); |
| 102 | } | 92 | } |
| 103 | 93 | ||
| 104 | static int nullf_new(bi) | 94 | static int nullf_new(BIO *bi) |
| 105 | BIO *bi; | ||
| 106 | { | 95 | { |
| 107 | bi->init=1; | 96 | bi->init=1; |
| 108 | bi->ptr=NULL; | 97 | bi->ptr=NULL; |
| @@ -110,8 +99,7 @@ BIO *bi; | |||
| 110 | return(1); | 99 | return(1); |
| 111 | } | 100 | } |
| 112 | 101 | ||
| 113 | static int nullf_free(a) | 102 | static int nullf_free(BIO *a) |
| 114 | BIO *a; | ||
| 115 | { | 103 | { |
| 116 | if (a == NULL) return(0); | 104 | if (a == NULL) return(0); |
| 117 | /* a->ptr=NULL; | 105 | /* a->ptr=NULL; |
| @@ -120,10 +108,7 @@ BIO *a; | |||
| 120 | return(1); | 108 | return(1); |
| 121 | } | 109 | } |
| 122 | 110 | ||
| 123 | static int nullf_read(b,out,outl) | 111 | static int nullf_read(BIO *b, char *out, int outl) |
| 124 | BIO *b; | ||
| 125 | char *out; | ||
| 126 | int outl; | ||
| 127 | { | 112 | { |
| 128 | int ret=0; | 113 | int ret=0; |
| 129 | 114 | ||
| @@ -135,10 +120,7 @@ int outl; | |||
| 135 | return(ret); | 120 | return(ret); |
| 136 | } | 121 | } |
| 137 | 122 | ||
| 138 | static int nullf_write(b,in,inl) | 123 | static int nullf_write(BIO *b, const char *in, int inl) |
| 139 | BIO *b; | ||
| 140 | char *in; | ||
| 141 | int inl; | ||
| 142 | { | 124 | { |
| 143 | int ret=0; | 125 | int ret=0; |
| 144 | 126 | ||
| @@ -150,11 +132,7 @@ int inl; | |||
| 150 | return(ret); | 132 | return(ret); |
| 151 | } | 133 | } |
| 152 | 134 | ||
| 153 | static long nullf_ctrl(b,cmd,num,ptr) | 135 | static long nullf_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 154 | BIO *b; | ||
| 155 | int cmd; | ||
| 156 | long num; | ||
| 157 | char *ptr; | ||
| 158 | { | 136 | { |
| 159 | long ret; | 137 | long ret; |
| 160 | 138 | ||
| @@ -175,19 +153,28 @@ char *ptr; | |||
| 175 | return(ret); | 153 | return(ret); |
| 176 | } | 154 | } |
| 177 | 155 | ||
| 178 | static int nullf_gets(bp,buf,size) | 156 | static long nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 179 | BIO *bp; | 157 | { |
| 180 | char *buf; | 158 | long ret=1; |
| 181 | int size; | 159 | |
| 160 | if (b->next_bio == NULL) return(0); | ||
| 161 | switch (cmd) | ||
| 162 | { | ||
| 163 | default: | ||
| 164 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
| 165 | break; | ||
| 166 | } | ||
| 167 | return(ret); | ||
| 168 | } | ||
| 169 | |||
| 170 | static int nullf_gets(BIO *bp, char *buf, int size) | ||
| 182 | { | 171 | { |
| 183 | if (bp->next_bio == NULL) return(0); | 172 | if (bp->next_bio == NULL) return(0); |
| 184 | return(BIO_gets(bp->next_bio,buf,size)); | 173 | return(BIO_gets(bp->next_bio,buf,size)); |
| 185 | } | 174 | } |
| 186 | 175 | ||
| 187 | 176 | ||
| 188 | static int nullf_puts(bp,str) | 177 | static int nullf_puts(BIO *bp, const char *str) |
| 189 | BIO *bp; | ||
| 190 | char *str; | ||
| 191 | { | 178 | { |
| 192 | if (bp->next_bio == NULL) return(0); | 179 | if (bp->next_bio == NULL) return(0); |
| 193 | return(BIO_puts(bp->next_bio,str)); | 180 | return(BIO_puts(bp->next_bio,str)); |
diff --git a/src/lib/libcrypto/bio/bio.h b/src/lib/libcrypto/bio/bio.h index 300b330e00..b122c7069d 100644 --- a/src/lib/libcrypto/bio/bio.h +++ b/src/lib/libcrypto/bio/bio.h | |||
| @@ -59,12 +59,18 @@ | |||
| 59 | #ifndef HEADER_BIO_H | 59 | #ifndef HEADER_BIO_H |
| 60 | #define HEADER_BIO_H | 60 | #define HEADER_BIO_H |
| 61 | 61 | ||
| 62 | #ifndef OPENSSL_NO_FP_API | ||
| 63 | # include <stdio.h> | ||
| 64 | #endif | ||
| 65 | #include <stdarg.h> | ||
| 66 | |||
| 67 | #include <openssl/crypto.h> | ||
| 68 | #include <openssl/e_os2.h> | ||
| 69 | |||
| 62 | #ifdef __cplusplus | 70 | #ifdef __cplusplus |
| 63 | extern "C" { | 71 | extern "C" { |
| 64 | #endif | 72 | #endif |
| 65 | 73 | ||
| 66 | #include "crypto.h" | ||
| 67 | |||
| 68 | /* These are the 'types' of BIOs */ | 74 | /* These are the 'types' of BIOs */ |
| 69 | #define BIO_TYPE_NONE 0 | 75 | #define BIO_TYPE_NONE 0 |
| 70 | #define BIO_TYPE_MEM (1|0x0400) | 76 | #define BIO_TYPE_MEM (1|0x0400) |
| @@ -74,7 +80,7 @@ extern "C" { | |||
| 74 | #define BIO_TYPE_SOCKET (5|0x0400|0x0100) | 80 | #define BIO_TYPE_SOCKET (5|0x0400|0x0100) |
| 75 | #define BIO_TYPE_NULL (6|0x0400) | 81 | #define BIO_TYPE_NULL (6|0x0400) |
| 76 | #define BIO_TYPE_SSL (7|0x0200) | 82 | #define BIO_TYPE_SSL (7|0x0200) |
| 77 | #define BIO_TYPE_MD (8|0x0200) /* pasive filter */ | 83 | #define BIO_TYPE_MD (8|0x0200) /* passive filter */ |
| 78 | #define BIO_TYPE_BUFFER (9|0x0200) /* filter */ | 84 | #define BIO_TYPE_BUFFER (9|0x0200) /* filter */ |
| 79 | #define BIO_TYPE_CIPHER (10|0x0200) /* filter */ | 85 | #define BIO_TYPE_CIPHER (10|0x0200) /* filter */ |
| 80 | #define BIO_TYPE_BASE64 (11|0x0200) /* filter */ | 86 | #define BIO_TYPE_BASE64 (11|0x0200) /* filter */ |
| @@ -84,6 +90,9 @@ extern "C" { | |||
| 84 | #define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */ | 90 | #define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */ |
| 85 | #define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */ | 91 | #define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */ |
| 86 | #define BIO_TYPE_NULL_FILTER (17|0x0200) | 92 | #define BIO_TYPE_NULL_FILTER (17|0x0200) |
| 93 | #define BIO_TYPE_BER (18|0x0200) /* BER -> bin filter */ | ||
| 94 | #define BIO_TYPE_BIO (19|0x0400) /* (half a) BIO pair */ | ||
| 95 | #define BIO_TYPE_LINEBUFFER (20|0x0200) /* filter */ | ||
| 87 | 96 | ||
| 88 | #define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ | 97 | #define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ |
| 89 | #define BIO_TYPE_FILTER 0x0200 | 98 | #define BIO_TYPE_FILTER 0x0200 |
| @@ -143,6 +152,11 @@ extern "C" { | |||
| 143 | 152 | ||
| 144 | #define BIO_FLAGS_BASE64_NO_NL 0x100 | 153 | #define BIO_FLAGS_BASE64_NO_NL 0x100 |
| 145 | 154 | ||
| 155 | /* This is used with memory BIOs: it means we shouldn't free up or change the | ||
| 156 | * data in any way. | ||
| 157 | */ | ||
| 158 | #define BIO_FLAGS_MEM_RDONLY 0x200 | ||
| 159 | |||
| 146 | #define BIO_set_flags(b,f) ((b)->flags|=(f)) | 160 | #define BIO_set_flags(b,f) ((b)->flags|=(f)) |
| 147 | #define BIO_get_flags(b) ((b)->flags) | 161 | #define BIO_get_flags(b) ((b)->flags) |
| 148 | #define BIO_set_retry_special(b) \ | 162 | #define BIO_set_retry_special(b) \ |
| @@ -159,14 +173,14 @@ extern "C" { | |||
| 159 | #define BIO_get_retry_flags(b) \ | 173 | #define BIO_get_retry_flags(b) \ |
| 160 | ((b)->flags&(BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) | 174 | ((b)->flags&(BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) |
| 161 | 175 | ||
| 162 | /* These shouldbe used by the application to tell why we should retry */ | 176 | /* These should be used by the application to tell why we should retry */ |
| 163 | #define BIO_should_read(a) ((a)->flags & BIO_FLAGS_READ) | 177 | #define BIO_should_read(a) ((a)->flags & BIO_FLAGS_READ) |
| 164 | #define BIO_should_write(a) ((a)->flags & BIO_FLAGS_WRITE) | 178 | #define BIO_should_write(a) ((a)->flags & BIO_FLAGS_WRITE) |
| 165 | #define BIO_should_io_special(a) ((a)->flags & BIO_FLAGS_IO_SPECIAL) | 179 | #define BIO_should_io_special(a) ((a)->flags & BIO_FLAGS_IO_SPECIAL) |
| 166 | #define BIO_retry_type(a) ((a)->flags & BIO_FLAGS_RWS) | 180 | #define BIO_retry_type(a) ((a)->flags & BIO_FLAGS_RWS) |
| 167 | #define BIO_should_retry(a) ((a)->flags & BIO_FLAGS_SHOULD_RETRY) | 181 | #define BIO_should_retry(a) ((a)->flags & BIO_FLAGS_SHOULD_RETRY) |
| 168 | 182 | ||
| 169 | /* The next two are used in conjunction with the | 183 | /* The next three are used in conjunction with the |
| 170 | * BIO_should_io_special() condition. After this returns true, | 184 | * BIO_should_io_special() condition. After this returns true, |
| 171 | * BIO *BIO_get_retry_BIO(BIO *bio, int *reason); will walk the BIO | 185 | * BIO *BIO_get_retry_BIO(BIO *bio, int *reason); will walk the BIO |
| 172 | * stack and return the 'reason' for the special and the offending BIO. | 186 | * stack and return the 'reason' for the special and the offending BIO. |
| @@ -175,6 +189,8 @@ extern "C" { | |||
| 175 | #define BIO_RR_SSL_X509_LOOKUP 0x01 | 189 | #define BIO_RR_SSL_X509_LOOKUP 0x01 |
| 176 | /* Returned from the connect BIO when a connect would have blocked */ | 190 | /* Returned from the connect BIO when a connect would have blocked */ |
| 177 | #define BIO_RR_CONNECT 0x02 | 191 | #define BIO_RR_CONNECT 0x02 |
| 192 | /* Returned from the accept BIO when an accept would have blocked */ | ||
| 193 | #define BIO_RR_ACCEPT 0x03 | ||
| 178 | 194 | ||
| 179 | /* These are passed by the BIO callback */ | 195 | /* These are passed by the BIO callback */ |
| 180 | #define BIO_CB_FREE 0x01 | 196 | #define BIO_CB_FREE 0x01 |
| @@ -198,24 +214,29 @@ extern "C" { | |||
| 198 | #define BIO_method_name(b) ((b)->method->name) | 214 | #define BIO_method_name(b) ((b)->method->name) |
| 199 | #define BIO_method_type(b) ((b)->method->type) | 215 | #define BIO_method_type(b) ((b)->method->type) |
| 200 | 216 | ||
| 201 | #ifndef WIN16 | 217 | typedef struct bio_st BIO; |
| 218 | |||
| 219 | typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); | ||
| 220 | |||
| 221 | #ifndef OPENSSL_SYS_WIN16 | ||
| 202 | typedef struct bio_method_st | 222 | typedef struct bio_method_st |
| 203 | { | 223 | { |
| 204 | int type; | 224 | int type; |
| 205 | char *name; | 225 | const char *name; |
| 206 | int (*bwrite)(); | 226 | int (*bwrite)(BIO *, const char *, int); |
| 207 | int (*bread)(); | 227 | int (*bread)(BIO *, char *, int); |
| 208 | int (*bputs)(); | 228 | int (*bputs)(BIO *, const char *); |
| 209 | int (*bgets)(); | 229 | int (*bgets)(BIO *, char *, int); |
| 210 | long (*ctrl)(); | 230 | long (*ctrl)(BIO *, int, long, void *); |
| 211 | int (*create)(); | 231 | int (*create)(BIO *); |
| 212 | int (*destroy)(); | 232 | int (*destroy)(BIO *); |
| 233 | long (*callback_ctrl)(BIO *, int, bio_info_cb *); | ||
| 213 | } BIO_METHOD; | 234 | } BIO_METHOD; |
| 214 | #else | 235 | #else |
| 215 | typedef struct bio_method_st | 236 | typedef struct bio_method_st |
| 216 | { | 237 | { |
| 217 | int type; | 238 | int type; |
| 218 | char *name; | 239 | const char *name; |
| 219 | int (_far *bwrite)(); | 240 | int (_far *bwrite)(); |
| 220 | int (_far *bread)(); | 241 | int (_far *bread)(); |
| 221 | int (_far *bputs)(); | 242 | int (_far *bputs)(); |
| @@ -223,18 +244,15 @@ typedef struct bio_method_st | |||
| 223 | long (_far *ctrl)(); | 244 | long (_far *ctrl)(); |
| 224 | int (_far *create)(); | 245 | int (_far *create)(); |
| 225 | int (_far *destroy)(); | 246 | int (_far *destroy)(); |
| 247 | long (_fat *callback_ctrl)(); | ||
| 226 | } BIO_METHOD; | 248 | } BIO_METHOD; |
| 227 | #endif | 249 | #endif |
| 228 | 250 | ||
| 229 | typedef struct bio_st | 251 | struct bio_st |
| 230 | { | 252 | { |
| 231 | BIO_METHOD *method; | 253 | BIO_METHOD *method; |
| 232 | #ifndef NOPROTO | ||
| 233 | /* bio, mode, argp, argi, argl, ret */ | 254 | /* bio, mode, argp, argi, argl, ret */ |
| 234 | long (*callback)(struct bio_st *,int,char *,int, long,long); | 255 | long (*callback)(struct bio_st *,int,const char *,int, long,long); |
| 235 | #else | ||
| 236 | long (*callback)(); | ||
| 237 | #endif | ||
| 238 | char *cb_arg; /* first argument for the callback */ | 256 | char *cb_arg; /* first argument for the callback */ |
| 239 | 257 | ||
| 240 | int init; | 258 | int init; |
| @@ -242,7 +260,7 @@ typedef struct bio_st | |||
| 242 | int flags; /* extra storage */ | 260 | int flags; /* extra storage */ |
| 243 | int retry_reason; | 261 | int retry_reason; |
| 244 | int num; | 262 | int num; |
| 245 | char *ptr; | 263 | void *ptr; |
| 246 | struct bio_st *next_bio; /* used by filter BIOs */ | 264 | struct bio_st *next_bio; /* used by filter BIOs */ |
| 247 | struct bio_st *prev_bio; /* used by filter BIOs */ | 265 | struct bio_st *prev_bio; /* used by filter BIOs */ |
| 248 | int references; | 266 | int references; |
| @@ -250,7 +268,9 @@ typedef struct bio_st | |||
| 250 | unsigned long num_write; | 268 | unsigned long num_write; |
| 251 | 269 | ||
| 252 | CRYPTO_EX_DATA ex_data; | 270 | CRYPTO_EX_DATA ex_data; |
| 253 | } BIO; | 271 | }; |
| 272 | |||
| 273 | DECLARE_STACK_OF(BIO) | ||
| 254 | 274 | ||
| 255 | typedef struct bio_f_buffer_ctx_struct | 275 | typedef struct bio_f_buffer_ctx_struct |
| 256 | { | 276 | { |
| @@ -276,10 +296,7 @@ typedef struct bio_f_buffer_ctx_struct | |||
| 276 | #define BIO_CONN_S_OK 6 | 296 | #define BIO_CONN_S_OK 6 |
| 277 | #define BIO_CONN_S_BLOCKED_CONNECT 7 | 297 | #define BIO_CONN_S_BLOCKED_CONNECT 7 |
| 278 | #define BIO_CONN_S_NBIO 8 | 298 | #define BIO_CONN_S_NBIO 8 |
| 279 | #define BIO_CONN_get_param_hostname BIO_ctrl | 299 | /*#define BIO_CONN_get_param_hostname BIO_ctrl */ |
| 280 | |||
| 281 | #define BIO_number_read(b) ((b)->num_read) | ||
| 282 | #define BIO_number_written(b) ((b)->num_write) | ||
| 283 | 300 | ||
| 284 | #define BIO_C_SET_CONNECT 100 | 301 | #define BIO_C_SET_CONNECT 100 |
| 285 | #define BIO_C_DO_STATE_MACHINE 101 | 302 | #define BIO_C_DO_STATE_MACHINE 101 |
| @@ -309,26 +326,42 @@ typedef struct bio_f_buffer_ctx_struct | |||
| 309 | #define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 | 326 | #define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 |
| 310 | #define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 | 327 | #define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 |
| 311 | #define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 | 328 | #define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 |
| 312 | 329 | #define BIO_C_FILE_SEEK 128 | |
| 313 | #define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,(char *)arg) | 330 | #define BIO_C_GET_CIPHER_CTX 129 |
| 331 | #define BIO_C_SET_BUF_MEM_EOF_RETURN 130/*return end of input value*/ | ||
| 332 | #define BIO_C_SET_BIND_MODE 131 | ||
| 333 | #define BIO_C_GET_BIND_MODE 132 | ||
| 334 | #define BIO_C_FILE_TELL 133 | ||
| 335 | #define BIO_C_GET_SOCKS 134 | ||
| 336 | #define BIO_C_SET_SOCKS 135 | ||
| 337 | |||
| 338 | #define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ | ||
| 339 | #define BIO_C_GET_WRITE_BUF_SIZE 137 | ||
| 340 | #define BIO_C_MAKE_BIO_PAIR 138 | ||
| 341 | #define BIO_C_DESTROY_BIO_PAIR 139 | ||
| 342 | #define BIO_C_GET_WRITE_GUARANTEE 140 | ||
| 343 | #define BIO_C_GET_READ_REQUEST 141 | ||
| 344 | #define BIO_C_SHUTDOWN_WR 142 | ||
| 345 | #define BIO_C_NREAD0 143 | ||
| 346 | #define BIO_C_NREAD 144 | ||
| 347 | #define BIO_C_NWRITE0 145 | ||
| 348 | #define BIO_C_NWRITE 146 | ||
| 349 | #define BIO_C_RESET_READ_REQUEST 147 | ||
| 350 | |||
| 351 | |||
| 352 | #define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) | ||
| 314 | #define BIO_get_app_data(s) BIO_get_ex_data(s,0) | 353 | #define BIO_get_app_data(s) BIO_get_ex_data(s,0) |
| 315 | 354 | ||
| 316 | int BIO_get_ex_num(BIO *bio); | 355 | /* BIO_s_connect() and BIO_s_socks4a_connect() */ |
| 317 | int BIO_set_ex_data(BIO *bio,int idx,char *data); | ||
| 318 | char *BIO_get_ex_data(BIO *bio,int idx); | ||
| 319 | void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); | ||
| 320 | int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | ||
| 321 | int (*dup_func)(), void (*free_func)()); | ||
| 322 | |||
| 323 | /* BIO_s_connect_socket() */ | ||
| 324 | #define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) | 356 | #define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) |
| 325 | #define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) | 357 | #define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) |
| 326 | #define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) | 358 | #define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) |
| 327 | #define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) | 359 | #define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) |
| 328 | #define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) | 360 | #define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) |
| 329 | #define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) | 361 | #define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) |
| 330 | #define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2) | 362 | #define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) |
| 331 | #define BIO_get_conn_int port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port) | 363 | #define BIO_get_conn_int_port(b) BIO_int_ctrl(b,BIO_C_GET_CONNECT,3) |
| 364 | |||
| 332 | 365 | ||
| 333 | #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) | 366 | #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) |
| 334 | 367 | ||
| @@ -339,6 +372,12 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | |||
| 339 | #define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL) | 372 | #define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL) |
| 340 | #define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) | 373 | #define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) |
| 341 | 374 | ||
| 375 | #define BIO_BIND_NORMAL 0 | ||
| 376 | #define BIO_BIND_REUSEADDR_IF_UNUSED 1 | ||
| 377 | #define BIO_BIND_REUSEADDR 2 | ||
| 378 | #define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) | ||
| 379 | #define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) | ||
| 380 | |||
| 342 | #define BIO_do_connect(b) BIO_do_handshake(b) | 381 | #define BIO_do_connect(b) BIO_do_handshake(b) |
| 343 | #define BIO_do_accept(b) BIO_do_handshake(b) | 382 | #define BIO_do_accept(b) BIO_do_handshake(b) |
| 344 | #define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) | 383 | #define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) |
| @@ -349,7 +388,7 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | |||
| 349 | /* BIO_set_nbio(b,n) */ | 388 | /* BIO_set_nbio(b,n) */ |
| 350 | #define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) | 389 | #define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) |
| 351 | /* BIO *BIO_get_filter_bio(BIO *bio); */ | 390 | /* BIO *BIO_get_filter_bio(BIO *bio); */ |
| 352 | #define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb)) | 391 | #define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) |
| 353 | #define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) | 392 | #define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) |
| 354 | #define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) | 393 | #define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) |
| 355 | 394 | ||
| @@ -364,12 +403,26 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | |||
| 364 | #define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) | 403 | #define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) |
| 365 | #define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) | 404 | #define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) |
| 366 | 405 | ||
| 406 | #define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) | ||
| 407 | #define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) | ||
| 408 | |||
| 409 | /* name is cast to lose const, but might be better to route through a function | ||
| 410 | so we can do it safely */ | ||
| 411 | #ifdef CONST_STRICT | ||
| 412 | /* If you are wondering why this isn't defined, its because CONST_STRICT is | ||
| 413 | * purely a compile-time kludge to allow const to be checked. | ||
| 414 | */ | ||
| 415 | int BIO_read_filename(BIO *b,const char *name); | ||
| 416 | #else | ||
| 367 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | 417 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ |
| 368 | BIO_CLOSE|BIO_FP_READ,name) | 418 | BIO_CLOSE|BIO_FP_READ,(char *)name) |
| 419 | #endif | ||
| 369 | #define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | 420 | #define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ |
| 370 | BIO_CLOSE|BIO_FP_WRITE,name) | 421 | BIO_CLOSE|BIO_FP_WRITE,name) |
| 371 | #define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | 422 | #define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ |
| 372 | BIO_CLOSE|BIO_FP_APPEND,name) | 423 | BIO_CLOSE|BIO_FP_APPEND,name) |
| 424 | #define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | ||
| 425 | BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) | ||
| 373 | 426 | ||
| 374 | /* WARNING WARNING, this ups the reference count on the read bio of the | 427 | /* WARNING WARNING, this ups the reference count on the read bio of the |
| 375 | * SSL structure. This is because the ssl read BIO is now pointed to by | 428 | * SSL structure. This is because the ssl read BIO is now pointed to by |
| @@ -381,15 +434,18 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | |||
| 381 | #define BIO_set_ssl_renegotiate_bytes(b,num) \ | 434 | #define BIO_set_ssl_renegotiate_bytes(b,num) \ |
| 382 | BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); | 435 | BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); |
| 383 | #define BIO_get_num_renegotiates(b) \ | 436 | #define BIO_get_num_renegotiates(b) \ |
| 384 | BIO_ctrl(b,BIO_C_SET_SSL_NUM_RENEGOTIATES,0,NULL); | 437 | BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL); |
| 385 | #define BIO_set_ssl_renegotiate_timeout(b,seconds) \ | 438 | #define BIO_set_ssl_renegotiate_timeout(b,seconds) \ |
| 386 | BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); | 439 | BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); |
| 387 | 440 | ||
| 388 | /* defined in evp.h */ | 441 | /* defined in evp.h */ |
| 389 | /* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ | 442 | /* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ |
| 390 | 443 | ||
| 444 | #define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) | ||
| 391 | #define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) | 445 | #define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) |
| 392 | #define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) | 446 | #define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) |
| 447 | #define BIO_set_mem_eof_return(b,v) \ | ||
| 448 | BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) | ||
| 393 | 449 | ||
| 394 | /* For the BIO_f_buffer() type */ | 450 | /* For the BIO_f_buffer() type */ |
| 395 | #define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) | 451 | #define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) |
| @@ -407,19 +463,42 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), | |||
| 407 | #define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) | 463 | #define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) |
| 408 | #define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) | 464 | #define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) |
| 409 | #define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) | 465 | #define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) |
| 466 | /* ...pending macros have inappropriate return type */ | ||
| 467 | size_t BIO_ctrl_pending(BIO *b); | ||
| 468 | size_t BIO_ctrl_wpending(BIO *b); | ||
| 410 | #define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) | 469 | #define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) |
| 411 | #define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp) | 470 | #define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ |
| 412 | #define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb) | 471 | cbp) |
| 472 | #define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) | ||
| 413 | 473 | ||
| 414 | /* For the BIO_f_buffer() type */ | 474 | /* For the BIO_f_buffer() type */ |
| 415 | #define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) | 475 | #define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) |
| 416 | 476 | ||
| 417 | #ifdef NO_STDIO | 477 | /* For BIO_s_bio() */ |
| 418 | #define NO_FP_API | 478 | #define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) |
| 419 | #endif | 479 | #define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) |
| 420 | 480 | #define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) | |
| 421 | #ifndef NOPROTO | 481 | #define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) |
| 422 | # if defined(WIN16) && defined(_WINDLL) | 482 | #define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) |
| 483 | /* macros with inappropriate type -- but ...pending macros use int too: */ | ||
| 484 | #define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) | ||
| 485 | #define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) | ||
| 486 | size_t BIO_ctrl_get_write_guarantee(BIO *b); | ||
| 487 | size_t BIO_ctrl_get_read_request(BIO *b); | ||
| 488 | int BIO_ctrl_reset_read_request(BIO *b); | ||
| 489 | |||
| 490 | /* These two aren't currently implemented */ | ||
| 491 | /* int BIO_get_ex_num(BIO *bio); */ | ||
| 492 | /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ | ||
| 493 | int BIO_set_ex_data(BIO *bio,int idx,void *data); | ||
| 494 | void *BIO_get_ex_data(BIO *bio,int idx); | ||
| 495 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
| 496 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); | ||
| 497 | unsigned long BIO_number_read(BIO *bio); | ||
| 498 | unsigned long BIO_number_written(BIO *bio); | ||
| 499 | |||
| 500 | # ifndef OPENSSL_NO_FP_API | ||
| 501 | # if defined(OPENSSL_SYS_WIN16) && defined(_WINDLL) | ||
| 423 | BIO_METHOD *BIO_s_file_internal(void); | 502 | BIO_METHOD *BIO_s_file_internal(void); |
| 424 | BIO *BIO_new_file_internal(char *filename, char *mode); | 503 | BIO *BIO_new_file_internal(char *filename, char *mode); |
| 425 | BIO *BIO_new_fp_internal(FILE *stream, int close_flag); | 504 | BIO *BIO_new_fp_internal(FILE *stream, int close_flag); |
| @@ -428,261 +507,184 @@ BIO *BIO_new_fp_internal(FILE *stream, int close_flag); | |||
| 428 | # define BIO_new_fp BIO_new_fp_internal | 507 | # define BIO_new_fp BIO_new_fp_internal |
| 429 | # else /* FP_API */ | 508 | # else /* FP_API */ |
| 430 | BIO_METHOD *BIO_s_file(void ); | 509 | BIO_METHOD *BIO_s_file(void ); |
| 431 | BIO *BIO_new_file(char *filename, char *mode); | 510 | BIO *BIO_new_file(const char *filename, const char *mode); |
| 432 | BIO *BIO_new_fp(FILE *stream, int close_flag); | 511 | BIO *BIO_new_fp(FILE *stream, int close_flag); |
| 433 | # define BIO_s_file_internal BIO_s_file | 512 | # define BIO_s_file_internal BIO_s_file |
| 434 | # define BIO_new_file_internal BIO_new_file | 513 | # define BIO_new_file_internal BIO_new_file |
| 435 | # define BIO_new_fp_internal BIO_s_file | 514 | # define BIO_new_fp_internal BIO_s_file |
| 436 | # endif /* FP_API */ | 515 | # endif /* FP_API */ |
| 437 | #else | 516 | # endif |
| 438 | # if defined(WIN16) && defined(_WINDLL) | ||
| 439 | BIO_METHOD *BIO_s_file_internal(); | ||
| 440 | BIO *BIO_new_file_internal(); | ||
| 441 | BIO *BIO_new_fp_internal(); | ||
| 442 | # define BIO_s_file BIO_s_file_internal | ||
| 443 | # define BIO_new_file BIO_new_file_internal | ||
| 444 | # define BIO_new_fp BIO_new_fp_internal | ||
| 445 | # else /* FP_API */ | ||
| 446 | BIO_METHOD *BIO_s_file(); | ||
| 447 | BIO *BIO_new_file(); | ||
| 448 | BIO *BIO_new_fp(); | ||
| 449 | # define BIO_s_file_internal BIO_s_file | ||
| 450 | # define BIO_new_file_internal BIO_new_file | ||
| 451 | # define BIO_new_fp_internal BIO_s_file | ||
| 452 | # endif /* FP_API */ | ||
| 453 | #endif | ||
| 454 | |||
| 455 | #ifndef NOPROTO | ||
| 456 | BIO * BIO_new(BIO_METHOD *type); | 517 | BIO * BIO_new(BIO_METHOD *type); |
| 457 | int BIO_set(BIO *a,BIO_METHOD *type); | 518 | int BIO_set(BIO *a,BIO_METHOD *type); |
| 458 | int BIO_free(BIO *a); | 519 | int BIO_free(BIO *a); |
| 459 | int BIO_read(BIO *b, char *data, int len); | 520 | void BIO_vfree(BIO *a); |
| 521 | int BIO_read(BIO *b, void *data, int len); | ||
| 460 | int BIO_gets(BIO *bp,char *buf, int size); | 522 | int BIO_gets(BIO *bp,char *buf, int size); |
| 461 | int BIO_write(BIO *b, char *data, int len); | 523 | int BIO_write(BIO *b, const void *data, int len); |
| 462 | int BIO_puts(BIO *bp,char *buf); | 524 | int BIO_puts(BIO *bp,const char *buf); |
| 463 | long BIO_ctrl(BIO *bp,int cmd,long larg,char *parg); | 525 | long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); |
| 526 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); | ||
| 464 | char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); | 527 | char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); |
| 465 | long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); | 528 | long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); |
| 466 | BIO * BIO_push(BIO *b,BIO *append); | 529 | BIO * BIO_push(BIO *b,BIO *append); |
| 467 | BIO * BIO_pop(BIO *b); | 530 | BIO * BIO_pop(BIO *b); |
| 468 | void BIO_free_all(BIO *a); | 531 | void BIO_free_all(BIO *a); |
| 469 | BIO * BIO_find_type(BIO *b,int bio_type); | 532 | BIO * BIO_find_type(BIO *b,int bio_type); |
| 533 | BIO * BIO_next(BIO *b); | ||
| 470 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); | 534 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); |
| 471 | int BIO_get_retry_reason(BIO *bio); | 535 | int BIO_get_retry_reason(BIO *bio); |
| 472 | BIO * BIO_dup_chain(BIO *in); | 536 | BIO * BIO_dup_chain(BIO *in); |
| 473 | 537 | ||
| 474 | #ifndef WIN16 | 538 | int BIO_nread0(BIO *bio, char **buf); |
| 475 | long BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi, | 539 | int BIO_nread(BIO *bio, char **buf, int num); |
| 540 | int BIO_nwrite0(BIO *bio, char **buf); | ||
| 541 | int BIO_nwrite(BIO *bio, char **buf, int num); | ||
| 542 | |||
| 543 | #ifndef OPENSSL_SYS_WIN16 | ||
| 544 | long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, | ||
| 476 | long argl,long ret); | 545 | long argl,long ret); |
| 477 | #else | 546 | #else |
| 478 | long _far _loadds BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi, | 547 | long _far _loadds BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, |
| 479 | long argl,long ret); | 548 | long argl,long ret); |
| 480 | #endif | 549 | #endif |
| 481 | 550 | ||
| 482 | BIO_METHOD *BIO_s_mem(void); | 551 | BIO_METHOD *BIO_s_mem(void); |
| 552 | BIO *BIO_new_mem_buf(void *buf, int len); | ||
| 483 | BIO_METHOD *BIO_s_socket(void); | 553 | BIO_METHOD *BIO_s_socket(void); |
| 484 | BIO_METHOD *BIO_s_connect(void); | 554 | BIO_METHOD *BIO_s_connect(void); |
| 485 | BIO_METHOD *BIO_s_accept(void); | 555 | BIO_METHOD *BIO_s_accept(void); |
| 486 | BIO_METHOD *BIO_s_fd(void); | 556 | BIO_METHOD *BIO_s_fd(void); |
| 557 | BIO_METHOD *BIO_s_log(void); | ||
| 558 | BIO_METHOD *BIO_s_bio(void); | ||
| 487 | BIO_METHOD *BIO_s_null(void); | 559 | BIO_METHOD *BIO_s_null(void); |
| 488 | BIO_METHOD *BIO_f_null(void); | 560 | BIO_METHOD *BIO_f_null(void); |
| 489 | BIO_METHOD *BIO_f_nbio_test(void); | ||
| 490 | BIO_METHOD *BIO_f_buffer(void); | 561 | BIO_METHOD *BIO_f_buffer(void); |
| 562 | #ifdef OPENSSL_SYS_VMS | ||
| 563 | BIO_METHOD *BIO_f_linebuffer(void); | ||
| 564 | #endif | ||
| 565 | BIO_METHOD *BIO_f_nbio_test(void); | ||
| 566 | /* BIO_METHOD *BIO_f_ber(void); */ | ||
| 491 | 567 | ||
| 492 | int BIO_sock_should_retry(int i); | 568 | int BIO_sock_should_retry(int i); |
| 493 | int BIO_sock_non_fatal_error(int error); | 569 | int BIO_sock_non_fatal_error(int error); |
| 494 | int BIO_fd_should_retry(int i); | 570 | int BIO_fd_should_retry(int i); |
| 495 | int BIO_fd_non_fatal_error(int error); | 571 | int BIO_fd_non_fatal_error(int error); |
| 496 | int BIO_dump(BIO *b,char *bytes,int len); | 572 | int BIO_dump(BIO *b,const char *bytes,int len); |
| 497 | 573 | int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); | |
| 498 | struct hostent *BIO_gethostbyname(char *name); | 574 | |
| 575 | struct hostent *BIO_gethostbyname(const char *name); | ||
| 576 | /* We might want a thread-safe interface too: | ||
| 577 | * struct hostent *BIO_gethostbyname_r(const char *name, | ||
| 578 | * struct hostent *result, void *buffer, size_t buflen); | ||
| 579 | * or something similar (caller allocates a struct hostent, | ||
| 580 | * pointed to by "result", and additional buffer space for the various | ||
| 581 | * substructures; if the buffer does not suffice, NULL is returned | ||
| 582 | * and an appropriate error code is set). | ||
| 583 | */ | ||
| 499 | int BIO_sock_error(int sock); | 584 | int BIO_sock_error(int sock); |
| 500 | int BIO_socket_ioctl(int fd, long type, unsigned long *arg); | 585 | int BIO_socket_ioctl(int fd, long type, unsigned long *arg); |
| 501 | int BIO_get_port(char *str, short *port_ptr); | 586 | int BIO_socket_nbio(int fd,int mode); |
| 502 | int BIO_get_host_ip(char *str, unsigned char *ip); | 587 | int BIO_get_port(const char *str, unsigned short *port_ptr); |
| 503 | int BIO_get_accept_socket(char *host_port); | 588 | int BIO_get_host_ip(const char *str, unsigned char *ip); |
| 589 | int BIO_get_accept_socket(char *host_port,int mode); | ||
| 504 | int BIO_accept(int sock,char **ip_port); | 590 | int BIO_accept(int sock,char **ip_port); |
| 505 | int BIO_sock_init(void ); | 591 | int BIO_sock_init(void ); |
| 506 | void BIO_sock_cleanup(void); | 592 | void BIO_sock_cleanup(void); |
| 507 | int BIO_set_tcp_ndelay(int sock,int turn_on); | 593 | int BIO_set_tcp_ndelay(int sock,int turn_on); |
| 508 | 594 | ||
| 509 | void ERR_load_BIO_strings(void ); | ||
| 510 | |||
| 511 | BIO *BIO_new_socket(int sock, int close_flag); | 595 | BIO *BIO_new_socket(int sock, int close_flag); |
| 512 | BIO *BIO_new_fd(int fd, int close_flag); | 596 | BIO *BIO_new_fd(int fd, int close_flag); |
| 513 | BIO *BIO_new_connect(char *host_port); | 597 | BIO *BIO_new_connect(char *host_port); |
| 514 | BIO *BIO_new_accept(char *host_port); | 598 | BIO *BIO_new_accept(char *host_port); |
| 515 | 599 | ||
| 600 | int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, | ||
| 601 | BIO **bio2, size_t writebuf2); | ||
| 602 | /* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. | ||
| 603 | * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. | ||
| 604 | * Size 0 uses default value. | ||
| 605 | */ | ||
| 606 | |||
| 516 | void BIO_copy_next_retry(BIO *b); | 607 | void BIO_copy_next_retry(BIO *b); |
| 517 | 608 | ||
| 518 | long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); | 609 | long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); |
| 519 | 610 | ||
| 520 | #else | 611 | int BIO_printf(BIO *bio, const char *format, ...); |
| 521 | 612 | int BIO_vprintf(BIO *bio, const char *format, va_list args); | |
| 522 | BIO * BIO_new(); | 613 | int BIO_snprintf(char *buf, size_t n, const char *format, ...); |
| 523 | int BIO_set(); | 614 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args); |
| 524 | int BIO_free(); | ||
| 525 | int BIO_read(); | ||
| 526 | int BIO_gets(); | ||
| 527 | int BIO_write(); | ||
| 528 | int BIO_puts(); | ||
| 529 | char * BIO_ptr_ctrl(); | ||
| 530 | long BIO_ctrl(); | ||
| 531 | long BIO_int_ctrl(); | ||
| 532 | BIO * BIO_push(); | ||
| 533 | BIO * BIO_pop(); | ||
| 534 | void BIO_free_all(); | ||
| 535 | BIO * BIO_find_type(); | ||
| 536 | BIO * BIO_get_retry_BIO(); | ||
| 537 | int BIO_get_retry_reason(); | ||
| 538 | BIO * BIO_dup_chain(); | ||
| 539 | |||
| 540 | #ifndef WIN16 | ||
| 541 | long BIO_debug_callback(); | ||
| 542 | #else | ||
| 543 | long _far _loadds BIO_debug_callback(); | ||
| 544 | #endif | ||
| 545 | |||
| 546 | BIO_METHOD *BIO_s_mem(); | ||
| 547 | BIO_METHOD *BIO_s_socket(); | ||
| 548 | BIO_METHOD *BIO_s_connect(); | ||
| 549 | BIO_METHOD *BIO_s_accept(); | ||
| 550 | BIO_METHOD *BIO_s_fd(); | ||
| 551 | BIO_METHOD *BIO_s_null(); | ||
| 552 | BIO_METHOD *BIO_f_null(); | ||
| 553 | BIO_METHOD *BIO_f_buffer(); | ||
| 554 | BIO_METHOD *BIO_f_nbio_test(); | ||
| 555 | |||
| 556 | int BIO_sock_should_retry(); | ||
| 557 | int BIO_sock_non_fatal_error(); | ||
| 558 | int BIO_fd_should_retry(); | ||
| 559 | int BIO_fd_non_fatal_error(); | ||
| 560 | int BIO_dump(); | ||
| 561 | |||
| 562 | struct hostent *BIO_gethostbyname(); | ||
| 563 | int BIO_sock_error(); | ||
| 564 | int BIO_socket_ioctl(); | ||
| 565 | int BIO_get_port(); | ||
| 566 | int BIO_get_host_ip(); | ||
| 567 | int BIO_get_accept_socket(); | ||
| 568 | int BIO_accept(); | ||
| 569 | int BIO_sock_init(); | ||
| 570 | void BIO_sock_cleanup(); | ||
| 571 | int BIO_set_tcp_ndelay(); | ||
| 572 | |||
| 573 | void ERR_load_BIO_strings(); | ||
| 574 | |||
| 575 | BIO *BIO_new_socket(); | ||
| 576 | BIO *BIO_new_fd(); | ||
| 577 | BIO *BIO_new_connect(); | ||
| 578 | BIO *BIO_new_accept(); | ||
| 579 | |||
| 580 | void BIO_copy_next_retry(); | ||
| 581 | |||
| 582 | int BIO_ghbn_ctrl(); | ||
| 583 | |||
| 584 | #endif | ||
| 585 | |||
| 586 | /* Tim Hudson's portable varargs stuff */ | ||
| 587 | |||
| 588 | #ifndef NOPROTO | ||
| 589 | #define VAR_ANSI /* select ANSI version by default */ | ||
| 590 | #endif | ||
| 591 | |||
| 592 | #ifdef VAR_ANSI | ||
| 593 | /* ANSI version of a "portable" macro set for variable length args */ | ||
| 594 | #ifndef __STDARG_H__ /**/ | ||
| 595 | #include <stdarg.h> | ||
| 596 | #endif /**/ | ||
| 597 | |||
| 598 | #define VAR_PLIST(arg1type,arg1) arg1type arg1, ... | ||
| 599 | #define VAR_PLIST2(arg1type,arg1,arg2type,arg2) arg1type arg1,arg2type arg2,... | ||
| 600 | #define VAR_ALIST | ||
| 601 | #define VAR_BDEFN(args,arg1type,arg1) va_list args | ||
| 602 | #define VAR_BDEFN2(args,arg1type,arg1,arg2type,arg2) va_list args | ||
| 603 | #define VAR_INIT(args,arg1type,arg1) va_start(args,arg1); | ||
| 604 | #define VAR_INIT2(args,arg1type,arg1,arg2type,arg2) va_start(args,arg2); | ||
| 605 | #define VAR_ARG(args,type,arg) arg=va_arg(args,type) | ||
| 606 | #define VAR_END(args) va_end(args); | ||
| 607 | |||
| 608 | #else | ||
| 609 | |||
| 610 | /* K&R version of a "portable" macro set for variable length args */ | ||
| 611 | #ifndef __VARARGS_H__ | ||
| 612 | #include <varargs.h> | ||
| 613 | #endif | ||
| 614 | |||
| 615 | #define VAR_PLIST(arg1type,arg1) va_alist | ||
| 616 | #define VAR_PLIST2(arg1type,arg1,arg2type,arg2) va_alist | ||
| 617 | #define VAR_ALIST va_dcl | ||
| 618 | #define VAR_BDEFN(args,arg1type,arg1) va_list args; arg1type arg1 | ||
| 619 | #define VAR_BDEFN2(args,arg1type,arg1,arg2type,arg2) va_list args; \ | ||
| 620 | arg1type arg1; arg2type arg2 | ||
| 621 | #define VAR_INIT(args,arg1type,arg1) va_start(args); \ | ||
| 622 | arg1=va_arg(args,arg1type); | ||
| 623 | #define VAR_INIT2(args,arg1type,arg1,arg2type,arg2) va_start(args); \ | ||
| 624 | arg1=va_arg(args,arg1type); arg2=va_arg(args,arg2type); | ||
| 625 | #define VAR_ARG(args,type,arg) arg=va_arg(args,type) | ||
| 626 | #define VAR_END(args) va_end(args); | ||
| 627 | |||
| 628 | #endif | ||
| 629 | |||
| 630 | #ifndef NOPROTO | ||
| 631 | int BIO_printf( VAR_PLIST( BIO *, bio ) ); | ||
| 632 | #else | ||
| 633 | int BIO_printf(); | ||
| 634 | #endif | ||
| 635 | 615 | ||
| 636 | /* BEGIN ERROR CODES */ | 616 | /* BEGIN ERROR CODES */ |
| 617 | /* The following lines are auto generated by the script mkerr.pl. Any changes | ||
| 618 | * made after this point may be overwritten when the script is next run. | ||
| 619 | */ | ||
| 620 | void ERR_load_BIO_strings(void); | ||
| 621 | |||
| 637 | /* Error codes for the BIO functions. */ | 622 | /* Error codes for the BIO functions. */ |
| 638 | 623 | ||
| 639 | /* Function codes. */ | 624 | /* Function codes. */ |
| 640 | #define BIO_F_ACPT_STATE 100 | 625 | #define BIO_F_ACPT_STATE 100 |
| 641 | #define BIO_F_BIO_ACCEPT 101 | 626 | #define BIO_F_BIO_ACCEPT 101 |
| 642 | #define BIO_F_BIO_CTRL 102 | 627 | #define BIO_F_BIO_BER_GET_HEADER 102 |
| 643 | #define BIO_F_BIO_GETS 103 | 628 | #define BIO_F_BIO_CTRL 103 |
| 644 | #define BIO_F_BIO_GET_ACCEPT_SOCKET 104 | 629 | #define BIO_F_BIO_GETHOSTBYNAME 120 |
| 645 | #define BIO_F_BIO_GET_HOST_IP 105 | 630 | #define BIO_F_BIO_GETS 104 |
| 646 | #define BIO_F_BIO_GET_PORT 106 | 631 | #define BIO_F_BIO_GET_ACCEPT_SOCKET 105 |
| 647 | #define BIO_F_BIO_NEW 107 | 632 | #define BIO_F_BIO_GET_HOST_IP 106 |
| 648 | #define BIO_F_BIO_NEW_FILE 108 | 633 | #define BIO_F_BIO_GET_PORT 107 |
| 649 | #define BIO_F_BIO_PUTS 109 | 634 | #define BIO_F_BIO_MAKE_PAIR 121 |
| 650 | #define BIO_F_BIO_READ 110 | 635 | #define BIO_F_BIO_NEW 108 |
| 651 | #define BIO_F_BIO_SOCK_INIT 111 | 636 | #define BIO_F_BIO_NEW_FILE 109 |
| 652 | #define BIO_F_BIO_WRITE 112 | 637 | #define BIO_F_BIO_NEW_MEM_BUF 126 |
| 653 | #define BIO_F_BUFFER_CTRL 113 | 638 | #define BIO_F_BIO_NREAD 123 |
| 654 | #define BIO_F_CONN_STATE 114 | 639 | #define BIO_F_BIO_NREAD0 124 |
| 655 | #define BIO_F_FILE_CTRL 115 | 640 | #define BIO_F_BIO_NWRITE 125 |
| 656 | #define BIO_F_MEM_WRITE 116 | 641 | #define BIO_F_BIO_NWRITE0 122 |
| 657 | #define BIO_F_SSL_NEW 117 | 642 | #define BIO_F_BIO_PUTS 110 |
| 658 | #define BIO_F_WSASTARTUP 118 | 643 | #define BIO_F_BIO_READ 111 |
| 644 | #define BIO_F_BIO_SOCK_INIT 112 | ||
| 645 | #define BIO_F_BIO_WRITE 113 | ||
| 646 | #define BIO_F_BUFFER_CTRL 114 | ||
| 647 | #define BIO_F_CONN_CTRL 127 | ||
| 648 | #define BIO_F_CONN_STATE 115 | ||
| 649 | #define BIO_F_FILE_CTRL 116 | ||
| 650 | #define BIO_F_LINEBUFFER_CTRL 129 | ||
| 651 | #define BIO_F_MEM_READ 128 | ||
| 652 | #define BIO_F_MEM_WRITE 117 | ||
| 653 | #define BIO_F_SSL_NEW 118 | ||
| 654 | #define BIO_F_WSASTARTUP 119 | ||
| 659 | 655 | ||
| 660 | /* Reason codes. */ | 656 | /* Reason codes. */ |
| 661 | #define BIO_R_ACCEPT_ERROR 100 | 657 | #define BIO_R_ACCEPT_ERROR 100 |
| 662 | #define BIO_R_BAD_FOPEN_MODE 101 | 658 | #define BIO_R_BAD_FOPEN_MODE 101 |
| 663 | #define BIO_R_BAD_HOSTNAME_LOOKUP 102 | 659 | #define BIO_R_BAD_HOSTNAME_LOOKUP 102 |
| 660 | #define BIO_R_BROKEN_PIPE 124 | ||
| 664 | #define BIO_R_CONNECT_ERROR 103 | 661 | #define BIO_R_CONNECT_ERROR 103 |
| 662 | #define BIO_R_EOF_ON_MEMORY_BIO 127 | ||
| 665 | #define BIO_R_ERROR_SETTING_NBIO 104 | 663 | #define BIO_R_ERROR_SETTING_NBIO 104 |
| 666 | #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 | 664 | #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 |
| 667 | #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 | 665 | #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 |
| 668 | #define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 | 666 | #define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 |
| 667 | #define BIO_R_INVALID_ARGUMENT 125 | ||
| 669 | #define BIO_R_INVALID_IP_ADDRESS 108 | 668 | #define BIO_R_INVALID_IP_ADDRESS 108 |
| 669 | #define BIO_R_IN_USE 123 | ||
| 670 | #define BIO_R_KEEPALIVE 109 | 670 | #define BIO_R_KEEPALIVE 109 |
| 671 | #define BIO_R_NBIO_CONNECT_ERROR 110 | 671 | #define BIO_R_NBIO_CONNECT_ERROR 110 |
| 672 | #define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 | 672 | #define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 |
| 673 | #define BIO_R_NO_HOSTHNAME_SPECIFIED 112 | 673 | #define BIO_R_NO_HOSTNAME_SPECIFIED 112 |
| 674 | #define BIO_R_NO_PORT_DEFINED 113 | 674 | #define BIO_R_NO_PORT_DEFINED 113 |
| 675 | #define BIO_R_NO_PORT_SPECIFIED 114 | 675 | #define BIO_R_NO_PORT_SPECIFIED 114 |
| 676 | #define BIO_R_NO_SUCH_FILE 128 | ||
| 676 | #define BIO_R_NULL_PARAMETER 115 | 677 | #define BIO_R_NULL_PARAMETER 115 |
| 677 | #define BIO_R_UNABLE_TO_BIND_SOCKET 116 | 678 | #define BIO_R_TAG_MISMATCH 116 |
| 678 | #define BIO_R_UNABLE_TO_CREATE_SOCKET 117 | 679 | #define BIO_R_UNABLE_TO_BIND_SOCKET 117 |
| 679 | #define BIO_R_UNABLE_TO_LISTEN_SOCKET 118 | 680 | #define BIO_R_UNABLE_TO_CREATE_SOCKET 118 |
| 680 | #define BIO_R_UNINITALISED 119 | 681 | #define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 |
| 681 | #define BIO_R_UNSUPPORTED_METHOD 120 | 682 | #define BIO_R_UNINITIALIZED 120 |
| 682 | #define BIO_R_WSASTARTUP 121 | 683 | #define BIO_R_UNSUPPORTED_METHOD 121 |
| 683 | 684 | #define BIO_R_WRITE_TO_READ_ONLY_BIO 126 | |
| 685 | #define BIO_R_WSASTARTUP 122 | ||
| 686 | |||
| 684 | #ifdef __cplusplus | 687 | #ifdef __cplusplus |
| 685 | } | 688 | } |
| 686 | #endif | 689 | #endif |
| 687 | #endif | 690 | #endif |
| 688 | |||
diff --git a/src/lib/libcrypto/bio/bio_cb.c b/src/lib/libcrypto/bio/bio_cb.c index bc6ed9eda1..0ffa4d2136 100644 --- a/src/lib/libcrypto/bio/bio_cb.c +++ b/src/lib/libcrypto/bio/bio_cb.c | |||
| @@ -60,16 +60,11 @@ | |||
| 60 | #include <string.h> | 60 | #include <string.h> |
| 61 | #include <stdlib.h> | 61 | #include <stdlib.h> |
| 62 | #include "cryptlib.h" | 62 | #include "cryptlib.h" |
| 63 | #include "bio.h" | 63 | #include <openssl/bio.h> |
| 64 | #include "err.h" | 64 | #include <openssl/err.h> |
| 65 | 65 | ||
| 66 | long MS_CALLBACK BIO_debug_callback(bio,cmd,argp,argi,argl,ret) | 66 | long MS_CALLBACK BIO_debug_callback(BIO *bio, int cmd, const char *argp, |
| 67 | BIO *bio; | 67 | int argi, long argl, long ret) |
| 68 | int cmd; | ||
| 69 | char *argp; | ||
| 70 | int argi; | ||
| 71 | long argl; | ||
| 72 | long ret; | ||
| 73 | { | 68 | { |
| 74 | BIO *b; | 69 | BIO *b; |
| 75 | MS_STATIC char buf[256]; | 70 | MS_STATIC char buf[256]; |
| @@ -130,7 +125,7 @@ long ret; | |||
| 130 | b=(BIO *)bio->cb_arg; | 125 | b=(BIO *)bio->cb_arg; |
| 131 | if (b != NULL) | 126 | if (b != NULL) |
| 132 | BIO_write(b,buf,strlen(buf)); | 127 | BIO_write(b,buf,strlen(buf)); |
| 133 | #if !defined(NO_STDIO) && !defined(WIN16) | 128 | #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) |
| 134 | else | 129 | else |
| 135 | fputs(buf,stderr); | 130 | fputs(buf,stderr); |
| 136 | #endif | 131 | #endif |
diff --git a/src/lib/libcrypto/bio/bio_err.c b/src/lib/libcrypto/bio/bio_err.c index 37e14ca107..99ca3cd0da 100644 --- a/src/lib/libcrypto/bio/bio_err.c +++ b/src/lib/libcrypto/bio/bio_err.c | |||
| @@ -1,88 +1,102 @@ | |||
| 1 | /* lib/bio/bio_err.c */ | 1 | /* crypto/bio/bio_err.c */ |
| 2 | /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) | 2 | /* ==================================================================== |
| 3 | * All rights reserved. | 3 | * Copyright (c) 1999 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * This package is an SSL implementation written | ||
| 6 | * by Eric Young (eay@cryptsoft.com). | ||
| 7 | * The implementation was written so as to conform with Netscapes SSL. | ||
| 8 | * | ||
| 9 | * This library is free for commercial and non-commercial use as long as | ||
| 10 | * the following conditions are aheared to. The following conditions | ||
| 11 | * apply to all code found in this distribution, be it the RC4, RSA, | ||
| 12 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | ||
| 13 | * included with this distribution is covered by the same copyright terms | ||
| 14 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | ||
| 15 | * | ||
| 16 | * Copyright remains Eric Young's, and as such any Copyright notices in | ||
| 17 | * the code are not to be removed. | ||
| 18 | * If this package is used in a product, Eric Young should be given attribution | ||
| 19 | * as the author of the parts of the library used. | ||
| 20 | * This can be in the form of a textual message at program startup or | ||
| 21 | * in documentation (online or textual) provided with the package. | ||
| 22 | * | ||
| 23 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 24 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| 25 | * are met: | 7 | * are met: |
| 26 | * 1. Redistributions of source code must retain the copyright | 8 | * |
| 27 | * notice, this list of conditions and the following disclaimer. | 9 | * 1. Redistributions of source code must retain the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer. | ||
| 11 | * | ||
| 28 | * 2. Redistributions in binary form must reproduce the above copyright | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
| 29 | * notice, this list of conditions and the following disclaimer in the | 13 | * notice, this list of conditions and the following disclaimer in |
| 30 | * documentation and/or other materials provided with the distribution. | 14 | * the documentation and/or other materials provided with the |
| 31 | * 3. All advertising materials mentioning features or use of this software | 15 | * distribution. |
| 32 | * must display the following acknowledgement: | 16 | * |
| 33 | * "This product includes cryptographic software written by | 17 | * 3. All advertising materials mentioning features or use of this |
| 34 | * Eric Young (eay@cryptsoft.com)" | 18 | * software must display the following acknowledgment: |
| 35 | * The word 'cryptographic' can be left out if the rouines from the library | 19 | * "This product includes software developed by the OpenSSL Project |
| 36 | * being used are not cryptographic related :-). | 20 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" |
| 37 | * 4. If you include any Windows specific code (or a derivative thereof) from | 21 | * |
| 38 | * the apps directory (application code) you must include an acknowledgement: | 22 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| 39 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | 23 | * endorse or promote products derived from this software without |
| 40 | * | 24 | * prior written permission. For written permission, please contact |
| 41 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | 25 | * openssl-core@OpenSSL.org. |
| 42 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 26 | * |
| 43 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 27 | * 5. Products derived from this software may not be called "OpenSSL" |
| 44 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 28 | * nor may "OpenSSL" appear in their names without prior written |
| 45 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 29 | * permission of the OpenSSL Project. |
| 46 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 30 | * |
| 47 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 31 | * 6. Redistributions of any form whatsoever must retain the following |
| 48 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 32 | * acknowledgment: |
| 49 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 33 | * "This product includes software developed by the OpenSSL Project |
| 50 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 34 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" |
| 51 | * SUCH DAMAGE. | 35 | * |
| 52 | * | 36 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| 53 | * The licence and distribution terms for any publically available version or | 37 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 54 | * derivative of this code cannot be changed. i.e. this code cannot simply be | 38 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 55 | * copied and put under another distribution licence | 39 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| 56 | * [including the GNU Public Licence.] | 40 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 41 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 42 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 43 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 44 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 45 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 46 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 47 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 48 | * ==================================================================== | ||
| 49 | * | ||
| 50 | * This product includes cryptographic software written by Eric Young | ||
| 51 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 52 | * Hudson (tjh@cryptsoft.com). | ||
| 53 | * | ||
| 57 | */ | 54 | */ |
| 55 | |||
| 56 | /* NOTE: this file was auto generated by the mkerr.pl script: any changes | ||
| 57 | * made to it will be overwritten when the script next updates this file, | ||
| 58 | * only reason strings will be preserved. | ||
| 59 | */ | ||
| 60 | |||
| 58 | #include <stdio.h> | 61 | #include <stdio.h> |
| 59 | #include "err.h" | 62 | #include <openssl/err.h> |
| 60 | #include "bio.h" | 63 | #include <openssl/bio.h> |
| 61 | 64 | ||
| 62 | /* BEGIN ERROR CODES */ | 65 | /* BEGIN ERROR CODES */ |
| 63 | #ifndef NO_ERR | 66 | #ifndef OPENSSL_NO_ERR |
| 64 | static ERR_STRING_DATA BIO_str_functs[]= | 67 | static ERR_STRING_DATA BIO_str_functs[]= |
| 65 | { | 68 | { |
| 66 | {ERR_PACK(0,BIO_F_ACPT_STATE,0), "ACPT_STATE"}, | 69 | {ERR_PACK(0,BIO_F_ACPT_STATE,0), "ACPT_STATE"}, |
| 67 | {ERR_PACK(0,BIO_F_BIO_ACCEPT,0), "BIO_accept"}, | 70 | {ERR_PACK(0,BIO_F_BIO_ACCEPT,0), "BIO_accept"}, |
| 71 | {ERR_PACK(0,BIO_F_BIO_BER_GET_HEADER,0), "BIO_BER_GET_HEADER"}, | ||
| 68 | {ERR_PACK(0,BIO_F_BIO_CTRL,0), "BIO_ctrl"}, | 72 | {ERR_PACK(0,BIO_F_BIO_CTRL,0), "BIO_ctrl"}, |
| 73 | {ERR_PACK(0,BIO_F_BIO_GETHOSTBYNAME,0), "BIO_gethostbyname"}, | ||
| 69 | {ERR_PACK(0,BIO_F_BIO_GETS,0), "BIO_gets"}, | 74 | {ERR_PACK(0,BIO_F_BIO_GETS,0), "BIO_gets"}, |
| 70 | {ERR_PACK(0,BIO_F_BIO_GET_ACCEPT_SOCKET,0), "BIO_get_accept_socket"}, | 75 | {ERR_PACK(0,BIO_F_BIO_GET_ACCEPT_SOCKET,0), "BIO_get_accept_socket"}, |
| 71 | {ERR_PACK(0,BIO_F_BIO_GET_HOST_IP,0), "BIO_get_host_ip"}, | 76 | {ERR_PACK(0,BIO_F_BIO_GET_HOST_IP,0), "BIO_get_host_ip"}, |
| 72 | {ERR_PACK(0,BIO_F_BIO_GET_PORT,0), "BIO_get_port"}, | 77 | {ERR_PACK(0,BIO_F_BIO_GET_PORT,0), "BIO_get_port"}, |
| 78 | {ERR_PACK(0,BIO_F_BIO_MAKE_PAIR,0), "BIO_MAKE_PAIR"}, | ||
| 73 | {ERR_PACK(0,BIO_F_BIO_NEW,0), "BIO_new"}, | 79 | {ERR_PACK(0,BIO_F_BIO_NEW,0), "BIO_new"}, |
| 74 | {ERR_PACK(0,BIO_F_BIO_NEW_FILE,0), "BIO_new_file"}, | 80 | {ERR_PACK(0,BIO_F_BIO_NEW_FILE,0), "BIO_new_file"}, |
| 81 | {ERR_PACK(0,BIO_F_BIO_NEW_MEM_BUF,0), "BIO_new_mem_buf"}, | ||
| 82 | {ERR_PACK(0,BIO_F_BIO_NREAD,0), "BIO_nread"}, | ||
| 83 | {ERR_PACK(0,BIO_F_BIO_NREAD0,0), "BIO_nread0"}, | ||
| 84 | {ERR_PACK(0,BIO_F_BIO_NWRITE,0), "BIO_nwrite"}, | ||
| 85 | {ERR_PACK(0,BIO_F_BIO_NWRITE0,0), "BIO_nwrite0"}, | ||
| 75 | {ERR_PACK(0,BIO_F_BIO_PUTS,0), "BIO_puts"}, | 86 | {ERR_PACK(0,BIO_F_BIO_PUTS,0), "BIO_puts"}, |
| 76 | {ERR_PACK(0,BIO_F_BIO_READ,0), "BIO_read"}, | 87 | {ERR_PACK(0,BIO_F_BIO_READ,0), "BIO_read"}, |
| 77 | {ERR_PACK(0,BIO_F_BIO_SOCK_INIT,0), "BIO_sock_init"}, | 88 | {ERR_PACK(0,BIO_F_BIO_SOCK_INIT,0), "BIO_sock_init"}, |
| 78 | {ERR_PACK(0,BIO_F_BIO_WRITE,0), "BIO_write"}, | 89 | {ERR_PACK(0,BIO_F_BIO_WRITE,0), "BIO_write"}, |
| 79 | {ERR_PACK(0,BIO_F_BUFFER_CTRL,0), "BUFFER_CTRL"}, | 90 | {ERR_PACK(0,BIO_F_BUFFER_CTRL,0), "BUFFER_CTRL"}, |
| 91 | {ERR_PACK(0,BIO_F_CONN_CTRL,0), "CONN_CTRL"}, | ||
| 80 | {ERR_PACK(0,BIO_F_CONN_STATE,0), "CONN_STATE"}, | 92 | {ERR_PACK(0,BIO_F_CONN_STATE,0), "CONN_STATE"}, |
| 81 | {ERR_PACK(0,BIO_F_FILE_CTRL,0), "FILE_CTRL"}, | 93 | {ERR_PACK(0,BIO_F_FILE_CTRL,0), "FILE_CTRL"}, |
| 94 | {ERR_PACK(0,BIO_F_LINEBUFFER_CTRL,0), "LINEBUFFER_CTRL"}, | ||
| 95 | {ERR_PACK(0,BIO_F_MEM_READ,0), "MEM_READ"}, | ||
| 82 | {ERR_PACK(0,BIO_F_MEM_WRITE,0), "MEM_WRITE"}, | 96 | {ERR_PACK(0,BIO_F_MEM_WRITE,0), "MEM_WRITE"}, |
| 83 | {ERR_PACK(0,BIO_F_SSL_NEW,0), "SSL_NEW"}, | 97 | {ERR_PACK(0,BIO_F_SSL_NEW,0), "SSL_new"}, |
| 84 | {ERR_PACK(0,BIO_F_WSASTARTUP,0), "WSASTARTUP"}, | 98 | {ERR_PACK(0,BIO_F_WSASTARTUP,0), "WSASTARTUP"}, |
| 85 | {0,NULL}, | 99 | {0,NULL} |
| 86 | }; | 100 | }; |
| 87 | 101 | ||
| 88 | static ERR_STRING_DATA BIO_str_reasons[]= | 102 | static ERR_STRING_DATA BIO_str_reasons[]= |
| @@ -90,38 +104,45 @@ static ERR_STRING_DATA BIO_str_reasons[]= | |||
| 90 | {BIO_R_ACCEPT_ERROR ,"accept error"}, | 104 | {BIO_R_ACCEPT_ERROR ,"accept error"}, |
| 91 | {BIO_R_BAD_FOPEN_MODE ,"bad fopen mode"}, | 105 | {BIO_R_BAD_FOPEN_MODE ,"bad fopen mode"}, |
| 92 | {BIO_R_BAD_HOSTNAME_LOOKUP ,"bad hostname lookup"}, | 106 | {BIO_R_BAD_HOSTNAME_LOOKUP ,"bad hostname lookup"}, |
| 107 | {BIO_R_BROKEN_PIPE ,"broken pipe"}, | ||
| 93 | {BIO_R_CONNECT_ERROR ,"connect error"}, | 108 | {BIO_R_CONNECT_ERROR ,"connect error"}, |
| 109 | {BIO_R_EOF_ON_MEMORY_BIO ,"EOF on memory BIO"}, | ||
| 94 | {BIO_R_ERROR_SETTING_NBIO ,"error setting nbio"}, | 110 | {BIO_R_ERROR_SETTING_NBIO ,"error setting nbio"}, |
| 95 | {BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET,"error setting nbio on accepted socket"}, | 111 | {BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET,"error setting nbio on accepted socket"}, |
| 96 | {BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET,"error setting nbio on accept socket"}, | 112 | {BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET,"error setting nbio on accept socket"}, |
| 97 | {BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ,"gethostbyname addr is not af inet"}, | 113 | {BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ,"gethostbyname addr is not af inet"}, |
| 114 | {BIO_R_INVALID_ARGUMENT ,"invalid argument"}, | ||
| 98 | {BIO_R_INVALID_IP_ADDRESS ,"invalid ip address"}, | 115 | {BIO_R_INVALID_IP_ADDRESS ,"invalid ip address"}, |
| 116 | {BIO_R_IN_USE ,"in use"}, | ||
| 99 | {BIO_R_KEEPALIVE ,"keepalive"}, | 117 | {BIO_R_KEEPALIVE ,"keepalive"}, |
| 100 | {BIO_R_NBIO_CONNECT_ERROR ,"nbio connect error"}, | 118 | {BIO_R_NBIO_CONNECT_ERROR ,"nbio connect error"}, |
| 101 | {BIO_R_NO_ACCEPT_PORT_SPECIFIED ,"no accept port specified"}, | 119 | {BIO_R_NO_ACCEPT_PORT_SPECIFIED ,"no accept port specified"}, |
| 102 | {BIO_R_NO_HOSTHNAME_SPECIFIED ,"no hosthname specified"}, | 120 | {BIO_R_NO_HOSTNAME_SPECIFIED ,"no hostname specified"}, |
| 103 | {BIO_R_NO_PORT_DEFINED ,"no port defined"}, | 121 | {BIO_R_NO_PORT_DEFINED ,"no port defined"}, |
| 104 | {BIO_R_NO_PORT_SPECIFIED ,"no port specified"}, | 122 | {BIO_R_NO_PORT_SPECIFIED ,"no port specified"}, |
| 123 | {BIO_R_NO_SUCH_FILE ,"no such file"}, | ||
| 105 | {BIO_R_NULL_PARAMETER ,"null parameter"}, | 124 | {BIO_R_NULL_PARAMETER ,"null parameter"}, |
| 125 | {BIO_R_TAG_MISMATCH ,"tag mismatch"}, | ||
| 106 | {BIO_R_UNABLE_TO_BIND_SOCKET ,"unable to bind socket"}, | 126 | {BIO_R_UNABLE_TO_BIND_SOCKET ,"unable to bind socket"}, |
| 107 | {BIO_R_UNABLE_TO_CREATE_SOCKET ,"unable to create socket"}, | 127 | {BIO_R_UNABLE_TO_CREATE_SOCKET ,"unable to create socket"}, |
| 108 | {BIO_R_UNABLE_TO_LISTEN_SOCKET ,"unable to listen socket"}, | 128 | {BIO_R_UNABLE_TO_LISTEN_SOCKET ,"unable to listen socket"}, |
| 109 | {BIO_R_UNINITALISED ,"uninitalised"}, | 129 | {BIO_R_UNINITIALIZED ,"uninitialized"}, |
| 110 | {BIO_R_UNSUPPORTED_METHOD ,"unsupported method"}, | 130 | {BIO_R_UNSUPPORTED_METHOD ,"unsupported method"}, |
| 111 | {BIO_R_WSASTARTUP ,"wsastartup"}, | 131 | {BIO_R_WRITE_TO_READ_ONLY_BIO ,"write to read only BIO"}, |
| 112 | {0,NULL}, | 132 | {BIO_R_WSASTARTUP ,"WSAStartup"}, |
| 133 | {0,NULL} | ||
| 113 | }; | 134 | }; |
| 114 | 135 | ||
| 115 | #endif | 136 | #endif |
| 116 | 137 | ||
| 117 | void ERR_load_BIO_strings() | 138 | void ERR_load_BIO_strings(void) |
| 118 | { | 139 | { |
| 119 | static int init=1; | 140 | static int init=1; |
| 120 | 141 | ||
| 121 | if (init); | 142 | if (init) |
| 122 | {; | 143 | { |
| 123 | init=0; | 144 | init=0; |
| 124 | #ifndef NO_ERR | 145 | #ifndef OPENSSL_NO_ERR |
| 125 | ERR_load_strings(ERR_LIB_BIO,BIO_str_functs); | 146 | ERR_load_strings(ERR_LIB_BIO,BIO_str_functs); |
| 126 | ERR_load_strings(ERR_LIB_BIO,BIO_str_reasons); | 147 | ERR_load_strings(ERR_LIB_BIO,BIO_str_reasons); |
| 127 | #endif | 148 | #endif |
diff --git a/src/lib/libcrypto/bio/bio_lib.c b/src/lib/libcrypto/bio/bio_lib.c index 7a66b0892e..50df2238fa 100644 --- a/src/lib/libcrypto/bio/bio_lib.c +++ b/src/lib/libcrypto/bio/bio_lib.c | |||
| @@ -58,20 +58,16 @@ | |||
| 58 | 58 | ||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "crypto.h" | 61 | #include <openssl/crypto.h> |
| 62 | #include "cryptlib.h" | 62 | #include "cryptlib.h" |
| 63 | #include "bio.h" | 63 | #include <openssl/bio.h> |
| 64 | #include "stack.h" | 64 | #include <openssl/stack.h> |
| 65 | 65 | ||
| 66 | static STACK *bio_meth=NULL; | 66 | BIO *BIO_new(BIO_METHOD *method) |
| 67 | static int bio_meth_num=0; | ||
| 68 | |||
| 69 | BIO *BIO_new(method) | ||
| 70 | BIO_METHOD *method; | ||
| 71 | { | 67 | { |
| 72 | BIO *ret=NULL; | 68 | BIO *ret=NULL; |
| 73 | 69 | ||
| 74 | ret=(BIO *)Malloc(sizeof(BIO)); | 70 | ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); |
| 75 | if (ret == NULL) | 71 | if (ret == NULL) |
| 76 | { | 72 | { |
| 77 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); | 73 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); |
| @@ -79,15 +75,13 @@ BIO_METHOD *method; | |||
| 79 | } | 75 | } |
| 80 | if (!BIO_set(ret,method)) | 76 | if (!BIO_set(ret,method)) |
| 81 | { | 77 | { |
| 82 | Free(ret); | 78 | OPENSSL_free(ret); |
| 83 | ret=NULL; | 79 | ret=NULL; |
| 84 | } | 80 | } |
| 85 | return(ret); | 81 | return(ret); |
| 86 | } | 82 | } |
| 87 | 83 | ||
| 88 | int BIO_set(bio,method) | 84 | int BIO_set(BIO *bio, BIO_METHOD *method) |
| 89 | BIO *bio; | ||
| 90 | BIO_METHOD *method; | ||
| 91 | { | 85 | { |
| 92 | bio->method=method; | 86 | bio->method=method; |
| 93 | bio->callback=NULL; | 87 | bio->callback=NULL; |
| @@ -103,15 +97,18 @@ BIO_METHOD *method; | |||
| 103 | bio->references=1; | 97 | bio->references=1; |
| 104 | bio->num_read=0L; | 98 | bio->num_read=0L; |
| 105 | bio->num_write=0L; | 99 | bio->num_write=0L; |
| 106 | CRYPTO_new_ex_data(bio_meth,(char *)bio,&bio->ex_data); | 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); |
| 107 | if (method->create != NULL) | 101 | if (method->create != NULL) |
| 108 | if (!method->create(bio)) | 102 | if (!method->create(bio)) |
| 103 | { | ||
| 104 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, | ||
| 105 | &bio->ex_data); | ||
| 109 | return(0); | 106 | return(0); |
| 107 | } | ||
| 110 | return(1); | 108 | return(1); |
| 111 | } | 109 | } |
| 112 | 110 | ||
| 113 | int BIO_free(a) | 111 | int BIO_free(BIO *a) |
| 114 | BIO *a; | ||
| 115 | { | 112 | { |
| 116 | int ret=0,i; | 113 | int ret=0,i; |
| 117 | 114 | ||
| @@ -121,7 +118,7 @@ BIO *a; | |||
| 121 | #ifdef REF_PRINT | 118 | #ifdef REF_PRINT |
| 122 | REF_PRINT("BIO",a); | 119 | REF_PRINT("BIO",a); |
| 123 | #endif | 120 | #endif |
| 124 | if (i > 0) return(1); | 121 | if (i > 0) return(1); |
| 125 | #ifdef REF_CHECK | 122 | #ifdef REF_CHECK |
| 126 | if (i < 0) | 123 | if (i < 0) |
| 127 | { | 124 | { |
| @@ -133,18 +130,18 @@ BIO *a; | |||
| 133 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) | 130 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) |
| 134 | return(i); | 131 | return(i); |
| 135 | 132 | ||
| 136 | CRYPTO_free_ex_data(bio_meth,(char *)a,&a->ex_data); | 133 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); |
| 137 | 134 | ||
| 138 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); | 135 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); |
| 139 | ret=a->method->destroy(a); | 136 | ret=a->method->destroy(a); |
| 140 | Free(a); | 137 | OPENSSL_free(a); |
| 141 | return(1); | 138 | return(1); |
| 142 | } | 139 | } |
| 143 | 140 | ||
| 144 | int BIO_read(b,out,outl) | 141 | void BIO_vfree(BIO *a) |
| 145 | BIO *b; | 142 | { BIO_free(a); } |
| 146 | char *out; | 143 | |
| 147 | int outl; | 144 | int BIO_read(BIO *b, void *out, int outl) |
| 148 | { | 145 | { |
| 149 | int i; | 146 | int i; |
| 150 | long (*cb)(); | 147 | long (*cb)(); |
| @@ -162,11 +159,12 @@ int outl; | |||
| 162 | 159 | ||
| 163 | if (!b->init) | 160 | if (!b->init) |
| 164 | { | 161 | { |
| 165 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITALISED); | 162 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); |
| 166 | return(-2); | 163 | return(-2); |
| 167 | } | 164 | } |
| 168 | 165 | ||
| 169 | i=b->method->bread(b,out,outl); | 166 | i=b->method->bread(b,out,outl); |
| 167 | |||
| 170 | if (i > 0) b->num_read+=(unsigned long)i; | 168 | if (i > 0) b->num_read+=(unsigned long)i; |
| 171 | 169 | ||
| 172 | if (cb != NULL) | 170 | if (cb != NULL) |
| @@ -175,10 +173,7 @@ int outl; | |||
| 175 | return(i); | 173 | return(i); |
| 176 | } | 174 | } |
| 177 | 175 | ||
| 178 | int BIO_write(b,in,inl) | 176 | int BIO_write(BIO *b, const void *in, int inl) |
| 179 | BIO *b; | ||
| 180 | char *in; | ||
| 181 | int inl; | ||
| 182 | { | 177 | { |
| 183 | int i; | 178 | int i; |
| 184 | long (*cb)(); | 179 | long (*cb)(); |
| @@ -199,11 +194,12 @@ int inl; | |||
| 199 | 194 | ||
| 200 | if (!b->init) | 195 | if (!b->init) |
| 201 | { | 196 | { |
| 202 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITALISED); | 197 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); |
| 203 | return(-2); | 198 | return(-2); |
| 204 | } | 199 | } |
| 205 | 200 | ||
| 206 | i=b->method->bwrite(b,in,inl); | 201 | i=b->method->bwrite(b,in,inl); |
| 202 | |||
| 207 | if (i > 0) b->num_write+=(unsigned long)i; | 203 | if (i > 0) b->num_write+=(unsigned long)i; |
| 208 | 204 | ||
| 209 | if (cb != NULL) | 205 | if (cb != NULL) |
| @@ -212,9 +208,7 @@ int inl; | |||
| 212 | return(i); | 208 | return(i); |
| 213 | } | 209 | } |
| 214 | 210 | ||
| 215 | int BIO_puts(b,in) | 211 | int BIO_puts(BIO *b, const char *in) |
| 216 | BIO *b; | ||
| 217 | char *in; | ||
| 218 | { | 212 | { |
| 219 | int i; | 213 | int i; |
| 220 | long (*cb)(); | 214 | long (*cb)(); |
| @@ -233,22 +227,21 @@ char *in; | |||
| 233 | 227 | ||
| 234 | if (!b->init) | 228 | if (!b->init) |
| 235 | { | 229 | { |
| 236 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITALISED); | 230 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); |
| 237 | return(-2); | 231 | return(-2); |
| 238 | } | 232 | } |
| 239 | 233 | ||
| 240 | i=b->method->bputs(b,in); | 234 | i=b->method->bputs(b,in); |
| 241 | 235 | ||
| 236 | if (i > 0) b->num_write+=(unsigned long)i; | ||
| 237 | |||
| 242 | if (cb != NULL) | 238 | if (cb != NULL) |
| 243 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, | 239 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, |
| 244 | 0L,(long)i); | 240 | 0L,(long)i); |
| 245 | return(i); | 241 | return(i); |
| 246 | } | 242 | } |
| 247 | 243 | ||
| 248 | int BIO_gets(b,in,inl) | 244 | int BIO_gets(BIO *b, char *in, int inl) |
| 249 | BIO *b; | ||
| 250 | char *in; | ||
| 251 | int inl; | ||
| 252 | { | 245 | { |
| 253 | int i; | 246 | int i; |
| 254 | long (*cb)(); | 247 | long (*cb)(); |
| @@ -267,7 +260,7 @@ int inl; | |||
| 267 | 260 | ||
| 268 | if (!b->init) | 261 | if (!b->init) |
| 269 | { | 262 | { |
| 270 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITALISED); | 263 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); |
| 271 | return(-2); | 264 | return(-2); |
| 272 | } | 265 | } |
| 273 | 266 | ||
| @@ -279,11 +272,7 @@ int inl; | |||
| 279 | return(i); | 272 | return(i); |
| 280 | } | 273 | } |
| 281 | 274 | ||
| 282 | long BIO_int_ctrl(b,cmd,larg,iarg) | 275 | long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) |
| 283 | BIO *b; | ||
| 284 | int cmd; | ||
| 285 | long larg; | ||
| 286 | int iarg; | ||
| 287 | { | 276 | { |
| 288 | int i; | 277 | int i; |
| 289 | 278 | ||
| @@ -291,10 +280,7 @@ int iarg; | |||
| 291 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); | 280 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); |
| 292 | } | 281 | } |
| 293 | 282 | ||
| 294 | char *BIO_ptr_ctrl(b,cmd,larg) | 283 | char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) |
| 295 | BIO *b; | ||
| 296 | int cmd; | ||
| 297 | long larg; | ||
| 298 | { | 284 | { |
| 299 | char *p=NULL; | 285 | char *p=NULL; |
| 300 | 286 | ||
| @@ -304,11 +290,7 @@ long larg; | |||
| 304 | return(p); | 290 | return(p); |
| 305 | } | 291 | } |
| 306 | 292 | ||
| 307 | long BIO_ctrl(b,cmd,larg,parg) | 293 | long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) |
| 308 | BIO *b; | ||
| 309 | int cmd; | ||
| 310 | long larg; | ||
| 311 | char *parg; | ||
| 312 | { | 294 | { |
| 313 | long ret; | 295 | long ret; |
| 314 | long (*cb)(); | 296 | long (*cb)(); |
| @@ -335,9 +317,49 @@ char *parg; | |||
| 335 | return(ret); | 317 | return(ret); |
| 336 | } | 318 | } |
| 337 | 319 | ||
| 320 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) | ||
| 321 | { | ||
| 322 | long ret; | ||
| 323 | long (*cb)(); | ||
| 324 | |||
| 325 | if (b == NULL) return(0); | ||
| 326 | |||
| 327 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) | ||
| 328 | { | ||
| 329 | BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); | ||
| 330 | return(-2); | ||
| 331 | } | ||
| 332 | |||
| 333 | cb=b->callback; | ||
| 334 | |||
| 335 | if ((cb != NULL) && | ||
| 336 | ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) | ||
| 337 | return(ret); | ||
| 338 | |||
| 339 | ret=b->method->callback_ctrl(b,cmd,fp); | ||
| 340 | |||
| 341 | if (cb != NULL) | ||
| 342 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, | ||
| 343 | 0,ret); | ||
| 344 | return(ret); | ||
| 345 | } | ||
| 346 | |||
| 347 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros | ||
| 348 | * do; but those macros have inappropriate return type, and for interfacing | ||
| 349 | * from other programming languages, C macros aren't much of a help anyway. */ | ||
| 350 | size_t BIO_ctrl_pending(BIO *bio) | ||
| 351 | { | ||
| 352 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); | ||
| 353 | } | ||
| 354 | |||
| 355 | size_t BIO_ctrl_wpending(BIO *bio) | ||
| 356 | { | ||
| 357 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); | ||
| 358 | } | ||
| 359 | |||
| 360 | |||
| 338 | /* put the 'bio' on the end of b's list of operators */ | 361 | /* put the 'bio' on the end of b's list of operators */ |
| 339 | BIO *BIO_push(b,bio) | 362 | BIO *BIO_push(BIO *b, BIO *bio) |
| 340 | BIO *b,*bio; | ||
| 341 | { | 363 | { |
| 342 | BIO *lb; | 364 | BIO *lb; |
| 343 | 365 | ||
| @@ -354,8 +376,7 @@ BIO *b,*bio; | |||
| 354 | } | 376 | } |
| 355 | 377 | ||
| 356 | /* Remove the first and return the rest */ | 378 | /* Remove the first and return the rest */ |
| 357 | BIO *BIO_pop(b) | 379 | BIO *BIO_pop(BIO *b) |
| 358 | BIO *b; | ||
| 359 | { | 380 | { |
| 360 | BIO *ret; | 381 | BIO *ret; |
| 361 | 382 | ||
| @@ -373,9 +394,7 @@ BIO *b; | |||
| 373 | return(ret); | 394 | return(ret); |
| 374 | } | 395 | } |
| 375 | 396 | ||
| 376 | BIO *BIO_get_retry_BIO(bio,reason) | 397 | BIO *BIO_get_retry_BIO(BIO *bio, int *reason) |
| 377 | BIO *bio; | ||
| 378 | int *reason; | ||
| 379 | { | 398 | { |
| 380 | BIO *b,*last; | 399 | BIO *b,*last; |
| 381 | 400 | ||
| @@ -391,18 +410,16 @@ int *reason; | |||
| 391 | return(last); | 410 | return(last); |
| 392 | } | 411 | } |
| 393 | 412 | ||
| 394 | int BIO_get_retry_reason(bio) | 413 | int BIO_get_retry_reason(BIO *bio) |
| 395 | BIO *bio; | ||
| 396 | { | 414 | { |
| 397 | return(bio->retry_reason); | 415 | return(bio->retry_reason); |
| 398 | } | 416 | } |
| 399 | 417 | ||
| 400 | BIO *BIO_find_type(bio,type) | 418 | BIO *BIO_find_type(BIO *bio, int type) |
| 401 | BIO *bio; | ||
| 402 | int type; | ||
| 403 | { | 419 | { |
| 404 | int mt,mask; | 420 | int mt,mask; |
| 405 | 421 | ||
| 422 | if(!bio) return NULL; | ||
| 406 | mask=type&0xff; | 423 | mask=type&0xff; |
| 407 | do { | 424 | do { |
| 408 | if (bio->method != NULL) | 425 | if (bio->method != NULL) |
| @@ -421,8 +438,13 @@ int type; | |||
| 421 | return(NULL); | 438 | return(NULL); |
| 422 | } | 439 | } |
| 423 | 440 | ||
| 424 | void BIO_free_all(bio) | 441 | BIO *BIO_next(BIO *b) |
| 425 | BIO *bio; | 442 | { |
| 443 | if(!b) return NULL; | ||
| 444 | return b->next_bio; | ||
| 445 | } | ||
| 446 | |||
| 447 | void BIO_free_all(BIO *bio) | ||
| 426 | { | 448 | { |
| 427 | BIO *b; | 449 | BIO *b; |
| 428 | int ref; | 450 | int ref; |
| @@ -438,8 +460,7 @@ BIO *bio; | |||
| 438 | } | 460 | } |
| 439 | } | 461 | } |
| 440 | 462 | ||
| 441 | BIO *BIO_dup_chain(in) | 463 | BIO *BIO_dup_chain(BIO *in) |
| 442 | BIO *in; | ||
| 443 | { | 464 | { |
| 444 | BIO *ret=NULL,*eoc=NULL,*bio,*new; | 465 | BIO *ret=NULL,*eoc=NULL,*bio,*new; |
| 445 | 466 | ||
| @@ -461,9 +482,10 @@ BIO *in; | |||
| 461 | goto err; | 482 | goto err; |
| 462 | } | 483 | } |
| 463 | 484 | ||
| 464 | /* copy app data */ | 485 | /* copy app data */ |
| 465 | if (!CRYPTO_dup_ex_data(bio_meth,&new->ex_data,&bio->ex_data)) | 486 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new->ex_data, |
| 466 | goto err; | 487 | &bio->ex_data)) |
| 488 | goto err; | ||
| 467 | 489 | ||
| 468 | if (ret == NULL) | 490 | if (ret == NULL) |
| 469 | { | 491 | { |
| @@ -483,37 +505,39 @@ err: | |||
| 483 | return(NULL); | 505 | return(NULL); |
| 484 | } | 506 | } |
| 485 | 507 | ||
| 486 | void BIO_copy_next_retry(b) | 508 | void BIO_copy_next_retry(BIO *b) |
| 487 | BIO *b; | ||
| 488 | { | 509 | { |
| 489 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); | 510 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); |
| 490 | b->retry_reason=b->next_bio->retry_reason; | 511 | b->retry_reason=b->next_bio->retry_reason; |
| 491 | } | 512 | } |
| 492 | 513 | ||
| 493 | int BIO_get_ex_new_index(argl,argp,new_func,dup_func,free_func) | 514 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
| 494 | long argl; | 515 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 495 | char *argp; | 516 | { |
| 496 | int (*new_func)(); | 517 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, |
| 497 | int (*dup_func)(); | 518 | new_func, dup_func, free_func); |
| 498 | void (*free_func)(); | 519 | } |
| 499 | { | 520 | |
| 500 | bio_meth_num++; | 521 | int BIO_set_ex_data(BIO *bio, int idx, void *data) |
| 501 | return(CRYPTO_get_ex_new_index(bio_meth_num-1,&bio_meth, | ||
| 502 | argl,argp,new_func,dup_func,free_func)); | ||
| 503 | } | ||
| 504 | |||
| 505 | int BIO_set_ex_data(bio,idx,data) | ||
| 506 | BIO *bio; | ||
| 507 | int idx; | ||
| 508 | char *data; | ||
| 509 | { | 522 | { |
| 510 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); | 523 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); |
| 511 | } | 524 | } |
| 512 | 525 | ||
| 513 | char *BIO_get_ex_data(bio,idx) | 526 | void *BIO_get_ex_data(BIO *bio, int idx) |
| 514 | BIO *bio; | ||
| 515 | int idx; | ||
| 516 | { | 527 | { |
| 517 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); | 528 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); |
| 518 | } | 529 | } |
| 519 | 530 | ||
| 531 | unsigned long BIO_number_read(BIO *bio) | ||
| 532 | { | ||
| 533 | if(bio) return bio->num_read; | ||
| 534 | return 0; | ||
| 535 | } | ||
| 536 | |||
| 537 | unsigned long BIO_number_written(BIO *bio) | ||
| 538 | { | ||
| 539 | if(bio) return bio->num_write; | ||
| 540 | return 0; | ||
| 541 | } | ||
| 542 | |||
| 543 | IMPLEMENT_STACK_OF(BIO) | ||
diff --git a/src/lib/libcrypto/bio/bss_acpt.c b/src/lib/libcrypto/bio/bss_acpt.c index e49902fa9f..8ea1db158b 100644 --- a/src/lib/libcrypto/bio/bss_acpt.c +++ b/src/lib/libcrypto/bio/bss_acpt.c | |||
| @@ -56,22 +56,25 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef NO_SOCK | 59 | #ifndef OPENSSL_NO_SOCK |
| 60 | 60 | ||
| 61 | #include <stdio.h> | 61 | #include <stdio.h> |
| 62 | #include <errno.h> | 62 | #include <errno.h> |
| 63 | #define USE_SOCKETS | 63 | #define USE_SOCKETS |
| 64 | #include "cryptlib.h" | 64 | #include "cryptlib.h" |
| 65 | #include "bio.h" | 65 | #include <openssl/bio.h> |
| 66 | 66 | ||
| 67 | /* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */ | 67 | #ifdef OPENSSL_SYS_WIN16 |
| 68 | |||
| 69 | #ifdef WIN16 | ||
| 70 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ | 68 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ |
| 71 | #else | 69 | #else |
| 72 | #define SOCKET_PROTOCOL IPPROTO_TCP | 70 | #define SOCKET_PROTOCOL IPPROTO_TCP |
| 73 | #endif | 71 | #endif |
| 74 | 72 | ||
| 73 | #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000) | ||
| 74 | /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */ | ||
| 75 | #undef FIONBIO | ||
| 76 | #endif | ||
| 77 | |||
| 75 | typedef struct bio_accept_st | 78 | typedef struct bio_accept_st |
| 76 | { | 79 | { |
| 77 | int state; | 80 | int state; |
| @@ -82,39 +85,24 @@ typedef struct bio_accept_st | |||
| 82 | 85 | ||
| 83 | char *addr; | 86 | char *addr; |
| 84 | int nbio; | 87 | int nbio; |
| 88 | /* If 0, it means normal, if 1, do a connect on bind failure, | ||
| 89 | * and if there is no-one listening, bind with SO_REUSEADDR. | ||
| 90 | * If 2, always use SO_REUSEADDR. */ | ||
| 91 | int bind_mode; | ||
| 85 | BIO *bio_chain; | 92 | BIO *bio_chain; |
| 86 | } BIO_ACCEPT; | 93 | } BIO_ACCEPT; |
| 87 | 94 | ||
| 88 | #ifndef NOPROTO | 95 | static int acpt_write(BIO *h, const char *buf, int num); |
| 89 | static int acpt_write(BIO *h,char *buf,int num); | 96 | static int acpt_read(BIO *h, char *buf, int size); |
| 90 | static int acpt_read(BIO *h,char *buf,int size); | 97 | static int acpt_puts(BIO *h, const char *str); |
| 91 | static int acpt_puts(BIO *h,char *str); | 98 | static long acpt_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 92 | static long acpt_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 93 | static int acpt_new(BIO *h); | 99 | static int acpt_new(BIO *h); |
| 94 | static int acpt_free(BIO *data); | 100 | static int acpt_free(BIO *data); |
| 95 | #else | ||
| 96 | static int acpt_write(); | ||
| 97 | static int acpt_read(); | ||
| 98 | static int acpt_puts(); | ||
| 99 | static long acpt_ctrl(); | ||
| 100 | static int acpt_new(); | ||
| 101 | static int acpt_free(); | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #ifndef NOPROTO | ||
| 105 | static int acpt_state(BIO *b, BIO_ACCEPT *c); | 101 | static int acpt_state(BIO *b, BIO_ACCEPT *c); |
| 106 | static void acpt_close_socket(BIO *data); | 102 | static void acpt_close_socket(BIO *data); |
| 107 | BIO_ACCEPT *BIO_ACCEPT_new(void ); | 103 | BIO_ACCEPT *BIO_ACCEPT_new(void ); |
| 108 | void BIO_ACCEPT_free(BIO_ACCEPT *a); | 104 | void BIO_ACCEPT_free(BIO_ACCEPT *a); |
| 109 | 105 | ||
| 110 | #else | ||
| 111 | |||
| 112 | static int acpt_state(); | ||
| 113 | static void acpt_close_socket(); | ||
| 114 | BIO_ACCEPT *BIO_ACCEPT_new(); | ||
| 115 | void BIO_ACCEPT_free(); | ||
| 116 | #endif | ||
| 117 | |||
| 118 | #define ACPT_S_BEFORE 1 | 106 | #define ACPT_S_BEFORE 1 |
| 119 | #define ACPT_S_GET_ACCEPT_SOCKET 2 | 107 | #define ACPT_S_GET_ACCEPT_SOCKET 2 |
| 120 | #define ACPT_S_OK 3 | 108 | #define ACPT_S_OK 3 |
| @@ -130,15 +118,15 @@ static BIO_METHOD methods_acceptp= | |||
| 130 | acpt_ctrl, | 118 | acpt_ctrl, |
| 131 | acpt_new, | 119 | acpt_new, |
| 132 | acpt_free, | 120 | acpt_free, |
| 121 | NULL, | ||
| 133 | }; | 122 | }; |
| 134 | 123 | ||
| 135 | BIO_METHOD *BIO_s_accept() | 124 | BIO_METHOD *BIO_s_accept(void) |
| 136 | { | 125 | { |
| 137 | return(&methods_acceptp); | 126 | return(&methods_acceptp); |
| 138 | } | 127 | } |
| 139 | 128 | ||
| 140 | static int acpt_new(bi) | 129 | static int acpt_new(BIO *bi) |
| 141 | BIO *bi; | ||
| 142 | { | 130 | { |
| 143 | BIO_ACCEPT *ba; | 131 | BIO_ACCEPT *ba; |
| 144 | 132 | ||
| @@ -153,29 +141,31 @@ BIO *bi; | |||
| 153 | return(1); | 141 | return(1); |
| 154 | } | 142 | } |
| 155 | 143 | ||
| 156 | BIO_ACCEPT *BIO_ACCEPT_new() | 144 | BIO_ACCEPT *BIO_ACCEPT_new(void) |
| 157 | { | 145 | { |
| 158 | BIO_ACCEPT *ret; | 146 | BIO_ACCEPT *ret; |
| 159 | 147 | ||
| 160 | if ((ret=(BIO_ACCEPT *)Malloc(sizeof(BIO_ACCEPT))) == NULL) | 148 | if ((ret=(BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) |
| 161 | return(NULL); | 149 | return(NULL); |
| 162 | 150 | ||
| 163 | memset(ret,0,sizeof(BIO_ACCEPT)); | 151 | memset(ret,0,sizeof(BIO_ACCEPT)); |
| 164 | ret->accept_sock=INVALID_SOCKET; | 152 | ret->accept_sock=INVALID_SOCKET; |
| 153 | ret->bind_mode=BIO_BIND_NORMAL; | ||
| 165 | return(ret); | 154 | return(ret); |
| 166 | } | 155 | } |
| 167 | 156 | ||
| 168 | void BIO_ACCEPT_free(a) | 157 | void BIO_ACCEPT_free(BIO_ACCEPT *a) |
| 169 | BIO_ACCEPT *a; | ||
| 170 | { | 158 | { |
| 171 | if (a->param_addr != NULL) Free(a->param_addr); | 159 | if(a == NULL) |
| 172 | if (a->addr != NULL) Free(a->addr); | 160 | return; |
| 161 | |||
| 162 | if (a->param_addr != NULL) OPENSSL_free(a->param_addr); | ||
| 163 | if (a->addr != NULL) OPENSSL_free(a->addr); | ||
| 173 | if (a->bio_chain != NULL) BIO_free(a->bio_chain); | 164 | if (a->bio_chain != NULL) BIO_free(a->bio_chain); |
| 174 | Free(a); | 165 | OPENSSL_free(a); |
| 175 | } | 166 | } |
| 176 | 167 | ||
| 177 | static void acpt_close_socket(bio) | 168 | static void acpt_close_socket(BIO *bio) |
| 178 | BIO *bio; | ||
| 179 | { | 169 | { |
| 180 | BIO_ACCEPT *c; | 170 | BIO_ACCEPT *c; |
| 181 | 171 | ||
| @@ -183,18 +173,13 @@ BIO *bio; | |||
| 183 | if (c->accept_sock != INVALID_SOCKET) | 173 | if (c->accept_sock != INVALID_SOCKET) |
| 184 | { | 174 | { |
| 185 | shutdown(c->accept_sock,2); | 175 | shutdown(c->accept_sock,2); |
| 186 | # ifdef WINDOWS | ||
| 187 | closesocket(c->accept_sock); | 176 | closesocket(c->accept_sock); |
| 188 | # else | ||
| 189 | close(c->accept_sock); | ||
| 190 | # endif | ||
| 191 | c->accept_sock=INVALID_SOCKET; | 177 | c->accept_sock=INVALID_SOCKET; |
| 192 | bio->num=INVALID_SOCKET; | 178 | bio->num=INVALID_SOCKET; |
| 193 | } | 179 | } |
| 194 | } | 180 | } |
| 195 | 181 | ||
| 196 | static int acpt_free(a) | 182 | static int acpt_free(BIO *a) |
| 197 | BIO *a; | ||
| 198 | { | 183 | { |
| 199 | BIO_ACCEPT *data; | 184 | BIO_ACCEPT *data; |
| 200 | 185 | ||
| @@ -212,12 +197,9 @@ BIO *a; | |||
| 212 | return(1); | 197 | return(1); |
| 213 | } | 198 | } |
| 214 | 199 | ||
| 215 | static int acpt_state(b,c) | 200 | static int acpt_state(BIO *b, BIO_ACCEPT *c) |
| 216 | BIO *b; | ||
| 217 | BIO_ACCEPT *c; | ||
| 218 | { | 201 | { |
| 219 | BIO *bio=NULL,*dbio; | 202 | BIO *bio=NULL,*dbio; |
| 220 | unsigned long l=1; | ||
| 221 | int s= -1; | 203 | int s= -1; |
| 222 | int i; | 204 | int i; |
| 223 | 205 | ||
| @@ -230,56 +212,58 @@ again: | |||
| 230 | BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); | 212 | BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); |
| 231 | return(-1); | 213 | return(-1); |
| 232 | } | 214 | } |
| 233 | s=BIO_get_accept_socket(c->param_addr); | 215 | s=BIO_get_accept_socket(c->param_addr,c->bind_mode); |
| 234 | if (s == INVALID_SOCKET) | 216 | if (s == INVALID_SOCKET) |
| 235 | return(-1); | 217 | return(-1); |
| 236 | 218 | ||
| 237 | #ifdef FIONBIO | ||
| 238 | if (c->accept_nbio) | 219 | if (c->accept_nbio) |
| 239 | { | 220 | { |
| 240 | i=BIO_socket_ioctl(b->num,FIONBIO,&l); | 221 | if (!BIO_socket_nbio(s,1)) |
| 241 | if (i < 0) | ||
| 242 | { | 222 | { |
| 243 | #ifdef WINDOWS | ||
| 244 | closesocket(s); | 223 | closesocket(s); |
| 245 | #else | ||
| 246 | close(s); | ||
| 247 | # endif | ||
| 248 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); | 224 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); |
| 249 | return(-1); | 225 | return(-1); |
| 250 | } | 226 | } |
| 251 | } | 227 | } |
| 252 | #endif | ||
| 253 | c->accept_sock=s; | 228 | c->accept_sock=s; |
| 254 | b->num=s; | 229 | b->num=s; |
| 255 | c->state=ACPT_S_GET_ACCEPT_SOCKET; | 230 | c->state=ACPT_S_GET_ACCEPT_SOCKET; |
| 256 | return(1); | 231 | return(1); |
| 257 | break; | 232 | /* break; */ |
| 258 | case ACPT_S_GET_ACCEPT_SOCKET: | 233 | case ACPT_S_GET_ACCEPT_SOCKET: |
| 259 | if (b->next_bio != NULL) | 234 | if (b->next_bio != NULL) |
| 260 | { | 235 | { |
| 261 | c->state=ACPT_S_OK; | 236 | c->state=ACPT_S_OK; |
| 262 | goto again; | 237 | goto again; |
| 263 | } | 238 | } |
| 239 | BIO_clear_retry_flags(b); | ||
| 240 | b->retry_reason=0; | ||
| 264 | i=BIO_accept(c->accept_sock,&(c->addr)); | 241 | i=BIO_accept(c->accept_sock,&(c->addr)); |
| 242 | |||
| 243 | /* -2 return means we should retry */ | ||
| 244 | if(i == -2) | ||
| 245 | { | ||
| 246 | BIO_set_retry_special(b); | ||
| 247 | b->retry_reason=BIO_RR_ACCEPT; | ||
| 248 | return -1; | ||
| 249 | } | ||
| 250 | |||
| 265 | if (i < 0) return(i); | 251 | if (i < 0) return(i); |
| 252 | |||
| 266 | bio=BIO_new_socket(i,BIO_CLOSE); | 253 | bio=BIO_new_socket(i,BIO_CLOSE); |
| 267 | if (bio == NULL) goto err; | 254 | if (bio == NULL) goto err; |
| 268 | 255 | ||
| 269 | BIO_set_callback(bio,BIO_get_callback(b)); | 256 | BIO_set_callback(bio,BIO_get_callback(b)); |
| 270 | BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); | 257 | BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); |
| 271 | 258 | ||
| 272 | #ifdef FIONBIO | ||
| 273 | if (c->nbio) | 259 | if (c->nbio) |
| 274 | { | 260 | { |
| 275 | i=BIO_socket_ioctl(i,FIONBIO,&l); | 261 | if (!BIO_socket_nbio(i,1)) |
| 276 | if (i < 0) | ||
| 277 | { | 262 | { |
| 278 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); | 263 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); |
| 279 | goto err; | 264 | goto err; |
| 280 | } | 265 | } |
| 281 | } | 266 | } |
| 282 | #endif | ||
| 283 | 267 | ||
| 284 | /* If the accept BIO has an bio_chain, we dup it and | 268 | /* If the accept BIO has an bio_chain, we dup it and |
| 285 | * put the new socket at the end. */ | 269 | * put the new socket at the end. */ |
| @@ -298,15 +282,9 @@ err: | |||
| 298 | if (bio != NULL) | 282 | if (bio != NULL) |
| 299 | BIO_free(bio); | 283 | BIO_free(bio); |
| 300 | else if (s >= 0) | 284 | else if (s >= 0) |
| 301 | { | ||
| 302 | #ifdef WINDOWS | ||
| 303 | closesocket(s); | 285 | closesocket(s); |
| 304 | #else | ||
| 305 | close(s); | ||
| 306 | # endif | ||
| 307 | } | ||
| 308 | return(0); | 286 | return(0); |
| 309 | break; | 287 | /* break; */ |
| 310 | case ACPT_S_OK: | 288 | case ACPT_S_OK: |
| 311 | if (b->next_bio == NULL) | 289 | if (b->next_bio == NULL) |
| 312 | { | 290 | { |
| @@ -314,23 +292,20 @@ err: | |||
| 314 | goto again; | 292 | goto again; |
| 315 | } | 293 | } |
| 316 | return(1); | 294 | return(1); |
| 317 | break; | 295 | /* break; */ |
| 318 | default: | 296 | default: |
| 319 | return(0); | 297 | return(0); |
| 320 | break; | 298 | /* break; */ |
| 321 | } | 299 | } |
| 322 | 300 | ||
| 323 | } | 301 | } |
| 324 | 302 | ||
| 325 | static int acpt_read(b,out,outl) | 303 | static int acpt_read(BIO *b, char *out, int outl) |
| 326 | BIO *b; | ||
| 327 | char *out; | ||
| 328 | int outl; | ||
| 329 | { | 304 | { |
| 330 | int ret=0; | 305 | int ret=0; |
| 331 | BIO_ACCEPT *data; | 306 | BIO_ACCEPT *data; |
| 332 | 307 | ||
| 333 | BIO_clear_retry_flags(b); | 308 | BIO_clear_retry_flags(b); |
| 334 | data=(BIO_ACCEPT *)b->ptr; | 309 | data=(BIO_ACCEPT *)b->ptr; |
| 335 | 310 | ||
| 336 | while (b->next_bio == NULL) | 311 | while (b->next_bio == NULL) |
| @@ -344,10 +319,7 @@ int outl; | |||
| 344 | return(ret); | 319 | return(ret); |
| 345 | } | 320 | } |
| 346 | 321 | ||
| 347 | static int acpt_write(b,in,inl) | 322 | static int acpt_write(BIO *b, const char *in, int inl) |
| 348 | BIO *b; | ||
| 349 | char *in; | ||
| 350 | int inl; | ||
| 351 | { | 323 | { |
| 352 | int ret; | 324 | int ret; |
| 353 | BIO_ACCEPT *data; | 325 | BIO_ACCEPT *data; |
| @@ -366,11 +338,7 @@ int inl; | |||
| 366 | return(ret); | 338 | return(ret); |
| 367 | } | 339 | } |
| 368 | 340 | ||
| 369 | static long acpt_ctrl(b,cmd,num,ptr) | 341 | static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 370 | BIO *b; | ||
| 371 | int cmd; | ||
| 372 | long num; | ||
| 373 | char *ptr; | ||
| 374 | { | 342 | { |
| 375 | BIO *dbio; | 343 | BIO *dbio; |
| 376 | int *ip; | 344 | int *ip; |
| @@ -399,7 +367,7 @@ char *ptr; | |||
| 399 | { | 367 | { |
| 400 | b->init=1; | 368 | b->init=1; |
| 401 | if (data->param_addr != NULL) | 369 | if (data->param_addr != NULL) |
| 402 | Free(data->param_addr); | 370 | OPENSSL_free(data->param_addr); |
| 403 | data->param_addr=BUF_strdup(ptr); | 371 | data->param_addr=BUF_strdup(ptr); |
| 404 | } | 372 | } |
| 405 | else if (num == 1) | 373 | else if (num == 1) |
| @@ -417,13 +385,21 @@ char *ptr; | |||
| 417 | case BIO_C_SET_NBIO: | 385 | case BIO_C_SET_NBIO: |
| 418 | data->nbio=(int)num; | 386 | data->nbio=(int)num; |
| 419 | break; | 387 | break; |
| 388 | case BIO_C_SET_FD: | ||
| 389 | b->init=1; | ||
| 390 | b->num= *((int *)ptr); | ||
| 391 | data->accept_sock=b->num; | ||
| 392 | data->state=ACPT_S_GET_ACCEPT_SOCKET; | ||
| 393 | b->shutdown=(int)num; | ||
| 394 | b->init=1; | ||
| 395 | break; | ||
| 420 | case BIO_C_GET_FD: | 396 | case BIO_C_GET_FD: |
| 421 | if (b->init) | 397 | if (b->init) |
| 422 | { | 398 | { |
| 423 | ip=(int *)ptr; | 399 | ip=(int *)ptr; |
| 424 | if (ip != NULL) | 400 | if (ip != NULL) |
| 425 | *ip=data->accept_sock; | 401 | *ip=data->accept_sock; |
| 426 | ret=b->num; | 402 | ret=data->accept_sock; |
| 427 | } | 403 | } |
| 428 | else | 404 | else |
| 429 | ret= -1; | 405 | ret= -1; |
| @@ -454,6 +430,12 @@ char *ptr; | |||
| 454 | break; | 430 | break; |
| 455 | case BIO_CTRL_FLUSH: | 431 | case BIO_CTRL_FLUSH: |
| 456 | break; | 432 | break; |
| 433 | case BIO_C_SET_BIND_MODE: | ||
| 434 | data->bind_mode=(int)num; | ||
| 435 | break; | ||
| 436 | case BIO_C_GET_BIND_MODE: | ||
| 437 | ret=(long)data->bind_mode; | ||
| 438 | break; | ||
| 457 | case BIO_CTRL_DUP: | 439 | case BIO_CTRL_DUP: |
| 458 | dbio=(BIO *)ptr; | 440 | dbio=(BIO *)ptr; |
| 459 | /* if (data->param_port) EAY EAY | 441 | /* if (data->param_port) EAY EAY |
| @@ -470,9 +452,7 @@ char *ptr; | |||
| 470 | return(ret); | 452 | return(ret); |
| 471 | } | 453 | } |
| 472 | 454 | ||
| 473 | static int acpt_puts(bp,str) | 455 | static int acpt_puts(BIO *bp, const char *str) |
| 474 | BIO *bp; | ||
| 475 | char *str; | ||
| 476 | { | 456 | { |
| 477 | int n,ret; | 457 | int n,ret; |
| 478 | 458 | ||
| @@ -481,8 +461,7 @@ char *str; | |||
| 481 | return(ret); | 461 | return(ret); |
| 482 | } | 462 | } |
| 483 | 463 | ||
| 484 | BIO *BIO_new_accept(str) | 464 | BIO *BIO_new_accept(char *str) |
| 485 | char *str; | ||
| 486 | { | 465 | { |
| 487 | BIO *ret; | 466 | BIO *ret; |
| 488 | 467 | ||
diff --git a/src/lib/libcrypto/bio/bss_bio.c b/src/lib/libcrypto/bio/bss_bio.c index 562e9d8de2..1c485a4479 100644 --- a/src/lib/libcrypto/bio/bss_bio.c +++ b/src/lib/libcrypto/bio/bss_bio.c | |||
| @@ -7,25 +7,46 @@ | |||
| 7 | * for which no specific BIO method is available. | 7 | * for which no specific BIO method is available. |
| 8 | * See ssl/ssltest.c for some hints on how this can be used. */ | 8 | * See ssl/ssltest.c for some hints on how this can be used. */ |
| 9 | 9 | ||
| 10 | /* BIO_DEBUG implies BIO_PAIR_DEBUG */ | ||
| 11 | #ifdef BIO_DEBUG | ||
| 12 | # ifndef BIO_PAIR_DEBUG | ||
| 13 | # define BIO_PAIR_DEBUG | ||
| 14 | # endif | ||
| 15 | #endif | ||
| 16 | |||
| 17 | /* disable assert() unless BIO_PAIR_DEBUG has been defined */ | ||
| 10 | #ifndef BIO_PAIR_DEBUG | 18 | #ifndef BIO_PAIR_DEBUG |
| 11 | # undef NDEBUG /* avoid conflicting definitions */ | 19 | # ifndef NDEBUG |
| 12 | # define NDEBUG | 20 | # define NDEBUG |
| 21 | # endif | ||
| 13 | #endif | 22 | #endif |
| 14 | 23 | ||
| 15 | #include <assert.h> | 24 | #include <assert.h> |
| 25 | #include <limits.h> | ||
| 16 | #include <stdlib.h> | 26 | #include <stdlib.h> |
| 17 | #include <string.h> | 27 | #include <string.h> |
| 18 | 28 | ||
| 19 | #include <openssl/bio.h> | 29 | #include <openssl/bio.h> |
| 20 | #include <openssl/err.h> | 30 | #include <openssl/err.h> |
| 31 | #include <openssl/err.h> | ||
| 21 | #include <openssl/crypto.h> | 32 | #include <openssl/crypto.h> |
| 22 | 33 | ||
| 34 | #include "e_os.h" | ||
| 35 | |||
| 36 | /* VxWorks defines SSIZE_MAX with an empty value causing compile errors */ | ||
| 37 | #if defined(OPENSSL_SYS_VSWORKS) | ||
| 38 | # undef SSIZE_MAX | ||
| 39 | #endif | ||
| 40 | #ifndef SSIZE_MAX | ||
| 41 | # define SSIZE_MAX INT_MAX | ||
| 42 | #endif | ||
| 43 | |||
| 23 | static int bio_new(BIO *bio); | 44 | static int bio_new(BIO *bio); |
| 24 | static int bio_free(BIO *bio); | 45 | static int bio_free(BIO *bio); |
| 25 | static int bio_read(BIO *bio, char *buf, int size); | 46 | static int bio_read(BIO *bio, char *buf, int size); |
| 26 | static int bio_write(BIO *bio, char *buf, int num); | 47 | static int bio_write(BIO *bio, const char *buf, int num); |
| 27 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr); | 48 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr); |
| 28 | static int bio_puts(BIO *bio, char *str); | 49 | static int bio_puts(BIO *bio, const char *str); |
| 29 | 50 | ||
| 30 | static int bio_make_pair(BIO *bio1, BIO *bio2); | 51 | static int bio_make_pair(BIO *bio1, BIO *bio2); |
| 31 | static void bio_destroy_pair(BIO *bio); | 52 | static void bio_destroy_pair(BIO *bio); |
| @@ -40,7 +61,8 @@ static BIO_METHOD methods_biop = | |||
| 40 | NULL /* no bio_gets */, | 61 | NULL /* no bio_gets */, |
| 41 | bio_ctrl, | 62 | bio_ctrl, |
| 42 | bio_new, | 63 | bio_new, |
| 43 | bio_free | 64 | bio_free, |
| 65 | NULL /* no bio_callback_ctrl */ | ||
| 44 | }; | 66 | }; |
| 45 | 67 | ||
| 46 | BIO_METHOD *BIO_s_bio(void) | 68 | BIO_METHOD *BIO_s_bio(void) |
| @@ -64,7 +86,7 @@ struct bio_bio_st | |||
| 64 | 86 | ||
| 65 | size_t request; /* valid iff peer != NULL; 0 if len != 0, | 87 | size_t request; /* valid iff peer != NULL; 0 if len != 0, |
| 66 | * otherwise set by peer to number of bytes | 88 | * otherwise set by peer to number of bytes |
| 67 | * it (unsuccesfully) tried to read, | 89 | * it (unsuccessfully) tried to read, |
| 68 | * never more than buffer space (size-len) warrants. */ | 90 | * never more than buffer space (size-len) warrants. */ |
| 69 | }; | 91 | }; |
| 70 | 92 | ||
| @@ -72,7 +94,7 @@ static int bio_new(BIO *bio) | |||
| 72 | { | 94 | { |
| 73 | struct bio_bio_st *b; | 95 | struct bio_bio_st *b; |
| 74 | 96 | ||
| 75 | b = Malloc(sizeof *b); | 97 | b = OPENSSL_malloc(sizeof *b); |
| 76 | if (b == NULL) | 98 | if (b == NULL) |
| 77 | return 0; | 99 | return 0; |
| 78 | 100 | ||
| @@ -100,10 +122,10 @@ static int bio_free(BIO *bio) | |||
| 100 | 122 | ||
| 101 | if (b->buf != NULL) | 123 | if (b->buf != NULL) |
| 102 | { | 124 | { |
| 103 | Free(b->buf); | 125 | OPENSSL_free(b->buf); |
| 104 | } | 126 | } |
| 105 | 127 | ||
| 106 | Free(b); | 128 | OPENSSL_free(b); |
| 107 | 129 | ||
| 108 | return 1; | 130 | return 1; |
| 109 | } | 131 | } |
| @@ -195,7 +217,87 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 195 | return size; | 217 | return size; |
| 196 | } | 218 | } |
| 197 | 219 | ||
| 198 | static int bio_write(BIO *bio, char *buf, int num_) | 220 | /* non-copying interface: provide pointer to available data in buffer |
| 221 | * bio_nread0: return number of available bytes | ||
| 222 | * bio_nread: also advance index | ||
| 223 | * (example usage: bio_nread0(), read from buffer, bio_nread() | ||
| 224 | * or just bio_nread(), read from buffer) | ||
| 225 | */ | ||
| 226 | /* WARNING: The non-copying interface is largely untested as of yet | ||
| 227 | * and may contain bugs. */ | ||
| 228 | static ssize_t bio_nread0(BIO *bio, char **buf) | ||
| 229 | { | ||
| 230 | struct bio_bio_st *b, *peer_b; | ||
| 231 | ssize_t num; | ||
| 232 | |||
| 233 | BIO_clear_retry_flags(bio); | ||
| 234 | |||
| 235 | if (!bio->init) | ||
| 236 | return 0; | ||
| 237 | |||
| 238 | b = bio->ptr; | ||
| 239 | assert(b != NULL); | ||
| 240 | assert(b->peer != NULL); | ||
| 241 | peer_b = b->peer->ptr; | ||
| 242 | assert(peer_b != NULL); | ||
| 243 | assert(peer_b->buf != NULL); | ||
| 244 | |||
| 245 | peer_b->request = 0; | ||
| 246 | |||
| 247 | if (peer_b->len == 0) | ||
| 248 | { | ||
| 249 | char dummy; | ||
| 250 | |||
| 251 | /* avoid code duplication -- nothing available for reading */ | ||
| 252 | return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ | ||
| 253 | } | ||
| 254 | |||
| 255 | num = peer_b->len; | ||
| 256 | if (peer_b->size < peer_b->offset + num) | ||
| 257 | /* no ring buffer wrap-around for non-copying interface */ | ||
| 258 | num = peer_b->size - peer_b->offset; | ||
| 259 | assert(num > 0); | ||
| 260 | |||
| 261 | if (buf != NULL) | ||
| 262 | *buf = peer_b->buf + peer_b->offset; | ||
| 263 | return num; | ||
| 264 | } | ||
| 265 | |||
| 266 | static ssize_t bio_nread(BIO *bio, char **buf, size_t num_) | ||
| 267 | { | ||
| 268 | struct bio_bio_st *b, *peer_b; | ||
| 269 | ssize_t num, available; | ||
| 270 | |||
| 271 | if (num_ > SSIZE_MAX) | ||
| 272 | num = SSIZE_MAX; | ||
| 273 | else | ||
| 274 | num = (ssize_t)num_; | ||
| 275 | |||
| 276 | available = bio_nread0(bio, buf); | ||
| 277 | if (num > available) | ||
| 278 | num = available; | ||
| 279 | if (num <= 0) | ||
| 280 | return num; | ||
| 281 | |||
| 282 | b = bio->ptr; | ||
| 283 | peer_b = b->peer->ptr; | ||
| 284 | |||
| 285 | peer_b->len -= num; | ||
| 286 | if (peer_b->len) | ||
| 287 | { | ||
| 288 | peer_b->offset += num; | ||
| 289 | assert(peer_b->offset <= peer_b->size); | ||
| 290 | if (peer_b->offset == peer_b->size) | ||
| 291 | peer_b->offset = 0; | ||
| 292 | } | ||
| 293 | else | ||
| 294 | peer_b->offset = 0; | ||
| 295 | |||
| 296 | return num; | ||
| 297 | } | ||
| 298 | |||
| 299 | |||
| 300 | static int bio_write(BIO *bio, const char *buf, int num_) | ||
| 199 | { | 301 | { |
| 200 | size_t num = num_; | 302 | size_t num = num_; |
| 201 | size_t rest; | 303 | size_t rest; |
| @@ -268,6 +370,83 @@ static int bio_write(BIO *bio, char *buf, int num_) | |||
| 268 | return num; | 370 | return num; |
| 269 | } | 371 | } |
| 270 | 372 | ||
| 373 | /* non-copying interface: provide pointer to region to write to | ||
| 374 | * bio_nwrite0: check how much space is available | ||
| 375 | * bio_nwrite: also increase length | ||
| 376 | * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() | ||
| 377 | * or just bio_nwrite(), write to buffer) | ||
| 378 | */ | ||
| 379 | static ssize_t bio_nwrite0(BIO *bio, char **buf) | ||
| 380 | { | ||
| 381 | struct bio_bio_st *b; | ||
| 382 | size_t num; | ||
| 383 | size_t write_offset; | ||
| 384 | |||
| 385 | BIO_clear_retry_flags(bio); | ||
| 386 | |||
| 387 | if (!bio->init) | ||
| 388 | return 0; | ||
| 389 | |||
| 390 | b = bio->ptr; | ||
| 391 | assert(b != NULL); | ||
| 392 | assert(b->peer != NULL); | ||
| 393 | assert(b->buf != NULL); | ||
| 394 | |||
| 395 | b->request = 0; | ||
| 396 | if (b->closed) | ||
| 397 | { | ||
| 398 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); | ||
| 399 | return -1; | ||
| 400 | } | ||
| 401 | |||
| 402 | assert(b->len <= b->size); | ||
| 403 | |||
| 404 | if (b->len == b->size) | ||
| 405 | { | ||
| 406 | BIO_set_retry_write(bio); | ||
| 407 | return -1; | ||
| 408 | } | ||
| 409 | |||
| 410 | num = b->size - b->len; | ||
| 411 | write_offset = b->offset + b->len; | ||
| 412 | if (write_offset >= b->size) | ||
| 413 | write_offset -= b->size; | ||
| 414 | if (write_offset + num > b->size) | ||
| 415 | /* no ring buffer wrap-around for non-copying interface | ||
| 416 | * (to fulfil the promise by BIO_ctrl_get_write_guarantee, | ||
| 417 | * BIO_nwrite may have to be called twice) */ | ||
| 418 | num = b->size - write_offset; | ||
| 419 | |||
| 420 | if (buf != NULL) | ||
| 421 | *buf = b->buf + write_offset; | ||
| 422 | assert(write_offset + num <= b->size); | ||
| 423 | |||
| 424 | return num; | ||
| 425 | } | ||
| 426 | |||
| 427 | static ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) | ||
| 428 | { | ||
| 429 | struct bio_bio_st *b; | ||
| 430 | ssize_t num, space; | ||
| 431 | |||
| 432 | if (num_ > SSIZE_MAX) | ||
| 433 | num = SSIZE_MAX; | ||
| 434 | else | ||
| 435 | num = (ssize_t)num_; | ||
| 436 | |||
| 437 | space = bio_nwrite0(bio, buf); | ||
| 438 | if (num > space) | ||
| 439 | num = space; | ||
| 440 | if (num <= 0) | ||
| 441 | return num; | ||
| 442 | b = bio->ptr; | ||
| 443 | assert(b != NULL); | ||
| 444 | b->len += num; | ||
| 445 | assert(b->len <= b->size); | ||
| 446 | |||
| 447 | return num; | ||
| 448 | } | ||
| 449 | |||
| 271 | 450 | ||
| 272 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | 451 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) |
| 273 | { | 452 | { |
| @@ -299,7 +478,7 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 299 | { | 478 | { |
| 300 | if (b->buf) | 479 | if (b->buf) |
| 301 | { | 480 | { |
| 302 | Free(b->buf); | 481 | OPENSSL_free(b->buf); |
| 303 | b->buf = NULL; | 482 | b->buf = NULL; |
| 304 | } | 483 | } |
| 305 | b->size = new_size; | 484 | b->size = new_size; |
| @@ -309,7 +488,8 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 309 | break; | 488 | break; |
| 310 | 489 | ||
| 311 | case BIO_C_GET_WRITE_BUF_SIZE: | 490 | case BIO_C_GET_WRITE_BUF_SIZE: |
| 312 | num = (long) b->size; | 491 | ret = (long) b->size; |
| 492 | break; | ||
| 313 | 493 | ||
| 314 | case BIO_C_MAKE_BIO_PAIR: | 494 | case BIO_C_MAKE_BIO_PAIR: |
| 315 | { | 495 | { |
| @@ -331,7 +511,7 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 331 | 511 | ||
| 332 | case BIO_C_GET_WRITE_GUARANTEE: | 512 | case BIO_C_GET_WRITE_GUARANTEE: |
| 333 | /* How many bytes can the caller feed to the next write | 513 | /* How many bytes can the caller feed to the next write |
| 334 | * withouth having to keep any? */ | 514 | * without having to keep any? */ |
| 335 | if (b->peer == NULL || b->closed) | 515 | if (b->peer == NULL || b->closed) |
| 336 | ret = 0; | 516 | ret = 0; |
| 337 | else | 517 | else |
| @@ -339,18 +519,47 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 339 | break; | 519 | break; |
| 340 | 520 | ||
| 341 | case BIO_C_GET_READ_REQUEST: | 521 | case BIO_C_GET_READ_REQUEST: |
| 342 | /* If the peer unsuccesfully tried to read, how many bytes | 522 | /* If the peer unsuccessfully tried to read, how many bytes |
| 343 | * were requested? (As with BIO_CTRL_PENDING, that number | 523 | * were requested? (As with BIO_CTRL_PENDING, that number |
| 344 | * can usually be treated as boolean.) */ | 524 | * can usually be treated as boolean.) */ |
| 345 | ret = (long) b->request; | 525 | ret = (long) b->request; |
| 346 | break; | 526 | break; |
| 347 | 527 | ||
| 528 | case BIO_C_RESET_READ_REQUEST: | ||
| 529 | /* Reset request. (Can be useful after read attempts | ||
| 530 | * at the other side that are meant to be non-blocking, | ||
| 531 | * e.g. when probing SSL_read to see if any data is | ||
| 532 | * available.) */ | ||
| 533 | b->request = 0; | ||
| 534 | ret = 1; | ||
| 535 | break; | ||
| 536 | |||
| 348 | case BIO_C_SHUTDOWN_WR: | 537 | case BIO_C_SHUTDOWN_WR: |
| 349 | /* similar to shutdown(..., SHUT_WR) */ | 538 | /* similar to shutdown(..., SHUT_WR) */ |
| 350 | b->closed = 1; | 539 | b->closed = 1; |
| 351 | ret = 1; | 540 | ret = 1; |
| 352 | break; | 541 | break; |
| 353 | 542 | ||
| 543 | case BIO_C_NREAD0: | ||
| 544 | /* prepare for non-copying read */ | ||
| 545 | ret = (long) bio_nread0(bio, ptr); | ||
| 546 | break; | ||
| 547 | |||
| 548 | case BIO_C_NREAD: | ||
| 549 | /* non-copying read */ | ||
| 550 | ret = (long) bio_nread(bio, ptr, (size_t) num); | ||
| 551 | break; | ||
| 552 | |||
| 553 | case BIO_C_NWRITE0: | ||
| 554 | /* prepare for non-copying write */ | ||
| 555 | ret = (long) bio_nwrite0(bio, ptr); | ||
| 556 | break; | ||
| 557 | |||
| 558 | case BIO_C_NWRITE: | ||
| 559 | /* non-copying write */ | ||
| 560 | ret = (long) bio_nwrite(bio, ptr, (size_t) num); | ||
| 561 | break; | ||
| 562 | |||
| 354 | 563 | ||
| 355 | /* standard CTRL codes follow */ | 564 | /* standard CTRL codes follow */ |
| 356 | 565 | ||
| @@ -434,7 +643,7 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 434 | return ret; | 643 | return ret; |
| 435 | } | 644 | } |
| 436 | 645 | ||
| 437 | static int bio_puts(BIO *bio, char *str) | 646 | static int bio_puts(BIO *bio, const char *str) |
| 438 | { | 647 | { |
| 439 | return bio_write(bio, str, strlen(str)); | 648 | return bio_write(bio, str, strlen(str)); |
| 440 | } | 649 | } |
| @@ -458,7 +667,7 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 458 | 667 | ||
| 459 | if (b1->buf == NULL) | 668 | if (b1->buf == NULL) |
| 460 | { | 669 | { |
| 461 | b1->buf = Malloc(b1->size); | 670 | b1->buf = OPENSSL_malloc(b1->size); |
| 462 | if (b1->buf == NULL) | 671 | if (b1->buf == NULL) |
| 463 | { | 672 | { |
| 464 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 673 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| @@ -470,7 +679,7 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 470 | 679 | ||
| 471 | if (b2->buf == NULL) | 680 | if (b2->buf == NULL) |
| 472 | { | 681 | { |
| 473 | b2->buf = Malloc(b2->size); | 682 | b2->buf = OPENSSL_malloc(b2->size); |
| 474 | if (b2->buf == NULL) | 683 | if (b2->buf == NULL) |
| 475 | { | 684 | { |
| 476 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 685 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| @@ -586,3 +795,78 @@ size_t BIO_ctrl_get_read_request(BIO *bio) | |||
| 586 | { | 795 | { |
| 587 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); | 796 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); |
| 588 | } | 797 | } |
| 798 | |||
| 799 | int BIO_ctrl_reset_read_request(BIO *bio) | ||
| 800 | { | ||
| 801 | return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); | ||
| 802 | } | ||
| 803 | |||
| 804 | |||
| 805 | /* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now | ||
| 806 | * (conceivably some other BIOs could allow non-copying reads and writes too.) | ||
| 807 | */ | ||
| 808 | int BIO_nread0(BIO *bio, char **buf) | ||
| 809 | { | ||
| 810 | long ret; | ||
| 811 | |||
| 812 | if (!bio->init) | ||
| 813 | { | ||
| 814 | BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); | ||
| 815 | return -2; | ||
| 816 | } | ||
| 817 | |||
| 818 | ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); | ||
| 819 | if (ret > INT_MAX) | ||
| 820 | return INT_MAX; | ||
| 821 | else | ||
| 822 | return (int) ret; | ||
| 823 | } | ||
| 824 | |||
| 825 | int BIO_nread(BIO *bio, char **buf, int num) | ||
| 826 | { | ||
| 827 | int ret; | ||
| 828 | |||
| 829 | if (!bio->init) | ||
| 830 | { | ||
| 831 | BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); | ||
| 832 | return -2; | ||
| 833 | } | ||
| 834 | |||
| 835 | ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); | ||
| 836 | if (ret > 0) | ||
| 837 | bio->num_read += ret; | ||
| 838 | return ret; | ||
| 839 | } | ||
| 840 | |||
| 841 | int BIO_nwrite0(BIO *bio, char **buf) | ||
| 842 | { | ||
| 843 | long ret; | ||
| 844 | |||
| 845 | if (!bio->init) | ||
| 846 | { | ||
| 847 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); | ||
| 848 | return -2; | ||
| 849 | } | ||
| 850 | |||
| 851 | ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); | ||
| 852 | if (ret > INT_MAX) | ||
| 853 | return INT_MAX; | ||
| 854 | else | ||
| 855 | return (int) ret; | ||
| 856 | } | ||
| 857 | |||
| 858 | int BIO_nwrite(BIO *bio, char **buf, int num) | ||
| 859 | { | ||
| 860 | int ret; | ||
| 861 | |||
| 862 | if (!bio->init) | ||
| 863 | { | ||
| 864 | BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); | ||
| 865 | return -2; | ||
| 866 | } | ||
| 867 | |||
| 868 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); | ||
| 869 | if (ret > 0) | ||
| 870 | bio->num_read += ret; | ||
| 871 | return ret; | ||
| 872 | } | ||
diff --git a/src/lib/libcrypto/bio/bss_conn.c b/src/lib/libcrypto/bio/bss_conn.c index 6e547bf866..f91ae4c8c6 100644 --- a/src/lib/libcrypto/bio/bss_conn.c +++ b/src/lib/libcrypto/bio/bss_conn.c | |||
| @@ -56,22 +56,26 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef NO_SOCK | 59 | #ifndef OPENSSL_NO_SOCK |
| 60 | 60 | ||
| 61 | #include <stdio.h> | 61 | #include <stdio.h> |
| 62 | #include <errno.h> | 62 | #include <errno.h> |
| 63 | #define USE_SOCKETS | 63 | #define USE_SOCKETS |
| 64 | #include "cryptlib.h" | 64 | #include "cryptlib.h" |
| 65 | #include "bio.h" | 65 | #include <openssl/bio.h> |
| 66 | 66 | ||
| 67 | /* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */ | 67 | #ifdef OPENSSL_SYS_WIN16 |
| 68 | |||
| 69 | #ifdef WIN16 | ||
| 70 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ | 68 | #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ |
| 71 | #else | 69 | #else |
| 72 | #define SOCKET_PROTOCOL IPPROTO_TCP | 70 | #define SOCKET_PROTOCOL IPPROTO_TCP |
| 73 | #endif | 71 | #endif |
| 74 | 72 | ||
| 73 | #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000) | ||
| 74 | /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */ | ||
| 75 | #undef FIONBIO | ||
| 76 | #endif | ||
| 77 | |||
| 78 | |||
| 75 | typedef struct bio_connect_st | 79 | typedef struct bio_connect_st |
| 76 | { | 80 | { |
| 77 | int state; | 81 | int state; |
| @@ -81,52 +85,32 @@ typedef struct bio_connect_st | |||
| 81 | int nbio; | 85 | int nbio; |
| 82 | 86 | ||
| 83 | unsigned char ip[4]; | 87 | unsigned char ip[4]; |
| 84 | short port; | 88 | unsigned short port; |
| 85 | 89 | ||
| 86 | struct sockaddr_in them; | 90 | struct sockaddr_in them; |
| 87 | 91 | ||
| 88 | /* int socket; this will be kept in bio->num so that it is | 92 | /* int socket; this will be kept in bio->num so that it is |
| 89 | * compatable with the bss_sock bio */ | 93 | * compatible with the bss_sock bio */ |
| 90 | int error; | ||
| 91 | 94 | ||
| 92 | /* called when the connection is initially made | 95 | /* called when the connection is initially made |
| 93 | * callback(BIO,state,ret); The callback should return | 96 | * callback(BIO,state,ret); The callback should return |
| 94 | * 'ret'. state is for compatablity with the ssl info_callback */ | 97 | * 'ret'. state is for compatibility with the ssl info_callback */ |
| 95 | int (*info_callback)(); | 98 | int (*info_callback)(const BIO *bio,int state,int ret); |
| 96 | } BIO_CONNECT; | 99 | } BIO_CONNECT; |
| 97 | 100 | ||
| 98 | #ifndef NOPROTO | 101 | static int conn_write(BIO *h, const char *buf, int num); |
| 99 | static int conn_write(BIO *h,char *buf,int num); | 102 | static int conn_read(BIO *h, char *buf, int size); |
| 100 | static int conn_read(BIO *h,char *buf,int size); | 103 | static int conn_puts(BIO *h, const char *str); |
| 101 | static int conn_puts(BIO *h,char *str); | 104 | static long conn_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 102 | static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 103 | static int conn_new(BIO *h); | 105 | static int conn_new(BIO *h); |
| 104 | static int conn_free(BIO *data); | 106 | static int conn_free(BIO *data); |
| 105 | #else | 107 | static long conn_callback_ctrl(BIO *h, int cmd, bio_info_cb *); |
| 106 | static int conn_write(); | ||
| 107 | static int conn_read(); | ||
| 108 | static int conn_puts(); | ||
| 109 | static long conn_ctrl(); | ||
| 110 | static int conn_new(); | ||
| 111 | static int conn_free(); | ||
| 112 | #endif | ||
| 113 | |||
| 114 | #ifndef NOPROTO | ||
| 115 | 108 | ||
| 116 | static int conn_state(BIO *b, BIO_CONNECT *c); | 109 | static int conn_state(BIO *b, BIO_CONNECT *c); |
| 117 | static void conn_close_socket(BIO *data); | 110 | static void conn_close_socket(BIO *data); |
| 118 | BIO_CONNECT *BIO_CONNECT_new(void ); | 111 | BIO_CONNECT *BIO_CONNECT_new(void ); |
| 119 | void BIO_CONNECT_free(BIO_CONNECT *a); | 112 | void BIO_CONNECT_free(BIO_CONNECT *a); |
| 120 | 113 | ||
| 121 | #else | ||
| 122 | |||
| 123 | static int conn_state(); | ||
| 124 | static void conn_close_socket(); | ||
| 125 | BIO_CONNECT *BIO_CONNECT_new(); | ||
| 126 | void BIO_CONNECT_free(); | ||
| 127 | |||
| 128 | #endif | ||
| 129 | |||
| 130 | static BIO_METHOD methods_connectp= | 114 | static BIO_METHOD methods_connectp= |
| 131 | { | 115 | { |
| 132 | BIO_TYPE_CONNECT, | 116 | BIO_TYPE_CONNECT, |
| @@ -138,11 +122,10 @@ static BIO_METHOD methods_connectp= | |||
| 138 | conn_ctrl, | 122 | conn_ctrl, |
| 139 | conn_new, | 123 | conn_new, |
| 140 | conn_free, | 124 | conn_free, |
| 125 | conn_callback_ctrl, | ||
| 141 | }; | 126 | }; |
| 142 | 127 | ||
| 143 | static int conn_state(b,c) | 128 | static int conn_state(BIO *b, BIO_CONNECT *c) |
| 144 | BIO *b; | ||
| 145 | BIO_CONNECT *c; | ||
| 146 | { | 129 | { |
| 147 | int ret= -1,i; | 130 | int ret= -1,i; |
| 148 | unsigned long l; | 131 | unsigned long l; |
| @@ -160,7 +143,7 @@ BIO_CONNECT *c; | |||
| 160 | p=c->param_hostname; | 143 | p=c->param_hostname; |
| 161 | if (p == NULL) | 144 | if (p == NULL) |
| 162 | { | 145 | { |
| 163 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTHNAME_SPECIFIED); | 146 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED); |
| 164 | goto exit_loop; | 147 | goto exit_loop; |
| 165 | } | 148 | } |
| 166 | for ( ; *p != '\0'; p++) | 149 | for ( ; *p != '\0'; p++) |
| @@ -182,12 +165,12 @@ BIO_CONNECT *c; | |||
| 182 | break; | 165 | break; |
| 183 | } | 166 | } |
| 184 | if (c->param_port != NULL) | 167 | if (c->param_port != NULL) |
| 185 | Free(c->param_port); | 168 | OPENSSL_free(c->param_port); |
| 186 | c->param_port=BUF_strdup(p); | 169 | c->param_port=BUF_strdup(p); |
| 187 | } | 170 | } |
| 188 | } | 171 | } |
| 189 | 172 | ||
| 190 | if (p == NULL) | 173 | if (c->param_port == NULL) |
| 191 | { | 174 | { |
| 192 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); | 175 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); |
| 193 | ERR_add_error_data(2,"host=",c->param_hostname); | 176 | ERR_add_error_data(2,"host=",c->param_hostname); |
| @@ -203,7 +186,12 @@ BIO_CONNECT *c; | |||
| 203 | break; | 186 | break; |
| 204 | 187 | ||
| 205 | case BIO_CONN_S_GET_PORT: | 188 | case BIO_CONN_S_GET_PORT: |
| 206 | if (BIO_get_port(c->param_port,&c->port) <= 0) | 189 | if (c->param_port == NULL) |
| 190 | { | ||
| 191 | /* abort(); */ | ||
| 192 | goto exit_loop; | ||
| 193 | } | ||
| 194 | else if (BIO_get_port(c->param_port,&c->port) <= 0) | ||
| 207 | goto exit_loop; | 195 | goto exit_loop; |
| 208 | c->state=BIO_CONN_S_CREATE_SOCKET; | 196 | c->state=BIO_CONN_S_CREATE_SOCKET; |
| 209 | break; | 197 | break; |
| @@ -235,12 +223,9 @@ BIO_CONNECT *c; | |||
| 235 | break; | 223 | break; |
| 236 | 224 | ||
| 237 | case BIO_CONN_S_NBIO: | 225 | case BIO_CONN_S_NBIO: |
| 238 | #ifdef FIONBIO | ||
| 239 | if (c->nbio) | 226 | if (c->nbio) |
| 240 | { | 227 | { |
| 241 | l=1; | 228 | if (!BIO_socket_nbio(b->num,1)) |
| 242 | ret=BIO_socket_ioctl(b->num,FIONBIO,&l); | ||
| 243 | if (ret < 0) | ||
| 244 | { | 229 | { |
| 245 | BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); | 230 | BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); |
| 246 | ERR_add_error_data(4,"host=", | 231 | ERR_add_error_data(4,"host=", |
| @@ -249,10 +234,9 @@ BIO_CONNECT *c; | |||
| 249 | goto exit_loop; | 234 | goto exit_loop; |
| 250 | } | 235 | } |
| 251 | } | 236 | } |
| 252 | #endif | ||
| 253 | c->state=BIO_CONN_S_CONNECT; | 237 | c->state=BIO_CONN_S_CONNECT; |
| 254 | 238 | ||
| 255 | #ifdef SO_KEEPALIVE | 239 | #if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) |
| 256 | i=1; | 240 | i=1; |
| 257 | i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); | 241 | i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); |
| 258 | if (i < 0) | 242 | if (i < 0) |
| @@ -315,7 +299,7 @@ BIO_CONNECT *c; | |||
| 315 | ret=1; | 299 | ret=1; |
| 316 | goto exit_loop; | 300 | goto exit_loop; |
| 317 | default: | 301 | default: |
| 318 | abort(); | 302 | /* abort(); */ |
| 319 | goto exit_loop; | 303 | goto exit_loop; |
| 320 | } | 304 | } |
| 321 | 305 | ||
| @@ -326,21 +310,19 @@ BIO_CONNECT *c; | |||
| 326 | } | 310 | } |
| 327 | } | 311 | } |
| 328 | 312 | ||
| 329 | if (1) | 313 | /* Loop does not exit */ |
| 330 | { | ||
| 331 | exit_loop: | 314 | exit_loop: |
| 332 | if (cb != NULL) | 315 | if (cb != NULL) |
| 333 | ret=cb((BIO *)b,c->state,ret); | 316 | ret=cb((BIO *)b,c->state,ret); |
| 334 | } | ||
| 335 | end: | 317 | end: |
| 336 | return(ret); | 318 | return(ret); |
| 337 | } | 319 | } |
| 338 | 320 | ||
| 339 | BIO_CONNECT *BIO_CONNECT_new() | 321 | BIO_CONNECT *BIO_CONNECT_new(void) |
| 340 | { | 322 | { |
| 341 | BIO_CONNECT *ret; | 323 | BIO_CONNECT *ret; |
| 342 | 324 | ||
| 343 | if ((ret=(BIO_CONNECT *)Malloc(sizeof(BIO_CONNECT))) == NULL) | 325 | if ((ret=(BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) |
| 344 | return(NULL); | 326 | return(NULL); |
| 345 | ret->state=BIO_CONN_S_BEFORE; | 327 | ret->state=BIO_CONN_S_BEFORE; |
| 346 | ret->param_hostname=NULL; | 328 | ret->param_hostname=NULL; |
| @@ -353,27 +335,27 @@ BIO_CONNECT *BIO_CONNECT_new() | |||
| 353 | ret->ip[3]=0; | 335 | ret->ip[3]=0; |
| 354 | ret->port=0; | 336 | ret->port=0; |
| 355 | memset((char *)&ret->them,0,sizeof(ret->them)); | 337 | memset((char *)&ret->them,0,sizeof(ret->them)); |
| 356 | ret->error=0; | ||
| 357 | return(ret); | 338 | return(ret); |
| 358 | } | 339 | } |
| 359 | 340 | ||
| 360 | void BIO_CONNECT_free(a) | 341 | void BIO_CONNECT_free(BIO_CONNECT *a) |
| 361 | BIO_CONNECT *a; | ||
| 362 | { | 342 | { |
| 343 | if(a == NULL) | ||
| 344 | return; | ||
| 345 | |||
| 363 | if (a->param_hostname != NULL) | 346 | if (a->param_hostname != NULL) |
| 364 | Free(a->param_hostname); | 347 | OPENSSL_free(a->param_hostname); |
| 365 | if (a->param_port != NULL) | 348 | if (a->param_port != NULL) |
| 366 | Free(a->param_port); | 349 | OPENSSL_free(a->param_port); |
| 367 | Free(a); | 350 | OPENSSL_free(a); |
| 368 | } | 351 | } |
| 369 | 352 | ||
| 370 | BIO_METHOD *BIO_s_connect() | 353 | BIO_METHOD *BIO_s_connect(void) |
| 371 | { | 354 | { |
| 372 | return(&methods_connectp); | 355 | return(&methods_connectp); |
| 373 | } | 356 | } |
| 374 | 357 | ||
| 375 | static int conn_new(bi) | 358 | static int conn_new(BIO *bi) |
| 376 | BIO *bi; | ||
| 377 | { | 359 | { |
| 378 | bi->init=0; | 360 | bi->init=0; |
| 379 | bi->num=INVALID_SOCKET; | 361 | bi->num=INVALID_SOCKET; |
| @@ -384,8 +366,7 @@ BIO *bi; | |||
| 384 | return(1); | 366 | return(1); |
| 385 | } | 367 | } |
| 386 | 368 | ||
| 387 | static void conn_close_socket(bio) | 369 | static void conn_close_socket(BIO *bio) |
| 388 | BIO *bio; | ||
| 389 | { | 370 | { |
| 390 | BIO_CONNECT *c; | 371 | BIO_CONNECT *c; |
| 391 | 372 | ||
| @@ -395,17 +376,12 @@ BIO *bio; | |||
| 395 | /* Only do a shutdown if things were established */ | 376 | /* Only do a shutdown if things were established */ |
| 396 | if (c->state == BIO_CONN_S_OK) | 377 | if (c->state == BIO_CONN_S_OK) |
| 397 | shutdown(bio->num,2); | 378 | shutdown(bio->num,2); |
| 398 | # ifdef WINDOWS | ||
| 399 | closesocket(bio->num); | 379 | closesocket(bio->num); |
| 400 | # else | ||
| 401 | close(bio->num); | ||
| 402 | # endif | ||
| 403 | bio->num=INVALID_SOCKET; | 380 | bio->num=INVALID_SOCKET; |
| 404 | } | 381 | } |
| 405 | } | 382 | } |
| 406 | 383 | ||
| 407 | static int conn_free(a) | 384 | static int conn_free(BIO *a) |
| 408 | BIO *a; | ||
| 409 | { | 385 | { |
| 410 | BIO_CONNECT *data; | 386 | BIO_CONNECT *data; |
| 411 | 387 | ||
| @@ -423,10 +399,7 @@ BIO *a; | |||
| 423 | return(1); | 399 | return(1); |
| 424 | } | 400 | } |
| 425 | 401 | ||
| 426 | static int conn_read(b,out,outl) | 402 | static int conn_read(BIO *b, char *out, int outl) |
| 427 | BIO *b; | ||
| 428 | char *out; | ||
| 429 | int outl; | ||
| 430 | { | 403 | { |
| 431 | int ret=0; | 404 | int ret=0; |
| 432 | BIO_CONNECT *data; | 405 | BIO_CONNECT *data; |
| @@ -442,11 +415,7 @@ int outl; | |||
| 442 | if (out != NULL) | 415 | if (out != NULL) |
| 443 | { | 416 | { |
| 444 | clear_socket_error(); | 417 | clear_socket_error(); |
| 445 | #if defined(WINDOWS) | 418 | ret=readsocket(b->num,out,outl); |
| 446 | ret=recv(b->num,out,outl,0); | ||
| 447 | #else | ||
| 448 | ret=read(b->num,out,outl); | ||
| 449 | #endif | ||
| 450 | BIO_clear_retry_flags(b); | 419 | BIO_clear_retry_flags(b); |
| 451 | if (ret <= 0) | 420 | if (ret <= 0) |
| 452 | { | 421 | { |
| @@ -457,10 +426,7 @@ int outl; | |||
| 457 | return(ret); | 426 | return(ret); |
| 458 | } | 427 | } |
| 459 | 428 | ||
| 460 | static int conn_write(b,in,inl) | 429 | static int conn_write(BIO *b, const char *in, int inl) |
| 461 | BIO *b; | ||
| 462 | char *in; | ||
| 463 | int inl; | ||
| 464 | { | 430 | { |
| 465 | int ret; | 431 | int ret; |
| 466 | BIO_CONNECT *data; | 432 | BIO_CONNECT *data; |
| @@ -473,11 +439,7 @@ int inl; | |||
| 473 | } | 439 | } |
| 474 | 440 | ||
| 475 | clear_socket_error(); | 441 | clear_socket_error(); |
| 476 | #if defined(WINDOWS) | 442 | ret=writesocket(b->num,in,inl); |
| 477 | ret=send(b->num,in,inl,0); | ||
| 478 | #else | ||
| 479 | ret=write(b->num,in,inl); | ||
| 480 | #endif | ||
| 481 | BIO_clear_retry_flags(b); | 443 | BIO_clear_retry_flags(b); |
| 482 | if (ret <= 0) | 444 | if (ret <= 0) |
| 483 | { | 445 | { |
| @@ -487,15 +449,11 @@ int inl; | |||
| 487 | return(ret); | 449 | return(ret); |
| 488 | } | 450 | } |
| 489 | 451 | ||
| 490 | static long conn_ctrl(b,cmd,num,ptr) | 452 | static long conn_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 491 | BIO *b; | ||
| 492 | int cmd; | ||
| 493 | long num; | ||
| 494 | char *ptr; | ||
| 495 | { | 453 | { |
| 496 | BIO *dbio; | 454 | BIO *dbio; |
| 497 | int *ip; | 455 | int *ip; |
| 498 | char **pptr; | 456 | const char **pptr; |
| 499 | long ret=1; | 457 | long ret=1; |
| 500 | BIO_CONNECT *data; | 458 | BIO_CONNECT *data; |
| 501 | 459 | ||
| @@ -519,7 +477,7 @@ char *ptr; | |||
| 519 | case BIO_C_GET_CONNECT: | 477 | case BIO_C_GET_CONNECT: |
| 520 | if (ptr != NULL) | 478 | if (ptr != NULL) |
| 521 | { | 479 | { |
| 522 | pptr=(char **)ptr; | 480 | pptr=(const char **)ptr; |
| 523 | if (num == 0) | 481 | if (num == 0) |
| 524 | { | 482 | { |
| 525 | *pptr=data->param_hostname; | 483 | *pptr=data->param_hostname; |
| @@ -538,7 +496,7 @@ char *ptr; | |||
| 538 | *((int *)ptr)=data->port; | 496 | *((int *)ptr)=data->port; |
| 539 | } | 497 | } |
| 540 | if ((!b->init) || (ptr == NULL)) | 498 | if ((!b->init) || (ptr == NULL)) |
| 541 | *pptr="not initalised"; | 499 | *pptr="not initialized"; |
| 542 | ret=1; | 500 | ret=1; |
| 543 | } | 501 | } |
| 544 | break; | 502 | break; |
| @@ -549,19 +507,37 @@ char *ptr; | |||
| 549 | if (num == 0) | 507 | if (num == 0) |
| 550 | { | 508 | { |
| 551 | if (data->param_hostname != NULL) | 509 | if (data->param_hostname != NULL) |
| 552 | Free(data->param_hostname); | 510 | OPENSSL_free(data->param_hostname); |
| 553 | data->param_hostname=BUF_strdup(ptr); | 511 | data->param_hostname=BUF_strdup(ptr); |
| 554 | } | 512 | } |
| 555 | else if (num == 1) | 513 | else if (num == 1) |
| 556 | { | 514 | { |
| 557 | if (data->param_port != NULL) | 515 | if (data->param_port != NULL) |
| 558 | Free(data->param_port); | 516 | OPENSSL_free(data->param_port); |
| 559 | data->param_port=BUF_strdup(ptr); | 517 | data->param_port=BUF_strdup(ptr); |
| 560 | } | 518 | } |
| 561 | else if (num == 2) | 519 | else if (num == 2) |
| 562 | memcpy(data->ip,ptr,4); | 520 | { |
| 521 | char buf[16]; | ||
| 522 | char *p = ptr; | ||
| 523 | |||
| 524 | sprintf(buf,"%d.%d.%d.%d", | ||
| 525 | p[0],p[1],p[2],p[3]); | ||
| 526 | if (data->param_hostname != NULL) | ||
| 527 | OPENSSL_free(data->param_hostname); | ||
| 528 | data->param_hostname=BUF_strdup(buf); | ||
| 529 | memcpy(&(data->ip[0]),ptr,4); | ||
| 530 | } | ||
| 563 | else if (num == 3) | 531 | else if (num == 3) |
| 532 | { | ||
| 533 | char buf[16]; | ||
| 534 | |||
| 535 | sprintf(buf,"%d",*(int *)ptr); | ||
| 536 | if (data->param_port != NULL) | ||
| 537 | OPENSSL_free(data->param_port); | ||
| 538 | data->param_port=BUF_strdup(buf); | ||
| 564 | data->port= *(int *)ptr; | 539 | data->port= *(int *)ptr; |
| 540 | } | ||
| 565 | } | 541 | } |
| 566 | break; | 542 | break; |
| 567 | case BIO_C_SET_NBIO: | 543 | case BIO_C_SET_NBIO: |
| @@ -591,16 +567,26 @@ char *ptr; | |||
| 591 | case BIO_CTRL_FLUSH: | 567 | case BIO_CTRL_FLUSH: |
| 592 | break; | 568 | break; |
| 593 | case BIO_CTRL_DUP: | 569 | case BIO_CTRL_DUP: |
| 570 | { | ||
| 594 | dbio=(BIO *)ptr; | 571 | dbio=(BIO *)ptr; |
| 595 | if (data->param_port) | 572 | if (data->param_port) |
| 596 | BIO_set_conn_port(dbio,data->param_port); | 573 | BIO_set_conn_port(dbio,data->param_port); |
| 597 | if (data->param_hostname) | 574 | if (data->param_hostname) |
| 598 | BIO_set_conn_hostname(dbio,data->param_hostname); | 575 | BIO_set_conn_hostname(dbio,data->param_hostname); |
| 599 | BIO_set_nbio(dbio,data->nbio); | 576 | BIO_set_nbio(dbio,data->nbio); |
| 600 | BIO_set_info_callback(dbio,data->info_callback); | 577 | /* FIXME: the cast of the function seems unlikely to be a good idea */ |
| 578 | (void)BIO_set_info_callback(dbio,(bio_info_cb *)data->info_callback); | ||
| 579 | } | ||
| 601 | break; | 580 | break; |
| 602 | case BIO_CTRL_SET_CALLBACK: | 581 | case BIO_CTRL_SET_CALLBACK: |
| 603 | data->info_callback=(int (*)())ptr; | 582 | { |
| 583 | #if 0 /* FIXME: Should this be used? -- Richard Levitte */ | ||
| 584 | BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 585 | ret = -1; | ||
| 586 | #else | ||
| 587 | ret=0; | ||
| 588 | #endif | ||
| 589 | } | ||
| 604 | break; | 590 | break; |
| 605 | case BIO_CTRL_GET_CALLBACK: | 591 | case BIO_CTRL_GET_CALLBACK: |
| 606 | { | 592 | { |
| @@ -617,9 +603,28 @@ char *ptr; | |||
| 617 | return(ret); | 603 | return(ret); |
| 618 | } | 604 | } |
| 619 | 605 | ||
| 620 | static int conn_puts(bp,str) | 606 | static long conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 621 | BIO *bp; | 607 | { |
| 622 | char *str; | 608 | long ret=1; |
| 609 | BIO_CONNECT *data; | ||
| 610 | |||
| 611 | data=(BIO_CONNECT *)b->ptr; | ||
| 612 | |||
| 613 | switch (cmd) | ||
| 614 | { | ||
| 615 | case BIO_CTRL_SET_CALLBACK: | ||
| 616 | { | ||
| 617 | data->info_callback=(int (*)(const struct bio_st *, int, int))fp; | ||
| 618 | } | ||
| 619 | break; | ||
| 620 | default: | ||
| 621 | ret=0; | ||
| 622 | break; | ||
| 623 | } | ||
| 624 | return(ret); | ||
| 625 | } | ||
| 626 | |||
| 627 | static int conn_puts(BIO *bp, const char *str) | ||
| 623 | { | 628 | { |
| 624 | int n,ret; | 629 | int n,ret; |
| 625 | 630 | ||
| @@ -628,8 +633,7 @@ char *str; | |||
| 628 | return(ret); | 633 | return(ret); |
| 629 | } | 634 | } |
| 630 | 635 | ||
| 631 | BIO *BIO_new_connect(str) | 636 | BIO *BIO_new_connect(char *str) |
| 632 | char *str; | ||
| 633 | { | 637 | { |
| 634 | BIO *ret; | 638 | BIO *ret; |
| 635 | 639 | ||
diff --git a/src/lib/libcrypto/bio/bss_fd.c b/src/lib/libcrypto/bio/bss_fd.c index 686c4909a2..5e3e187de6 100644 --- a/src/lib/libcrypto/bio/bss_fd.c +++ b/src/lib/libcrypto/bio/bss_fd.c | |||
| @@ -56,7 +56,227 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #define BIO_FD | 59 | #include <stdio.h> |
| 60 | #include "bss_sock.c" | 60 | #include <errno.h> |
| 61 | #undef BIO_FD | 61 | #define USE_SOCKETS |
| 62 | #include "cryptlib.h" | ||
| 63 | #include <openssl/bio.h> | ||
| 62 | 64 | ||
| 65 | static int fd_write(BIO *h, const char *buf, int num); | ||
| 66 | static int fd_read(BIO *h, char *buf, int size); | ||
| 67 | static int fd_puts(BIO *h, const char *str); | ||
| 68 | static long fd_ctrl(BIO *h, int cmd, long arg1, void *arg2); | ||
| 69 | static int fd_new(BIO *h); | ||
| 70 | static int fd_free(BIO *data); | ||
| 71 | int BIO_fd_should_retry(int s); | ||
| 72 | |||
| 73 | static BIO_METHOD methods_fdp= | ||
| 74 | { | ||
| 75 | BIO_TYPE_FD,"file descriptor", | ||
| 76 | fd_write, | ||
| 77 | fd_read, | ||
| 78 | fd_puts, | ||
| 79 | NULL, /* fd_gets, */ | ||
| 80 | fd_ctrl, | ||
| 81 | fd_new, | ||
| 82 | fd_free, | ||
| 83 | NULL, | ||
| 84 | }; | ||
| 85 | |||
| 86 | BIO_METHOD *BIO_s_fd(void) | ||
| 87 | { | ||
| 88 | return(&methods_fdp); | ||
| 89 | } | ||
| 90 | |||
| 91 | BIO *BIO_new_fd(int fd,int close_flag) | ||
| 92 | { | ||
| 93 | BIO *ret; | ||
| 94 | ret=BIO_new(BIO_s_fd()); | ||
| 95 | if (ret == NULL) return(NULL); | ||
| 96 | BIO_set_fd(ret,fd,close_flag); | ||
| 97 | return(ret); | ||
| 98 | } | ||
| 99 | |||
| 100 | static int fd_new(BIO *bi) | ||
| 101 | { | ||
| 102 | bi->init=0; | ||
| 103 | bi->num=0; | ||
| 104 | bi->ptr=NULL; | ||
| 105 | bi->flags=0; | ||
| 106 | return(1); | ||
| 107 | } | ||
| 108 | |||
| 109 | static int fd_free(BIO *a) | ||
| 110 | { | ||
| 111 | if (a == NULL) return(0); | ||
| 112 | if (a->shutdown) | ||
| 113 | { | ||
| 114 | if (a->init) | ||
| 115 | { | ||
| 116 | close(a->num); | ||
| 117 | } | ||
| 118 | a->init=0; | ||
| 119 | a->flags=0; | ||
| 120 | } | ||
| 121 | return(1); | ||
| 122 | } | ||
| 123 | |||
| 124 | static int fd_read(BIO *b, char *out,int outl) | ||
| 125 | { | ||
| 126 | int ret=0; | ||
| 127 | |||
| 128 | if (out != NULL) | ||
| 129 | { | ||
| 130 | clear_sys_error(); | ||
| 131 | ret=read(b->num,out,outl); | ||
| 132 | BIO_clear_retry_flags(b); | ||
| 133 | if (ret <= 0) | ||
| 134 | { | ||
| 135 | if (BIO_fd_should_retry(ret)) | ||
| 136 | BIO_set_retry_read(b); | ||
| 137 | } | ||
| 138 | } | ||
| 139 | return(ret); | ||
| 140 | } | ||
| 141 | |||
| 142 | static int fd_write(BIO *b, const char *in, int inl) | ||
| 143 | { | ||
| 144 | int ret; | ||
| 145 | clear_sys_error(); | ||
| 146 | ret=write(b->num,in,inl); | ||
| 147 | BIO_clear_retry_flags(b); | ||
| 148 | if (ret <= 0) | ||
| 149 | { | ||
| 150 | if (BIO_fd_should_retry(ret)) | ||
| 151 | BIO_set_retry_write(b); | ||
| 152 | } | ||
| 153 | return(ret); | ||
| 154 | } | ||
| 155 | |||
| 156 | static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) | ||
| 157 | { | ||
| 158 | long ret=1; | ||
| 159 | int *ip; | ||
| 160 | |||
| 161 | switch (cmd) | ||
| 162 | { | ||
| 163 | case BIO_CTRL_RESET: | ||
| 164 | num=0; | ||
| 165 | case BIO_C_FILE_SEEK: | ||
| 166 | ret=(long)lseek(b->num,num,0); | ||
| 167 | break; | ||
| 168 | case BIO_C_FILE_TELL: | ||
| 169 | case BIO_CTRL_INFO: | ||
| 170 | ret=(long)lseek(b->num,0,1); | ||
| 171 | break; | ||
| 172 | case BIO_C_SET_FD: | ||
| 173 | fd_free(b); | ||
| 174 | b->num= *((int *)ptr); | ||
| 175 | b->shutdown=(int)num; | ||
| 176 | b->init=1; | ||
| 177 | break; | ||
| 178 | case BIO_C_GET_FD: | ||
| 179 | if (b->init) | ||
| 180 | { | ||
| 181 | ip=(int *)ptr; | ||
| 182 | if (ip != NULL) *ip=b->num; | ||
| 183 | ret=b->num; | ||
| 184 | } | ||
| 185 | else | ||
| 186 | ret= -1; | ||
| 187 | break; | ||
| 188 | case BIO_CTRL_GET_CLOSE: | ||
| 189 | ret=b->shutdown; | ||
| 190 | break; | ||
| 191 | case BIO_CTRL_SET_CLOSE: | ||
| 192 | b->shutdown=(int)num; | ||
| 193 | break; | ||
| 194 | case BIO_CTRL_PENDING: | ||
| 195 | case BIO_CTRL_WPENDING: | ||
| 196 | ret=0; | ||
| 197 | break; | ||
| 198 | case BIO_CTRL_DUP: | ||
| 199 | case BIO_CTRL_FLUSH: | ||
| 200 | ret=1; | ||
| 201 | break; | ||
| 202 | default: | ||
| 203 | ret=0; | ||
| 204 | break; | ||
| 205 | } | ||
| 206 | return(ret); | ||
| 207 | } | ||
| 208 | |||
| 209 | static int fd_puts(BIO *bp, const char *str) | ||
| 210 | { | ||
| 211 | int n,ret; | ||
| 212 | |||
| 213 | n=strlen(str); | ||
| 214 | ret=fd_write(bp,str,n); | ||
| 215 | return(ret); | ||
| 216 | } | ||
| 217 | |||
| 218 | int BIO_fd_should_retry(int i) | ||
| 219 | { | ||
| 220 | int err; | ||
| 221 | |||
| 222 | if ((i == 0) || (i == -1)) | ||
| 223 | { | ||
| 224 | err=get_last_sys_error(); | ||
| 225 | |||
| 226 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ | ||
| 227 | if ((i == -1) && (err == 0)) | ||
| 228 | return(1); | ||
| 229 | #endif | ||
| 230 | |||
| 231 | return(BIO_fd_non_fatal_error(err)); | ||
| 232 | } | ||
| 233 | return(0); | ||
| 234 | } | ||
| 235 | |||
| 236 | int BIO_fd_non_fatal_error(int err) | ||
| 237 | { | ||
| 238 | switch (err) | ||
| 239 | { | ||
| 240 | |||
| 241 | #ifdef EWOULDBLOCK | ||
| 242 | # ifdef WSAEWOULDBLOCK | ||
| 243 | # if WSAEWOULDBLOCK != EWOULDBLOCK | ||
| 244 | case EWOULDBLOCK: | ||
| 245 | # endif | ||
| 246 | # else | ||
| 247 | case EWOULDBLOCK: | ||
| 248 | # endif | ||
| 249 | #endif | ||
| 250 | |||
| 251 | #if defined(ENOTCONN) | ||
| 252 | case ENOTCONN: | ||
| 253 | #endif | ||
| 254 | |||
| 255 | #ifdef EINTR | ||
| 256 | case EINTR: | ||
| 257 | #endif | ||
| 258 | |||
| 259 | #ifdef EAGAIN | ||
| 260 | #if EWOULDBLOCK != EAGAIN | ||
| 261 | case EAGAIN: | ||
| 262 | # endif | ||
| 263 | #endif | ||
| 264 | |||
| 265 | #ifdef EPROTO | ||
| 266 | case EPROTO: | ||
| 267 | #endif | ||
| 268 | |||
| 269 | #ifdef EINPROGRESS | ||
| 270 | case EINPROGRESS: | ||
| 271 | #endif | ||
| 272 | |||
| 273 | #ifdef EALREADY | ||
| 274 | case EALREADY: | ||
| 275 | #endif | ||
| 276 | return(1); | ||
| 277 | /* break; */ | ||
| 278 | default: | ||
| 279 | break; | ||
| 280 | } | ||
| 281 | return(0); | ||
| 282 | } | ||
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c index 1484cf849e..8b3ff278d9 100644 --- a/src/lib/libcrypto/bio/bss_file.c +++ b/src/lib/libcrypto/bio/bss_file.c | |||
| @@ -68,29 +68,18 @@ | |||
| 68 | #include <stdio.h> | 68 | #include <stdio.h> |
| 69 | #include <errno.h> | 69 | #include <errno.h> |
| 70 | #include "cryptlib.h" | 70 | #include "cryptlib.h" |
| 71 | #include "bio.h" | 71 | #include <openssl/bio.h> |
| 72 | #include "err.h" | 72 | #include <openssl/err.h> |
| 73 | 73 | ||
| 74 | #if !defined(NO_STDIO) | 74 | #if !defined(OPENSSL_NO_STDIO) |
| 75 | 75 | ||
| 76 | #ifndef NOPROTO | 76 | static int MS_CALLBACK file_write(BIO *h, const char *buf, int num); |
| 77 | static int MS_CALLBACK file_write(BIO *h,char *buf,int num); | 77 | static int MS_CALLBACK file_read(BIO *h, char *buf, int size); |
| 78 | static int MS_CALLBACK file_read(BIO *h,char *buf,int size); | 78 | static int MS_CALLBACK file_puts(BIO *h, const char *str); |
| 79 | static int MS_CALLBACK file_puts(BIO *h,char *str); | 79 | static int MS_CALLBACK file_gets(BIO *h, char *str, int size); |
| 80 | static int MS_CALLBACK file_gets(BIO *h,char *str,int size); | 80 | static long MS_CALLBACK file_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 81 | static long MS_CALLBACK file_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 82 | static int MS_CALLBACK file_new(BIO *h); | 81 | static int MS_CALLBACK file_new(BIO *h); |
| 83 | static int MS_CALLBACK file_free(BIO *data); | 82 | static int MS_CALLBACK file_free(BIO *data); |
| 84 | #else | ||
| 85 | static int MS_CALLBACK file_write(); | ||
| 86 | static int MS_CALLBACK file_read(); | ||
| 87 | static int MS_CALLBACK file_puts(); | ||
| 88 | static int MS_CALLBACK file_gets(); | ||
| 89 | static long MS_CALLBACK file_ctrl(); | ||
| 90 | static int MS_CALLBACK file_new(); | ||
| 91 | static int MS_CALLBACK file_free(); | ||
| 92 | #endif | ||
| 93 | |||
| 94 | static BIO_METHOD methods_filep= | 83 | static BIO_METHOD methods_filep= |
| 95 | { | 84 | { |
| 96 | BIO_TYPE_FILE, | 85 | BIO_TYPE_FILE, |
| @@ -102,11 +91,10 @@ static BIO_METHOD methods_filep= | |||
| 102 | file_ctrl, | 91 | file_ctrl, |
| 103 | file_new, | 92 | file_new, |
| 104 | file_free, | 93 | file_free, |
| 94 | NULL, | ||
| 105 | }; | 95 | }; |
| 106 | 96 | ||
| 107 | BIO *BIO_new_file(filename,mode) | 97 | BIO *BIO_new_file(const char *filename, const char *mode) |
| 108 | char *filename; | ||
| 109 | char *mode; | ||
| 110 | { | 98 | { |
| 111 | BIO *ret; | 99 | BIO *ret; |
| 112 | FILE *file; | 100 | FILE *file; |
| @@ -115,7 +103,10 @@ char *mode; | |||
| 115 | { | 103 | { |
| 116 | SYSerr(SYS_F_FOPEN,get_last_sys_error()); | 104 | SYSerr(SYS_F_FOPEN,get_last_sys_error()); |
| 117 | ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); | 105 | ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); |
| 118 | BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); | 106 | if (errno == ENOENT) |
| 107 | BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); | ||
| 108 | else | ||
| 109 | BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); | ||
| 119 | return(NULL); | 110 | return(NULL); |
| 120 | } | 111 | } |
| 121 | if ((ret=BIO_new(BIO_s_file_internal())) == NULL) | 112 | if ((ret=BIO_new(BIO_s_file_internal())) == NULL) |
| @@ -125,9 +116,7 @@ char *mode; | |||
| 125 | return(ret); | 116 | return(ret); |
| 126 | } | 117 | } |
| 127 | 118 | ||
| 128 | BIO *BIO_new_fp(stream,close_flag) | 119 | BIO *BIO_new_fp(FILE *stream, int close_flag) |
| 129 | FILE *stream; | ||
| 130 | int close_flag; | ||
| 131 | { | 120 | { |
| 132 | BIO *ret; | 121 | BIO *ret; |
| 133 | 122 | ||
| @@ -138,13 +127,12 @@ int close_flag; | |||
| 138 | return(ret); | 127 | return(ret); |
| 139 | } | 128 | } |
| 140 | 129 | ||
| 141 | BIO_METHOD *BIO_s_file() | 130 | BIO_METHOD *BIO_s_file(void) |
| 142 | { | 131 | { |
| 143 | return(&methods_filep); | 132 | return(&methods_filep); |
| 144 | } | 133 | } |
| 145 | 134 | ||
| 146 | static int MS_CALLBACK file_new(bi) | 135 | static int MS_CALLBACK file_new(BIO *bi) |
| 147 | BIO *bi; | ||
| 148 | { | 136 | { |
| 149 | bi->init=0; | 137 | bi->init=0; |
| 150 | bi->num=0; | 138 | bi->num=0; |
| @@ -152,8 +140,7 @@ BIO *bi; | |||
| 152 | return(1); | 140 | return(1); |
| 153 | } | 141 | } |
| 154 | 142 | ||
| 155 | static int MS_CALLBACK file_free(a) | 143 | static int MS_CALLBACK file_free(BIO *a) |
| 156 | BIO *a; | ||
| 157 | { | 144 | { |
| 158 | if (a == NULL) return(0); | 145 | if (a == NULL) return(0); |
| 159 | if (a->shutdown) | 146 | if (a->shutdown) |
| @@ -168,10 +155,7 @@ BIO *a; | |||
| 168 | return(1); | 155 | return(1); |
| 169 | } | 156 | } |
| 170 | 157 | ||
| 171 | static int MS_CALLBACK file_read(b,out,outl) | 158 | static int MS_CALLBACK file_read(BIO *b, char *out, int outl) |
| 172 | BIO *b; | ||
| 173 | char *out; | ||
| 174 | int outl; | ||
| 175 | { | 159 | { |
| 176 | int ret=0; | 160 | int ret=0; |
| 177 | 161 | ||
| @@ -182,10 +166,7 @@ int outl; | |||
| 182 | return(ret); | 166 | return(ret); |
| 183 | } | 167 | } |
| 184 | 168 | ||
| 185 | static int MS_CALLBACK file_write(b,in,inl) | 169 | static int MS_CALLBACK file_write(BIO *b, const char *in, int inl) |
| 186 | BIO *b; | ||
| 187 | char *in; | ||
| 188 | int inl; | ||
| 189 | { | 170 | { |
| 190 | int ret=0; | 171 | int ret=0; |
| 191 | 172 | ||
| @@ -194,18 +175,14 @@ int inl; | |||
| 194 | if (fwrite(in,(int)inl,1,(FILE *)b->ptr)) | 175 | if (fwrite(in,(int)inl,1,(FILE *)b->ptr)) |
| 195 | ret=inl; | 176 | ret=inl; |
| 196 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ | 177 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ |
| 197 | /* acording to Tim Hudson <tjh@cryptsoft.com>, the commented | 178 | /* according to Tim Hudson <tjh@cryptsoft.com>, the commented |
| 198 | * out version above can cause 'inl' write calls under | 179 | * out version above can cause 'inl' write calls under |
| 199 | * some stupid stdio implementations (VMS) */ | 180 | * some stupid stdio implementations (VMS) */ |
| 200 | } | 181 | } |
| 201 | return(ret); | 182 | return(ret); |
| 202 | } | 183 | } |
| 203 | 184 | ||
| 204 | static long MS_CALLBACK file_ctrl(b,cmd,num,ptr) | 185 | static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 205 | BIO *b; | ||
| 206 | int cmd; | ||
| 207 | long num; | ||
| 208 | char *ptr; | ||
| 209 | { | 186 | { |
| 210 | long ret=1; | 187 | long ret=1; |
| 211 | FILE *fp=(FILE *)b->ptr; | 188 | FILE *fp=(FILE *)b->ptr; |
| @@ -214,26 +191,33 @@ char *ptr; | |||
| 214 | 191 | ||
| 215 | switch (cmd) | 192 | switch (cmd) |
| 216 | { | 193 | { |
| 194 | case BIO_C_FILE_SEEK: | ||
| 217 | case BIO_CTRL_RESET: | 195 | case BIO_CTRL_RESET: |
| 218 | ret=(long)fseek(fp,num,0); | 196 | ret=(long)fseek(fp,num,0); |
| 219 | break; | 197 | break; |
| 220 | case BIO_CTRL_EOF: | 198 | case BIO_CTRL_EOF: |
| 221 | ret=(long)feof(fp); | 199 | ret=(long)feof(fp); |
| 222 | break; | 200 | break; |
| 201 | case BIO_C_FILE_TELL: | ||
| 223 | case BIO_CTRL_INFO: | 202 | case BIO_CTRL_INFO: |
| 224 | ret=ftell(fp); | 203 | ret=ftell(fp); |
| 225 | break; | 204 | break; |
| 226 | case BIO_C_SET_FILE_PTR: | 205 | case BIO_C_SET_FILE_PTR: |
| 227 | file_free(b); | 206 | file_free(b); |
| 228 | b->shutdown=(int)num; | 207 | b->shutdown=(int)num&BIO_CLOSE; |
| 229 | b->ptr=(char *)ptr; | 208 | b->ptr=(char *)ptr; |
| 230 | b->init=1; | 209 | b->init=1; |
| 231 | #if defined(MSDOS) || defined(WINDOWS) | 210 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) |
| 232 | /* Set correct text/binary mode */ | 211 | /* Set correct text/binary mode */ |
| 233 | if (num & BIO_FP_TEXT) | 212 | if (num & BIO_FP_TEXT) |
| 234 | _setmode(fileno((FILE *)ptr),_O_TEXT); | 213 | _setmode(fileno((FILE *)ptr),_O_TEXT); |
| 235 | else | 214 | else |
| 236 | _setmode(fileno((FILE *)ptr),_O_BINARY); | 215 | _setmode(fileno((FILE *)ptr),_O_BINARY); |
| 216 | #elif defined(OPENSSL_SYS_OS2) | ||
| 217 | if (num & BIO_FP_TEXT) | ||
| 218 | setmode(fileno((FILE *)ptr), O_TEXT); | ||
| 219 | else | ||
| 220 | setmode(fileno((FILE *)ptr), O_BINARY); | ||
| 237 | #endif | 221 | #endif |
| 238 | break; | 222 | break; |
| 239 | case BIO_C_SET_FILENAME: | 223 | case BIO_C_SET_FILENAME: |
| @@ -257,7 +241,7 @@ char *ptr; | |||
| 257 | ret=0; | 241 | ret=0; |
| 258 | break; | 242 | break; |
| 259 | } | 243 | } |
| 260 | #if defined(MSDOS) || defined(WINDOWS) | 244 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) |
| 261 | if (!(num & BIO_FP_TEXT)) | 245 | if (!(num & BIO_FP_TEXT)) |
| 262 | strcat(p,"b"); | 246 | strcat(p,"b"); |
| 263 | else | 247 | else |
| @@ -307,10 +291,7 @@ char *ptr; | |||
| 307 | return(ret); | 291 | return(ret); |
| 308 | } | 292 | } |
| 309 | 293 | ||
| 310 | static int MS_CALLBACK file_gets(bp,buf,size) | 294 | static int MS_CALLBACK file_gets(BIO *bp, char *buf, int size) |
| 311 | BIO *bp; | ||
| 312 | char *buf; | ||
| 313 | int size; | ||
| 314 | { | 295 | { |
| 315 | int ret=0; | 296 | int ret=0; |
| 316 | 297 | ||
| @@ -321,9 +302,7 @@ int size; | |||
| 321 | return(ret); | 302 | return(ret); |
| 322 | } | 303 | } |
| 323 | 304 | ||
| 324 | static int MS_CALLBACK file_puts(bp,str) | 305 | static int MS_CALLBACK file_puts(BIO *bp, const char *str) |
| 325 | BIO *bp; | ||
| 326 | char *str; | ||
| 327 | { | 306 | { |
| 328 | int n,ret; | 307 | int n,ret; |
| 329 | 308 | ||
| @@ -332,7 +311,7 @@ char *str; | |||
| 332 | return(ret); | 311 | return(ret); |
| 333 | } | 312 | } |
| 334 | 313 | ||
| 335 | #endif /* NO_STDIO */ | 314 | #endif /* OPENSSL_NO_STDIO */ |
| 336 | 315 | ||
| 337 | #endif /* HEADER_BSS_FILE_C */ | 316 | #endif /* HEADER_BSS_FILE_C */ |
| 338 | 317 | ||
diff --git a/src/lib/libcrypto/bio/bss_log.c b/src/lib/libcrypto/bio/bss_log.c index db82e757e7..a39d95297c 100644 --- a/src/lib/libcrypto/bio/bss_log.c +++ b/src/lib/libcrypto/bio/bss_log.c | |||
| @@ -57,8 +57,8 @@ | |||
| 57 | Why BIO_s_log? | 57 | Why BIO_s_log? |
| 58 | 58 | ||
| 59 | BIO_s_log is useful for system daemons (or services under NT). | 59 | BIO_s_log is useful for system daemons (or services under NT). |
| 60 | It is one-way BIO, it sends all stuff to syslogd (or event log | 60 | It is one-way BIO, it sends all stuff to syslogd (on system that |
| 61 | under NT). | 61 | commonly use that), or event log (on NT), or OPCOM (on OpenVMS). |
| 62 | 62 | ||
| 63 | */ | 63 | */ |
| 64 | 64 | ||
| @@ -66,27 +66,71 @@ | |||
| 66 | #include <stdio.h> | 66 | #include <stdio.h> |
| 67 | #include <errno.h> | 67 | #include <errno.h> |
| 68 | 68 | ||
| 69 | #ifndef WIN32 | 69 | #include "cryptlib.h" |
| 70 | #ifdef __ultrix | 70 | |
| 71 | #include <sys/syslog.h> | 71 | #if defined(OPENSSL_SYS_WIN32) |
| 72 | #else | 72 | # include <process.h> |
| 73 | #include <syslog.h> | 73 | #elif defined(OPENSSL_SYS_VMS) |
| 74 | #endif | 74 | # include <opcdef.h> |
| 75 | # include <descrip.h> | ||
| 76 | # include <lib$routines.h> | ||
| 77 | # include <starlet.h> | ||
| 78 | #elif defined(__ultrix) | ||
| 79 | # include <sys/syslog.h> | ||
| 80 | #elif !defined(MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && !defined(NO_SYSLOG) /* Unix */ | ||
| 81 | # include <syslog.h> | ||
| 75 | #endif | 82 | #endif |
| 76 | 83 | ||
| 77 | #include "cryptlib.h" | ||
| 78 | #include <openssl/buffer.h> | 84 | #include <openssl/buffer.h> |
| 79 | #include <openssl/err.h> | 85 | #include <openssl/err.h> |
| 86 | |||
| 80 | #ifndef NO_SYSLOG | 87 | #ifndef NO_SYSLOG |
| 81 | 88 | ||
| 89 | #if defined(OPENSSL_SYS_WIN32) | ||
| 90 | #define LOG_EMERG 0 | ||
| 91 | #define LOG_ALERT 1 | ||
| 92 | #define LOG_CRIT 2 | ||
| 93 | #define LOG_ERR 3 | ||
| 94 | #define LOG_WARNING 4 | ||
| 95 | #define LOG_NOTICE 5 | ||
| 96 | #define LOG_INFO 6 | ||
| 97 | #define LOG_DEBUG 7 | ||
| 82 | 98 | ||
| 83 | static int MS_CALLBACK slg_write(BIO *h,char *buf,int num); | 99 | #define LOG_DAEMON (3<<3) |
| 84 | static int MS_CALLBACK slg_puts(BIO *h,char *str); | 100 | #elif defined(OPENSSL_SYS_VMS) |
| 85 | static long MS_CALLBACK slg_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 101 | /* On VMS, we don't really care about these, but we need them to compile */ |
| 102 | #define LOG_EMERG 0 | ||
| 103 | #define LOG_ALERT 1 | ||
| 104 | #define LOG_CRIT 2 | ||
| 105 | #define LOG_ERR 3 | ||
| 106 | #define LOG_WARNING 4 | ||
| 107 | #define LOG_NOTICE 5 | ||
| 108 | #define LOG_INFO 6 | ||
| 109 | #define LOG_DEBUG 7 | ||
| 110 | |||
| 111 | #define LOG_DAEMON OPC$M_NM_NTWORK | ||
| 112 | #endif | ||
| 113 | |||
| 114 | static int MS_CALLBACK slg_write(BIO *h, const char *buf, int num); | ||
| 115 | static int MS_CALLBACK slg_puts(BIO *h, const char *str); | ||
| 116 | static long MS_CALLBACK slg_ctrl(BIO *h, int cmd, long arg1, void *arg2); | ||
| 86 | static int MS_CALLBACK slg_new(BIO *h); | 117 | static int MS_CALLBACK slg_new(BIO *h); |
| 87 | static int MS_CALLBACK slg_free(BIO *data); | 118 | static int MS_CALLBACK slg_free(BIO *data); |
| 88 | static int xopenlog(BIO* bp, const char* name, int level); | 119 | static void xopenlog(BIO* bp, char* name, int level); |
| 89 | static int xcloselog(BIO* bp); | 120 | static void xsyslog(BIO* bp, int priority, const char* string); |
| 121 | static void xcloselog(BIO* bp); | ||
| 122 | #ifdef OPENSSL_SYS_WIN32 | ||
| 123 | LONG (WINAPI *go_for_advapi)() = RegOpenKeyEx; | ||
| 124 | HANDLE (WINAPI *register_event_source)() = NULL; | ||
| 125 | BOOL (WINAPI *deregister_event_source)() = NULL; | ||
| 126 | BOOL (WINAPI *report_event)() = NULL; | ||
| 127 | #define DL_PROC(m,f) (GetProcAddress( m, f )) | ||
| 128 | #ifdef UNICODE | ||
| 129 | #define DL_PROC_X(m,f) DL_PROC( m, f "W" ) | ||
| 130 | #else | ||
| 131 | #define DL_PROC_X(m,f) DL_PROC( m, f "A" ) | ||
| 132 | #endif | ||
| 133 | #endif | ||
| 90 | 134 | ||
| 91 | static BIO_METHOD methods_slg= | 135 | static BIO_METHOD methods_slg= |
| 92 | { | 136 | { |
| @@ -98,6 +142,7 @@ static BIO_METHOD methods_slg= | |||
| 98 | slg_ctrl, | 142 | slg_ctrl, |
| 99 | slg_new, | 143 | slg_new, |
| 100 | slg_free, | 144 | slg_free, |
| 145 | NULL, | ||
| 101 | }; | 146 | }; |
| 102 | 147 | ||
| 103 | BIO_METHOD *BIO_s_log(void) | 148 | BIO_METHOD *BIO_s_log(void) |
| @@ -110,11 +155,7 @@ static int MS_CALLBACK slg_new(BIO *bi) | |||
| 110 | bi->init=1; | 155 | bi->init=1; |
| 111 | bi->num=0; | 156 | bi->num=0; |
| 112 | bi->ptr=NULL; | 157 | bi->ptr=NULL; |
| 113 | #ifndef WIN32 | ||
| 114 | xopenlog(bi, "application", LOG_DAEMON); | 158 | xopenlog(bi, "application", LOG_DAEMON); |
| 115 | #else | ||
| 116 | xopenlog(bi, "application", 0); | ||
| 117 | #endif | ||
| 118 | return(1); | 159 | return(1); |
| 119 | } | 160 | } |
| 120 | 161 | ||
| @@ -125,64 +166,60 @@ static int MS_CALLBACK slg_free(BIO *a) | |||
| 125 | return(1); | 166 | return(1); |
| 126 | } | 167 | } |
| 127 | 168 | ||
| 128 | static int MS_CALLBACK slg_write(BIO *b, char *in, int inl) | 169 | static int MS_CALLBACK slg_write(BIO *b, const char *in, int inl) |
| 129 | { | 170 | { |
| 130 | int ret= inl; | 171 | int ret= inl; |
| 131 | char* buf= in; | 172 | char* buf; |
| 132 | char* pp; | 173 | char* pp; |
| 133 | #if defined(WIN32) | 174 | int priority, i; |
| 134 | LPTSTR lpszStrings[1]; | 175 | static struct |
| 135 | WORD evtype= EVENTLOG_ERROR_TYPE; | 176 | { |
| 136 | #else | 177 | int strl; |
| 137 | int priority; | 178 | char str[10]; |
| 138 | #endif | 179 | int log_level; |
| 180 | } | ||
| 181 | mapping[] = | ||
| 182 | { | ||
| 183 | { 6, "PANIC ", LOG_EMERG }, | ||
| 184 | { 6, "EMERG ", LOG_EMERG }, | ||
| 185 | { 4, "EMR ", LOG_EMERG }, | ||
| 186 | { 6, "ALERT ", LOG_ALERT }, | ||
| 187 | { 4, "ALR ", LOG_ALERT }, | ||
| 188 | { 5, "CRIT ", LOG_CRIT }, | ||
| 189 | { 4, "CRI ", LOG_CRIT }, | ||
| 190 | { 6, "ERROR ", LOG_ERR }, | ||
| 191 | { 4, "ERR ", LOG_ERR }, | ||
| 192 | { 8, "WARNING ", LOG_WARNING }, | ||
| 193 | { 5, "WARN ", LOG_WARNING }, | ||
| 194 | { 4, "WAR ", LOG_WARNING }, | ||
| 195 | { 7, "NOTICE ", LOG_NOTICE }, | ||
| 196 | { 5, "NOTE ", LOG_NOTICE }, | ||
| 197 | { 4, "NOT ", LOG_NOTICE }, | ||
| 198 | { 5, "INFO ", LOG_INFO }, | ||
| 199 | { 4, "INF ", LOG_INFO }, | ||
| 200 | { 6, "DEBUG ", LOG_DEBUG }, | ||
| 201 | { 4, "DBG ", LOG_DEBUG }, | ||
| 202 | { 0, "", LOG_ERR } /* The default */ | ||
| 203 | }; | ||
| 139 | 204 | ||
| 140 | if((buf= (char *)Malloc(inl+ 1)) == NULL){ | 205 | if((buf= (char *)OPENSSL_malloc(inl+ 1)) == NULL){ |
| 141 | return(0); | 206 | return(0); |
| 142 | } | 207 | } |
| 143 | strncpy(buf, in, inl); | 208 | strncpy(buf, in, inl); |
| 144 | buf[inl]= '\0'; | 209 | buf[inl]= '\0'; |
| 145 | #if defined(WIN32) | ||
| 146 | if(strncmp(buf, "ERR ", 4) == 0){ | ||
| 147 | evtype= EVENTLOG_ERROR_TYPE; | ||
| 148 | pp= buf+ 4; | ||
| 149 | }else if(strncmp(buf, "WAR ", 4) == 0){ | ||
| 150 | evtype= EVENTLOG_WARNING_TYPE; | ||
| 151 | pp= buf+ 4; | ||
| 152 | }else if(strncmp(buf, "INF ", 4) == 0){ | ||
| 153 | evtype= EVENTLOG_INFORMATION_TYPE; | ||
| 154 | pp= buf+ 4; | ||
| 155 | }else{ | ||
| 156 | evtype= EVENTLOG_ERROR_TYPE; | ||
| 157 | pp= buf; | ||
| 158 | } | ||
| 159 | lpszStrings[0]= pp; | ||
| 160 | 210 | ||
| 161 | if(b->ptr) | 211 | i = 0; |
| 162 | ReportEvent(b->ptr, evtype, 0, 1024, NULL, 1, 0, | 212 | while(strncmp(buf, mapping[i].str, mapping[i].strl) != 0) i++; |
| 163 | lpszStrings, NULL); | 213 | priority = mapping[i].log_level; |
| 164 | #else | 214 | pp = buf + mapping[i].strl; |
| 165 | if(strncmp(buf, "ERR ", 4) == 0){ | ||
| 166 | priority= LOG_ERR; | ||
| 167 | pp= buf+ 4; | ||
| 168 | }else if(strncmp(buf, "WAR ", 4) == 0){ | ||
| 169 | priority= LOG_WARNING; | ||
| 170 | pp= buf+ 4; | ||
| 171 | }else if(strncmp(buf, "INF ", 4) == 0){ | ||
| 172 | priority= LOG_INFO; | ||
| 173 | pp= buf+ 4; | ||
| 174 | }else{ | ||
| 175 | priority= LOG_ERR; | ||
| 176 | pp= buf; | ||
| 177 | } | ||
| 178 | 215 | ||
| 179 | syslog(priority, "%s", pp); | 216 | xsyslog(b, priority, pp); |
| 180 | #endif | 217 | |
| 181 | Free(buf); | 218 | OPENSSL_free(buf); |
| 182 | return(ret); | 219 | return(ret); |
| 183 | } | 220 | } |
| 184 | 221 | ||
| 185 | static long MS_CALLBACK slg_ctrl(BIO *b, int cmd, long num, char *ptr) | 222 | static long MS_CALLBACK slg_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 186 | { | 223 | { |
| 187 | switch (cmd) | 224 | switch (cmd) |
| 188 | { | 225 | { |
| @@ -196,7 +233,7 @@ static long MS_CALLBACK slg_ctrl(BIO *b, int cmd, long num, char *ptr) | |||
| 196 | return(0); | 233 | return(0); |
| 197 | } | 234 | } |
| 198 | 235 | ||
| 199 | static int MS_CALLBACK slg_puts(BIO *bp, char *str) | 236 | static int MS_CALLBACK slg_puts(BIO *bp, const char *str) |
| 200 | { | 237 | { |
| 201 | int n,ret; | 238 | int n,ret; |
| 202 | 239 | ||
| @@ -205,28 +242,154 @@ static int MS_CALLBACK slg_puts(BIO *bp, char *str) | |||
| 205 | return(ret); | 242 | return(ret); |
| 206 | } | 243 | } |
| 207 | 244 | ||
| 208 | static int xopenlog(BIO* bp, const char* name, int level) | 245 | #if defined(OPENSSL_SYS_WIN32) |
| 246 | |||
| 247 | static void xopenlog(BIO* bp, char* name, int level) | ||
| 209 | { | 248 | { |
| 210 | #if defined(WIN32) | 249 | if ( !register_event_source ) |
| 211 | if((bp->ptr= (char *)RegisterEventSource(NULL, name)) == NULL){ | 250 | { |
| 212 | return(0); | 251 | HANDLE advapi; |
| 213 | } | 252 | if ( !(advapi = GetModuleHandle("advapi32")) ) |
| 214 | #else | 253 | return; |
| 215 | openlog(name, LOG_PID|LOG_CONS, level); | 254 | register_event_source = (HANDLE (WINAPI *)())DL_PROC_X(advapi, |
| 216 | #endif | 255 | "RegisterEventSource" ); |
| 217 | return(1); | 256 | deregister_event_source = (BOOL (WINAPI *)())DL_PROC(advapi, |
| 257 | "DeregisterEventSource"); | ||
| 258 | report_event = (BOOL (WINAPI *)())DL_PROC_X(advapi, | ||
| 259 | "ReportEvent" ); | ||
| 260 | if ( !(register_event_source && deregister_event_source && | ||
| 261 | report_event) ) | ||
| 262 | { | ||
| 263 | register_event_source = NULL; | ||
| 264 | deregister_event_source = NULL; | ||
| 265 | report_event = NULL; | ||
| 266 | return; | ||
| 267 | } | ||
| 268 | } | ||
| 269 | bp->ptr= (char *)register_event_source(NULL, name); | ||
| 218 | } | 270 | } |
| 219 | 271 | ||
| 220 | static int xcloselog(BIO* bp) | 272 | static void xsyslog(BIO *bp, int priority, const char *string) |
| 273 | { | ||
| 274 | LPCSTR lpszStrings[2]; | ||
| 275 | WORD evtype= EVENTLOG_ERROR_TYPE; | ||
| 276 | int pid = _getpid(); | ||
| 277 | char pidbuf[20]; | ||
| 278 | |||
| 279 | switch (priority) | ||
| 280 | { | ||
| 281 | case LOG_EMERG: | ||
| 282 | case LOG_ALERT: | ||
| 283 | case LOG_CRIT: | ||
| 284 | case LOG_ERR: | ||
| 285 | evtype = EVENTLOG_ERROR_TYPE; | ||
| 286 | break; | ||
| 287 | case LOG_WARNING: | ||
| 288 | evtype = EVENTLOG_WARNING_TYPE; | ||
| 289 | break; | ||
| 290 | case LOG_NOTICE: | ||
| 291 | case LOG_INFO: | ||
| 292 | case LOG_DEBUG: | ||
| 293 | evtype = EVENTLOG_INFORMATION_TYPE; | ||
| 294 | break; | ||
| 295 | default: /* Should never happen, but set it | ||
| 296 | as error anyway. */ | ||
| 297 | evtype = EVENTLOG_ERROR_TYPE; | ||
| 298 | break; | ||
| 299 | } | ||
| 300 | |||
| 301 | sprintf(pidbuf, "[%d] ", pid); | ||
| 302 | lpszStrings[0] = pidbuf; | ||
| 303 | lpszStrings[1] = string; | ||
| 304 | |||
| 305 | if(report_event && bp->ptr) | ||
| 306 | report_event(bp->ptr, evtype, 0, 1024, NULL, 2, 0, | ||
| 307 | lpszStrings, NULL); | ||
| 308 | } | ||
| 309 | |||
| 310 | static void xcloselog(BIO* bp) | ||
| 221 | { | 311 | { |
| 222 | #if defined(WIN32) | 312 | if(deregister_event_source && bp->ptr) |
| 223 | if(bp->ptr) | 313 | deregister_event_source((HANDLE)(bp->ptr)); |
| 224 | DeregisterEventSource((HANDLE)(bp->ptr)); | ||
| 225 | bp->ptr= NULL; | 314 | bp->ptr= NULL; |
| 226 | #else | 315 | } |
| 316 | |||
| 317 | #elif defined(OPENSSL_SYS_VMS) | ||
| 318 | |||
| 319 | static int VMS_OPC_target = LOG_DAEMON; | ||
| 320 | |||
| 321 | static void xopenlog(BIO* bp, char* name, int level) | ||
| 322 | { | ||
| 323 | VMS_OPC_target = level; | ||
| 324 | } | ||
| 325 | |||
| 326 | static void xsyslog(BIO *bp, int priority, const char *string) | ||
| 327 | { | ||
| 328 | struct dsc$descriptor_s opc_dsc; | ||
| 329 | struct opcdef *opcdef_p; | ||
| 330 | char buf[10240]; | ||
| 331 | unsigned int len; | ||
| 332 | struct dsc$descriptor_s buf_dsc; | ||
| 333 | $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); | ||
| 334 | char *priority_tag; | ||
| 335 | |||
| 336 | switch (priority) | ||
| 337 | { | ||
| 338 | case LOG_EMERG: priority_tag = "Emergency"; break; | ||
| 339 | case LOG_ALERT: priority_tag = "Alert"; break; | ||
| 340 | case LOG_CRIT: priority_tag = "Critical"; break; | ||
| 341 | case LOG_ERR: priority_tag = "Error"; break; | ||
| 342 | case LOG_WARNING: priority_tag = "Warning"; break; | ||
| 343 | case LOG_NOTICE: priority_tag = "Notice"; break; | ||
| 344 | case LOG_INFO: priority_tag = "Info"; break; | ||
| 345 | case LOG_DEBUG: priority_tag = "DEBUG"; break; | ||
| 346 | } | ||
| 347 | |||
| 348 | buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
| 349 | buf_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
| 350 | buf_dsc.dsc$a_pointer = buf; | ||
| 351 | buf_dsc.dsc$w_length = sizeof(buf) - 1; | ||
| 352 | |||
| 353 | lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); | ||
| 354 | |||
| 355 | /* we know there's an 8 byte header. That's documented */ | ||
| 356 | opcdef_p = (struct opcdef *) OPENSSL_malloc(8 + len); | ||
| 357 | opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; | ||
| 358 | memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); | ||
| 359 | opcdef_p->opc$l_ms_rqstid = 0; | ||
| 360 | memcpy(&opcdef_p->opc$l_ms_text, buf, len); | ||
| 361 | |||
| 362 | opc_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
| 363 | opc_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
| 364 | opc_dsc.dsc$a_pointer = (char *)opcdef_p; | ||
| 365 | opc_dsc.dsc$w_length = len + 8; | ||
| 366 | |||
| 367 | sys$sndopr(opc_dsc, 0); | ||
| 368 | |||
| 369 | OPENSSL_free(opcdef_p); | ||
| 370 | } | ||
| 371 | |||
| 372 | static void xcloselog(BIO* bp) | ||
| 373 | { | ||
| 374 | } | ||
| 375 | |||
| 376 | #else /* Unix */ | ||
| 377 | |||
| 378 | static void xopenlog(BIO* bp, char* name, int level) | ||
| 379 | { | ||
| 380 | openlog(name, LOG_PID|LOG_CONS, level); | ||
| 381 | } | ||
| 382 | |||
| 383 | static void xsyslog(BIO *bp, int priority, const char *string) | ||
| 384 | { | ||
| 385 | syslog(priority, "%s", string); | ||
| 386 | } | ||
| 387 | |||
| 388 | static void xcloselog(BIO* bp) | ||
| 389 | { | ||
| 227 | closelog(); | 390 | closelog(); |
| 228 | #endif | ||
| 229 | return(1); | ||
| 230 | } | 391 | } |
| 231 | 392 | ||
| 232 | #endif | 393 | #endif /* Unix */ |
| 394 | |||
| 395 | #endif /* NO_SYSLOG */ | ||
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c index 40c4e39f02..28ff7582bf 100644 --- a/src/lib/libcrypto/bio/bss_mem.c +++ b/src/lib/libcrypto/bio/bss_mem.c | |||
| @@ -59,26 +59,15 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include "bio.h" | 62 | #include <openssl/bio.h> |
| 63 | 63 | ||
| 64 | #ifndef NOPROTO | 64 | static int mem_write(BIO *h, const char *buf, int num); |
| 65 | static int mem_write(BIO *h,char *buf,int num); | 65 | static int mem_read(BIO *h, char *buf, int size); |
| 66 | static int mem_read(BIO *h,char *buf,int size); | 66 | static int mem_puts(BIO *h, const char *str); |
| 67 | static int mem_puts(BIO *h,char *str); | 67 | static int mem_gets(BIO *h, char *str, int size); |
| 68 | static int mem_gets(BIO *h,char *str,int size); | 68 | static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static long mem_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 70 | static int mem_new(BIO *h); | 69 | static int mem_new(BIO *h); |
| 71 | static int mem_free(BIO *data); | 70 | static int mem_free(BIO *data); |
| 72 | #else | ||
| 73 | static int mem_write(); | ||
| 74 | static int mem_read(); | ||
| 75 | static int mem_puts(); | ||
| 76 | static int mem_gets(); | ||
| 77 | static long mem_ctrl(); | ||
| 78 | static int mem_new(); | ||
| 79 | static int mem_free(); | ||
| 80 | #endif | ||
| 81 | |||
| 82 | static BIO_METHOD mem_method= | 71 | static BIO_METHOD mem_method= |
| 83 | { | 72 | { |
| 84 | BIO_TYPE_MEM, | 73 | BIO_TYPE_MEM, |
| @@ -90,15 +79,38 @@ static BIO_METHOD mem_method= | |||
| 90 | mem_ctrl, | 79 | mem_ctrl, |
| 91 | mem_new, | 80 | mem_new, |
| 92 | mem_free, | 81 | mem_free, |
| 82 | NULL, | ||
| 93 | }; | 83 | }; |
| 94 | 84 | ||
| 95 | BIO_METHOD *BIO_s_mem() | 85 | /* bio->num is used to hold the value to return on 'empty', if it is |
| 86 | * 0, should_retry is not set */ | ||
| 87 | |||
| 88 | BIO_METHOD *BIO_s_mem(void) | ||
| 96 | { | 89 | { |
| 97 | return(&mem_method); | 90 | return(&mem_method); |
| 98 | } | 91 | } |
| 99 | 92 | ||
| 100 | static int mem_new(bi) | 93 | BIO *BIO_new_mem_buf(void *buf, int len) |
| 101 | BIO *bi; | 94 | { |
| 95 | BIO *ret; | ||
| 96 | BUF_MEM *b; | ||
| 97 | if (!buf) { | ||
| 98 | BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); | ||
| 99 | return NULL; | ||
| 100 | } | ||
| 101 | if(len == -1) len = strlen(buf); | ||
| 102 | if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; | ||
| 103 | b = (BUF_MEM *)ret->ptr; | ||
| 104 | b->data = buf; | ||
| 105 | b->length = len; | ||
| 106 | b->max = len; | ||
| 107 | ret->flags |= BIO_FLAGS_MEM_RDONLY; | ||
| 108 | /* Since this is static data retrying wont help */ | ||
| 109 | ret->num = 0; | ||
| 110 | return ret; | ||
| 111 | } | ||
| 112 | |||
| 113 | static int mem_new(BIO *bi) | ||
| 102 | { | 114 | { |
| 103 | BUF_MEM *b; | 115 | BUF_MEM *b; |
| 104 | 116 | ||
| @@ -106,30 +118,29 @@ BIO *bi; | |||
| 106 | return(0); | 118 | return(0); |
| 107 | bi->shutdown=1; | 119 | bi->shutdown=1; |
| 108 | bi->init=1; | 120 | bi->init=1; |
| 109 | bi->num=0; | 121 | bi->num= -1; |
| 110 | bi->ptr=(char *)b; | 122 | bi->ptr=(char *)b; |
| 111 | return(1); | 123 | return(1); |
| 112 | } | 124 | } |
| 113 | 125 | ||
| 114 | static int mem_free(a) | 126 | static int mem_free(BIO *a) |
| 115 | BIO *a; | ||
| 116 | { | 127 | { |
| 117 | if (a == NULL) return(0); | 128 | if (a == NULL) return(0); |
| 118 | if (a->shutdown) | 129 | if (a->shutdown) |
| 119 | { | 130 | { |
| 120 | if ((a->init) && (a->ptr != NULL)) | 131 | if ((a->init) && (a->ptr != NULL)) |
| 121 | { | 132 | { |
| 122 | BUF_MEM_free((BUF_MEM *)a->ptr); | 133 | BUF_MEM *b; |
| 134 | b = (BUF_MEM *)a->ptr; | ||
| 135 | if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL; | ||
| 136 | BUF_MEM_free(b); | ||
| 123 | a->ptr=NULL; | 137 | a->ptr=NULL; |
| 124 | } | 138 | } |
| 125 | } | 139 | } |
| 126 | return(1); | 140 | return(1); |
| 127 | } | 141 | } |
| 128 | 142 | ||
| 129 | static int mem_read(b,out,outl) | 143 | static int mem_read(BIO *b, char *out, int outl) |
| 130 | BIO *b; | ||
| 131 | char *out; | ||
| 132 | int outl; | ||
| 133 | { | 144 | { |
| 134 | int ret= -1; | 145 | int ret= -1; |
| 135 | BUF_MEM *bm; | 146 | BUF_MEM *bm; |
| @@ -139,28 +150,27 @@ int outl; | |||
| 139 | bm=(BUF_MEM *)b->ptr; | 150 | bm=(BUF_MEM *)b->ptr; |
| 140 | BIO_clear_retry_flags(b); | 151 | BIO_clear_retry_flags(b); |
| 141 | ret=(outl > bm->length)?bm->length:outl; | 152 | ret=(outl > bm->length)?bm->length:outl; |
| 142 | if ((out != NULL) && (ret > 0)) | 153 | if ((out != NULL) && (ret > 0)) { |
| 143 | { | ||
| 144 | memcpy(out,bm->data,ret); | 154 | memcpy(out,bm->data,ret); |
| 145 | bm->length-=ret; | 155 | bm->length-=ret; |
| 146 | /* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */ | 156 | /* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */ |
| 147 | from=(char *)&(bm->data[ret]); | 157 | if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; |
| 148 | to=(char *)&(bm->data[0]); | 158 | else { |
| 149 | for (i=0; i<bm->length; i++) | 159 | from=(char *)&(bm->data[ret]); |
| 150 | to[i]=from[i]; | 160 | to=(char *)&(bm->data[0]); |
| 161 | for (i=0; i<bm->length; i++) | ||
| 162 | to[i]=from[i]; | ||
| 151 | } | 163 | } |
| 152 | else if (bm->length == 0) | 164 | } else if (bm->length == 0) |
| 153 | { | 165 | { |
| 154 | BIO_set_retry_read(b); | 166 | ret = b->num; |
| 155 | ret= -1; | 167 | if (ret != 0) |
| 168 | BIO_set_retry_read(b); | ||
| 156 | } | 169 | } |
| 157 | return(ret); | 170 | return(ret); |
| 158 | } | 171 | } |
| 159 | 172 | ||
| 160 | static int mem_write(b,in,inl) | 173 | static int mem_write(BIO *b, const char *in, int inl) |
| 161 | BIO *b; | ||
| 162 | char *in; | ||
| 163 | int inl; | ||
| 164 | { | 174 | { |
| 165 | int ret= -1; | 175 | int ret= -1; |
| 166 | int blen; | 176 | int blen; |
| @@ -173,6 +183,11 @@ int inl; | |||
| 173 | goto end; | 183 | goto end; |
| 174 | } | 184 | } |
| 175 | 185 | ||
| 186 | if(b->flags & BIO_FLAGS_MEM_RDONLY) { | ||
| 187 | BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO); | ||
| 188 | goto end; | ||
| 189 | } | ||
| 190 | |||
| 176 | BIO_clear_retry_flags(b); | 191 | BIO_clear_retry_flags(b); |
| 177 | blen=bm->length; | 192 | blen=bm->length; |
| 178 | if (BUF_MEM_grow(bm,blen+inl) != (blen+inl)) | 193 | if (BUF_MEM_grow(bm,blen+inl) != (blen+inl)) |
| @@ -183,11 +198,7 @@ end: | |||
| 183 | return(ret); | 198 | return(ret); |
| 184 | } | 199 | } |
| 185 | 200 | ||
| 186 | static long mem_ctrl(b,cmd,num,ptr) | 201 | static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 187 | BIO *b; | ||
| 188 | int cmd; | ||
| 189 | long num; | ||
| 190 | char *ptr; | ||
| 191 | { | 202 | { |
| 192 | long ret=1; | 203 | long ret=1; |
| 193 | char **pptr; | 204 | char **pptr; |
| @@ -198,12 +209,26 @@ char *ptr; | |||
| 198 | { | 209 | { |
| 199 | case BIO_CTRL_RESET: | 210 | case BIO_CTRL_RESET: |
| 200 | if (bm->data != NULL) | 211 | if (bm->data != NULL) |
| 201 | memset(bm->data,0,bm->max); | 212 | { |
| 202 | bm->length=0; | 213 | /* For read only case reset to the start again */ |
| 214 | if(b->flags & BIO_FLAGS_MEM_RDONLY) | ||
| 215 | { | ||
| 216 | bm->data -= bm->max - bm->length; | ||
| 217 | bm->length = bm->max; | ||
| 218 | } | ||
| 219 | else | ||
| 220 | { | ||
| 221 | memset(bm->data,0,bm->max); | ||
| 222 | bm->length=0; | ||
| 223 | } | ||
| 224 | } | ||
| 203 | break; | 225 | break; |
| 204 | case BIO_CTRL_EOF: | 226 | case BIO_CTRL_EOF: |
| 205 | ret=(long)(bm->length == 0); | 227 | ret=(long)(bm->length == 0); |
| 206 | break; | 228 | break; |
| 229 | case BIO_C_SET_BUF_MEM_EOF_RETURN: | ||
| 230 | b->num=(int)num; | ||
| 231 | break; | ||
| 207 | case BIO_CTRL_INFO: | 232 | case BIO_CTRL_INFO: |
| 208 | ret=(long)bm->length; | 233 | ret=(long)bm->length; |
| 209 | if (ptr != NULL) | 234 | if (ptr != NULL) |
| @@ -250,10 +275,7 @@ char *ptr; | |||
| 250 | return(ret); | 275 | return(ret); |
| 251 | } | 276 | } |
| 252 | 277 | ||
| 253 | static int mem_gets(bp,buf,size) | 278 | static int mem_gets(BIO *bp, char *buf, int size) |
| 254 | BIO *bp; | ||
| 255 | char *buf; | ||
| 256 | int size; | ||
| 257 | { | 279 | { |
| 258 | int i,j; | 280 | int i,j; |
| 259 | int ret= -1; | 281 | int ret= -1; |
| @@ -283,9 +305,7 @@ int size; | |||
| 283 | return(ret); | 305 | return(ret); |
| 284 | } | 306 | } |
| 285 | 307 | ||
| 286 | static int mem_puts(bp,str) | 308 | static int mem_puts(BIO *bp, const char *str) |
| 287 | BIO *bp; | ||
| 288 | char *str; | ||
| 289 | { | 309 | { |
| 290 | int n,ret; | 310 | int n,ret; |
| 291 | 311 | ||
diff --git a/src/lib/libcrypto/bio/bss_null.c b/src/lib/libcrypto/bio/bss_null.c index 0791a2471a..46b73339df 100644 --- a/src/lib/libcrypto/bio/bss_null.c +++ b/src/lib/libcrypto/bio/bss_null.c | |||
| @@ -59,26 +59,15 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <errno.h> | 60 | #include <errno.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include "bio.h" | 62 | #include <openssl/bio.h> |
| 63 | 63 | ||
| 64 | #ifndef NOPROTO | 64 | static int null_write(BIO *h, const char *buf, int num); |
| 65 | static int null_write(BIO *h,char *buf,int num); | 65 | static int null_read(BIO *h, char *buf, int size); |
| 66 | static int null_read(BIO *h,char *buf,int size); | 66 | static int null_puts(BIO *h, const char *str); |
| 67 | static int null_puts(BIO *h,char *str); | 67 | static int null_gets(BIO *h, char *str, int size); |
| 68 | static int null_gets(BIO *h,char *str,int size); | 68 | static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static long null_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 70 | static int null_new(BIO *h); | 69 | static int null_new(BIO *h); |
| 71 | static int null_free(BIO *data); | 70 | static int null_free(BIO *data); |
| 72 | #else | ||
| 73 | static int null_write(); | ||
| 74 | static int null_read(); | ||
| 75 | static int null_puts(); | ||
| 76 | static int null_gets(); | ||
| 77 | static long null_ctrl(); | ||
| 78 | static int null_new(); | ||
| 79 | static int null_free(); | ||
| 80 | #endif | ||
| 81 | |||
| 82 | static BIO_METHOD null_method= | 71 | static BIO_METHOD null_method= |
| 83 | { | 72 | { |
| 84 | BIO_TYPE_NULL, | 73 | BIO_TYPE_NULL, |
| @@ -90,15 +79,15 @@ static BIO_METHOD null_method= | |||
| 90 | null_ctrl, | 79 | null_ctrl, |
| 91 | null_new, | 80 | null_new, |
| 92 | null_free, | 81 | null_free, |
| 82 | NULL, | ||
| 93 | }; | 83 | }; |
| 94 | 84 | ||
| 95 | BIO_METHOD *BIO_s_null() | 85 | BIO_METHOD *BIO_s_null(void) |
| 96 | { | 86 | { |
| 97 | return(&null_method); | 87 | return(&null_method); |
| 98 | } | 88 | } |
| 99 | 89 | ||
| 100 | static int null_new(bi) | 90 | static int null_new(BIO *bi) |
| 101 | BIO *bi; | ||
| 102 | { | 91 | { |
| 103 | bi->init=1; | 92 | bi->init=1; |
| 104 | bi->num=0; | 93 | bi->num=0; |
| @@ -106,34 +95,23 @@ BIO *bi; | |||
| 106 | return(1); | 95 | return(1); |
| 107 | } | 96 | } |
| 108 | 97 | ||
| 109 | static int null_free(a) | 98 | static int null_free(BIO *a) |
| 110 | BIO *a; | ||
| 111 | { | 99 | { |
| 112 | if (a == NULL) return(0); | 100 | if (a == NULL) return(0); |
| 113 | return(1); | 101 | return(1); |
| 114 | } | 102 | } |
| 115 | 103 | ||
| 116 | static int null_read(b,out,outl) | 104 | static int null_read(BIO *b, char *out, int outl) |
| 117 | BIO *b; | ||
| 118 | char *out; | ||
| 119 | int outl; | ||
| 120 | { | 105 | { |
| 121 | return(0); | 106 | return(0); |
| 122 | } | 107 | } |
| 123 | 108 | ||
| 124 | static int null_write(b,in,inl) | 109 | static int null_write(BIO *b, const char *in, int inl) |
| 125 | BIO *b; | ||
| 126 | char *in; | ||
| 127 | int inl; | ||
| 128 | { | 110 | { |
| 129 | return(inl); | 111 | return(inl); |
| 130 | } | 112 | } |
| 131 | 113 | ||
| 132 | static long null_ctrl(b,cmd,num,ptr) | 114 | static long null_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 133 | BIO *b; | ||
| 134 | int cmd; | ||
| 135 | long num; | ||
| 136 | char *ptr; | ||
| 137 | { | 115 | { |
| 138 | long ret=1; | 116 | long ret=1; |
| 139 | 117 | ||
| @@ -159,17 +137,12 @@ char *ptr; | |||
| 159 | return(ret); | 137 | return(ret); |
| 160 | } | 138 | } |
| 161 | 139 | ||
| 162 | static int null_gets(bp,buf,size) | 140 | static int null_gets(BIO *bp, char *buf, int size) |
| 163 | BIO *bp; | ||
| 164 | char *buf; | ||
| 165 | int size; | ||
| 166 | { | 141 | { |
| 167 | return(0); | 142 | return(0); |
| 168 | } | 143 | } |
| 169 | 144 | ||
| 170 | static int null_puts(bp,str) | 145 | static int null_puts(BIO *bp, const char *str) |
| 171 | BIO *bp; | ||
| 172 | char *str; | ||
| 173 | { | 146 | { |
| 174 | if (str == NULL) return(0); | 147 | if (str == NULL) return(0); |
| 175 | return(strlen(str)); | 148 | return(strlen(str)); |
diff --git a/src/lib/libcrypto/bio/bss_sock.c b/src/lib/libcrypto/bio/bss_sock.c index d907a2867b..fdabd16d7e 100644 --- a/src/lib/libcrypto/bio/bss_sock.c +++ b/src/lib/libcrypto/bio/bss_sock.c | |||
| @@ -56,55 +56,22 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #if !defined(NO_SOCK) || defined(BIO_FD) | 59 | #ifndef OPENSSL_NO_SOCK |
| 60 | 60 | ||
| 61 | #include <stdio.h> | 61 | #include <stdio.h> |
| 62 | #include <errno.h> | 62 | #include <errno.h> |
| 63 | #define USE_SOCKETS | 63 | #define USE_SOCKETS |
| 64 | #include "cryptlib.h" | 64 | #include "cryptlib.h" |
| 65 | #include "bio.h" | 65 | #include <openssl/bio.h> |
| 66 | 66 | ||
| 67 | #ifndef BIO_FD | 67 | static int sock_write(BIO *h, const char *buf, int num); |
| 68 | #ifndef NOPROTO | 68 | static int sock_read(BIO *h, char *buf, int size); |
| 69 | static int sock_write(BIO *h,char *buf,int num); | 69 | static int sock_puts(BIO *h, const char *str); |
| 70 | static int sock_read(BIO *h,char *buf,int size); | 70 | static long sock_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 71 | static int sock_puts(BIO *h,char *str); | ||
| 72 | static long sock_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 73 | static int sock_new(BIO *h); | 71 | static int sock_new(BIO *h); |
| 74 | static int sock_free(BIO *data); | 72 | static int sock_free(BIO *data); |
| 75 | int BIO_sock_should_retry(int s); | 73 | int BIO_sock_should_retry(int s); |
| 76 | #else | ||
| 77 | static int sock_write(); | ||
| 78 | static int sock_read(); | ||
| 79 | static int sock_puts(); | ||
| 80 | static long sock_ctrl(); | ||
| 81 | static int sock_new(); | ||
| 82 | static int sock_free(); | ||
| 83 | int BIO_sock_should_retry(); | ||
| 84 | #endif | ||
| 85 | |||
| 86 | #else | ||
| 87 | |||
| 88 | #ifndef NOPROTO | ||
| 89 | static int fd_write(BIO *h,char *buf,int num); | ||
| 90 | static int fd_read(BIO *h,char *buf,int size); | ||
| 91 | static int fd_puts(BIO *h,char *str); | ||
| 92 | static long fd_ctrl(BIO *h,int cmd,long arg1,char *arg2); | ||
| 93 | static int fd_new(BIO *h); | ||
| 94 | static int fd_free(BIO *data); | ||
| 95 | int BIO_fd_should_retry(int s); | ||
| 96 | #else | ||
| 97 | static int fd_write(); | ||
| 98 | static int fd_read(); | ||
| 99 | static int fd_puts(); | ||
| 100 | static long fd_ctrl(); | ||
| 101 | static int fd_new(); | ||
| 102 | static int fd_free(); | ||
| 103 | int BIO_fd_should_retry(); | ||
| 104 | #endif | ||
| 105 | #endif | ||
| 106 | 74 | ||
| 107 | #ifndef BIO_FD | ||
| 108 | static BIO_METHOD methods_sockp= | 75 | static BIO_METHOD methods_sockp= |
| 109 | { | 76 | { |
| 110 | BIO_TYPE_SOCKET, | 77 | BIO_TYPE_SOCKET, |
| @@ -116,57 +83,25 @@ static BIO_METHOD methods_sockp= | |||
| 116 | sock_ctrl, | 83 | sock_ctrl, |
| 117 | sock_new, | 84 | sock_new, |
| 118 | sock_free, | 85 | sock_free, |
| 86 | NULL, | ||
| 119 | }; | 87 | }; |
| 120 | 88 | ||
| 121 | BIO_METHOD *BIO_s_socket() | 89 | BIO_METHOD *BIO_s_socket(void) |
| 122 | { | 90 | { |
| 123 | return(&methods_sockp); | 91 | return(&methods_sockp); |
| 124 | } | 92 | } |
| 125 | #else | ||
| 126 | static BIO_METHOD methods_fdp= | ||
| 127 | { | ||
| 128 | BIO_TYPE_FD,"file descriptor", | ||
| 129 | fd_write, | ||
| 130 | fd_read, | ||
| 131 | fd_puts, | ||
| 132 | NULL, /* fd_gets, */ | ||
| 133 | fd_ctrl, | ||
| 134 | fd_new, | ||
| 135 | fd_free, | ||
| 136 | }; | ||
| 137 | 93 | ||
| 138 | BIO_METHOD *BIO_s_fd() | 94 | BIO *BIO_new_socket(int fd, int close_flag) |
| 139 | { | ||
| 140 | return(&methods_fdp); | ||
| 141 | } | ||
| 142 | #endif | ||
| 143 | |||
| 144 | #ifndef BIO_FD | ||
| 145 | BIO *BIO_new_socket(fd,close_flag) | ||
| 146 | #else | ||
| 147 | BIO *BIO_new_fd(fd,close_flag) | ||
| 148 | #endif | ||
| 149 | int fd; | ||
| 150 | int close_flag; | ||
| 151 | { | 95 | { |
| 152 | BIO *ret; | 96 | BIO *ret; |
| 153 | 97 | ||
| 154 | #ifndef BIO_FD | ||
| 155 | ret=BIO_new(BIO_s_socket()); | 98 | ret=BIO_new(BIO_s_socket()); |
| 156 | #else | ||
| 157 | ret=BIO_new(BIO_s_fd()); | ||
| 158 | #endif | ||
| 159 | if (ret == NULL) return(NULL); | 99 | if (ret == NULL) return(NULL); |
| 160 | BIO_set_fd(ret,fd,close_flag); | 100 | BIO_set_fd(ret,fd,close_flag); |
| 161 | return(ret); | 101 | return(ret); |
| 162 | } | 102 | } |
| 163 | 103 | ||
| 164 | #ifndef BIO_FD | 104 | static int sock_new(BIO *bi) |
| 165 | static int sock_new(bi) | ||
| 166 | #else | ||
| 167 | static int fd_new(bi) | ||
| 168 | #endif | ||
| 169 | BIO *bi; | ||
| 170 | { | 105 | { |
| 171 | bi->init=0; | 106 | bi->init=0; |
| 172 | bi->num=0; | 107 | bi->num=0; |
| @@ -175,29 +110,14 @@ BIO *bi; | |||
| 175 | return(1); | 110 | return(1); |
| 176 | } | 111 | } |
| 177 | 112 | ||
| 178 | #ifndef BIO_FD | 113 | static int sock_free(BIO *a) |
| 179 | static int sock_free(a) | ||
| 180 | #else | ||
| 181 | static int fd_free(a) | ||
| 182 | #endif | ||
| 183 | BIO *a; | ||
| 184 | { | 114 | { |
| 185 | if (a == NULL) return(0); | 115 | if (a == NULL) return(0); |
| 186 | if (a->shutdown) | 116 | if (a->shutdown) |
| 187 | { | 117 | { |
| 188 | if (a->init) | 118 | if (a->init) |
| 189 | { | 119 | { |
| 190 | #ifndef BIO_FD | 120 | SHUTDOWN2(a->num); |
| 191 | shutdown(a->num,2); | ||
| 192 | # ifdef WINDOWS | ||
| 193 | closesocket(a->num); | ||
| 194 | # else | ||
| 195 | close(a->num); | ||
| 196 | # endif | ||
| 197 | #else /* BIO_FD */ | ||
| 198 | close(a->num); | ||
| 199 | #endif | ||
| 200 | |||
| 201 | } | 121 | } |
| 202 | a->init=0; | 122 | a->init=0; |
| 203 | a->flags=0; | 123 | a->flags=0; |
| @@ -205,80 +125,40 @@ BIO *a; | |||
| 205 | return(1); | 125 | return(1); |
| 206 | } | 126 | } |
| 207 | 127 | ||
| 208 | #ifndef BIO_FD | 128 | static int sock_read(BIO *b, char *out, int outl) |
| 209 | static int sock_read(b,out,outl) | ||
| 210 | #else | ||
| 211 | static int fd_read(b,out,outl) | ||
| 212 | #endif | ||
| 213 | BIO *b; | ||
| 214 | char *out; | ||
| 215 | int outl; | ||
| 216 | { | 129 | { |
| 217 | int ret=0; | 130 | int ret=0; |
| 218 | 131 | ||
| 219 | if (out != NULL) | 132 | if (out != NULL) |
| 220 | { | 133 | { |
| 221 | #if defined(WINDOWS) && !defined(BIO_FD) | ||
| 222 | clear_socket_error(); | 134 | clear_socket_error(); |
| 223 | ret=recv(b->num,out,outl,0); | 135 | ret=readsocket(b->num,out,outl); |
| 224 | #else | ||
| 225 | clear_sys_error(); | ||
| 226 | ret=read(b->num,out,outl); | ||
| 227 | #endif | ||
| 228 | BIO_clear_retry_flags(b); | 136 | BIO_clear_retry_flags(b); |
| 229 | if (ret <= 0) | 137 | if (ret <= 0) |
| 230 | { | 138 | { |
| 231 | #ifndef BIO_FD | ||
| 232 | if (BIO_sock_should_retry(ret)) | 139 | if (BIO_sock_should_retry(ret)) |
| 233 | #else | ||
| 234 | if (BIO_fd_should_retry(ret)) | ||
| 235 | #endif | ||
| 236 | BIO_set_retry_read(b); | 140 | BIO_set_retry_read(b); |
| 237 | } | 141 | } |
| 238 | } | 142 | } |
| 239 | return(ret); | 143 | return(ret); |
| 240 | } | 144 | } |
| 241 | 145 | ||
| 242 | #ifndef BIO_FD | 146 | static int sock_write(BIO *b, const char *in, int inl) |
| 243 | static int sock_write(b,in,inl) | ||
| 244 | #else | ||
| 245 | static int fd_write(b,in,inl) | ||
| 246 | #endif | ||
| 247 | BIO *b; | ||
| 248 | char *in; | ||
| 249 | int inl; | ||
| 250 | { | 147 | { |
| 251 | int ret; | 148 | int ret; |
| 252 | 149 | ||
| 253 | #if defined(WINDOWS) && !defined(BIO_FD) | ||
| 254 | clear_socket_error(); | 150 | clear_socket_error(); |
| 255 | ret=send(b->num,in,inl,0); | 151 | ret=writesocket(b->num,in,inl); |
| 256 | #else | ||
| 257 | clear_sys_error(); | ||
| 258 | ret=write(b->num,in,inl); | ||
| 259 | #endif | ||
| 260 | BIO_clear_retry_flags(b); | 152 | BIO_clear_retry_flags(b); |
| 261 | if (ret <= 0) | 153 | if (ret <= 0) |
| 262 | { | 154 | { |
| 263 | #ifndef BIO_FD | ||
| 264 | if (BIO_sock_should_retry(ret)) | 155 | if (BIO_sock_should_retry(ret)) |
| 265 | #else | ||
| 266 | if (BIO_fd_should_retry(ret)) | ||
| 267 | #endif | ||
| 268 | BIO_set_retry_write(b); | 156 | BIO_set_retry_write(b); |
| 269 | } | 157 | } |
| 270 | return(ret); | 158 | return(ret); |
| 271 | } | 159 | } |
| 272 | 160 | ||
| 273 | #ifndef BIO_FD | 161 | static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 274 | static long sock_ctrl(b,cmd,num,ptr) | ||
| 275 | #else | ||
| 276 | static long fd_ctrl(b,cmd,num,ptr) | ||
| 277 | #endif | ||
| 278 | BIO *b; | ||
| 279 | int cmd; | ||
| 280 | long num; | ||
| 281 | char *ptr; | ||
| 282 | { | 162 | { |
| 283 | long ret=1; | 163 | long ret=1; |
| 284 | int *ip; | 164 | int *ip; |
| @@ -286,21 +166,16 @@ char *ptr; | |||
| 286 | switch (cmd) | 166 | switch (cmd) |
| 287 | { | 167 | { |
| 288 | case BIO_CTRL_RESET: | 168 | case BIO_CTRL_RESET: |
| 289 | #ifdef BIO_FD | 169 | num=0; |
| 290 | ret=(long)lseek(b->num,0,0); | 170 | case BIO_C_FILE_SEEK: |
| 291 | #else | ||
| 292 | ret=0; | 171 | ret=0; |
| 293 | #endif | ||
| 294 | break; | 172 | break; |
| 173 | case BIO_C_FILE_TELL: | ||
| 295 | case BIO_CTRL_INFO: | 174 | case BIO_CTRL_INFO: |
| 296 | ret=0; | 175 | ret=0; |
| 297 | break; | 176 | break; |
| 298 | case BIO_C_SET_FD: | 177 | case BIO_C_SET_FD: |
| 299 | #ifndef BIO_FD | ||
| 300 | sock_free(b); | 178 | sock_free(b); |
| 301 | #else | ||
| 302 | fd_free(b); | ||
| 303 | #endif | ||
| 304 | b->num= *((int *)ptr); | 179 | b->num= *((int *)ptr); |
| 305 | b->shutdown=(int)num; | 180 | b->shutdown=(int)num; |
| 306 | b->init=1; | 181 | b->init=1; |
| @@ -329,7 +204,6 @@ char *ptr; | |||
| 329 | case BIO_CTRL_FLUSH: | 204 | case BIO_CTRL_FLUSH: |
| 330 | ret=1; | 205 | ret=1; |
| 331 | break; | 206 | break; |
| 332 | break; | ||
| 333 | default: | 207 | default: |
| 334 | ret=0; | 208 | ret=0; |
| 335 | break; | 209 | break; |
| @@ -337,82 +211,46 @@ char *ptr; | |||
| 337 | return(ret); | 211 | return(ret); |
| 338 | } | 212 | } |
| 339 | 213 | ||
| 340 | #ifdef undef | 214 | static int sock_puts(BIO *bp, const char *str) |
| 341 | static int sock_gets(bp,buf,size) | ||
| 342 | BIO *bp; | ||
| 343 | char *buf; | ||
| 344 | int size; | ||
| 345 | { | ||
| 346 | return(-1); | ||
| 347 | } | ||
| 348 | #endif | ||
| 349 | |||
| 350 | #ifndef BIO_FD | ||
| 351 | static int sock_puts(bp,str) | ||
| 352 | #else | ||
| 353 | static int fd_puts(bp,str) | ||
| 354 | #endif | ||
| 355 | BIO *bp; | ||
| 356 | char *str; | ||
| 357 | { | 215 | { |
| 358 | int n,ret; | 216 | int n,ret; |
| 359 | 217 | ||
| 360 | n=strlen(str); | 218 | n=strlen(str); |
| 361 | #ifndef BIO_FD | ||
| 362 | ret=sock_write(bp,str,n); | 219 | ret=sock_write(bp,str,n); |
| 363 | #else | ||
| 364 | ret=fd_write(bp,str,n); | ||
| 365 | #endif | ||
| 366 | return(ret); | 220 | return(ret); |
| 367 | } | 221 | } |
| 368 | 222 | ||
| 369 | #ifndef BIO_FD | 223 | int BIO_sock_should_retry(int i) |
| 370 | int BIO_sock_should_retry(i) | ||
| 371 | #else | ||
| 372 | int BIO_fd_should_retry(i) | ||
| 373 | #endif | ||
| 374 | int i; | ||
| 375 | { | 224 | { |
| 376 | int err; | 225 | int err; |
| 377 | 226 | ||
| 378 | if ((i == 0) || (i == -1)) | 227 | if ((i == 0) || (i == -1)) |
| 379 | { | 228 | { |
| 380 | #if !defined(BIO_FD) && defined(WINDOWS) | ||
| 381 | err=get_last_socket_error(); | 229 | err=get_last_socket_error(); |
| 382 | #else | ||
| 383 | err=get_last_sys_error(); | ||
| 384 | #endif | ||
| 385 | 230 | ||
| 386 | #if defined(WINDOWS) /* more microsoft stupidity */ | 231 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ |
| 387 | if ((i == -1) && (err == 0)) | 232 | if ((i == -1) && (err == 0)) |
| 388 | return(1); | 233 | return(1); |
| 389 | #endif | 234 | #endif |
| 390 | 235 | ||
| 391 | #ifndef BIO_FD | ||
| 392 | return(BIO_sock_non_fatal_error(err)); | 236 | return(BIO_sock_non_fatal_error(err)); |
| 393 | #else | ||
| 394 | return(BIO_fd_non_fatal_error(err)); | ||
| 395 | #endif | ||
| 396 | } | 237 | } |
| 397 | return(0); | 238 | return(0); |
| 398 | } | 239 | } |
| 399 | 240 | ||
| 400 | #ifndef BIO_FD | 241 | int BIO_sock_non_fatal_error(int err) |
| 401 | int BIO_sock_non_fatal_error(err) | ||
| 402 | #else | ||
| 403 | int BIO_fd_non_fatal_error(err) | ||
| 404 | #endif | ||
| 405 | int err; | ||
| 406 | { | 242 | { |
| 407 | switch (err) | 243 | switch (err) |
| 408 | { | 244 | { |
| 409 | #if !defined(BIO_FD) && defined(WINDOWS) | 245 | #if defined(OPENSSL_SYS_WINDOWS) |
| 410 | # if defined(WSAEWOULDBLOCK) | 246 | # if defined(WSAEWOULDBLOCK) |
| 411 | case WSAEWOULDBLOCK: | 247 | case WSAEWOULDBLOCK: |
| 412 | # endif | 248 | # endif |
| 413 | 249 | ||
| 414 | # if defined(WSAENOTCONN) | 250 | # if 0 /* This appears to always be an error */ |
| 251 | # if defined(WSAENOTCONN) | ||
| 415 | case WSAENOTCONN: | 252 | case WSAENOTCONN: |
| 253 | # endif | ||
| 416 | # endif | 254 | # endif |
| 417 | #endif | 255 | #endif |
| 418 | 256 | ||
| @@ -452,7 +290,7 @@ int err; | |||
| 452 | case EALREADY: | 290 | case EALREADY: |
| 453 | #endif | 291 | #endif |
| 454 | return(1); | 292 | return(1); |
| 455 | break; | 293 | /* break; */ |
| 456 | default: | 294 | default: |
| 457 | break; | 295 | break; |
| 458 | } | 296 | } |
