1 /* 2 * Copyright 2005-2023 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include "internal/e_os.h" 11 #include "internal/sockets.h" 12 #include "internal/bio_addr.h" 13 14 /* BEGIN BIO_ADDRINFO/BIO_ADDR stuff. */ 15 16 #ifndef OPENSSL_NO_SOCK 17 /* 18 * Throughout this file and b_addr.c, the existence of the macro 19 * AI_PASSIVE is used to detect the availability of struct addrinfo, 20 * getnameinfo() and getaddrinfo(). If that macro doesn't exist, 21 * we use our own implementation instead. 22 */ 23 24 /* 25 * It's imperative that these macros get defined before openssl/bio.h gets 26 * included. Otherwise, the AI_PASSIVE hack will not work properly. 27 * For clarity, we check for internal/cryptlib.h since it's a common header 28 * that also includes bio.h. 29 */ 30 #ifdef OSSL_INTERNAL_CRYPTLIB_H 31 #error internal/cryptlib.h included before bio_local.h 32 #endif 33 #ifdef OPENSSL_BIO_H 34 #error openssl/bio.h included before bio_local.h 35 #endif 36 37 #ifdef AI_PASSIVE 38 39 /* 40 * There's a bug in VMS C header file netdb.h, where struct addrinfo 41 * always is the P32 variant, but the functions that handle that structure, 42 * such as getaddrinfo() and freeaddrinfo() adapt to the initial pointer 43 * size. The easiest workaround is to force struct addrinfo to be the 44 * 64-bit variant when compiling in P64 mode. 45 */ 46 #if defined(OPENSSL_SYS_VMS) && __INITIAL_POINTER_SIZE == 64 47 #define addrinfo __addrinfo64 48 #endif 49 50 #define bio_addrinfo_st addrinfo 51 #define bai_family ai_family 52 #define bai_socktype ai_socktype 53 #define bai_protocol ai_protocol 54 #define bai_addrlen ai_addrlen 55 #define bai_addr ai_addr 56 #define bai_next ai_next 57 #else 58 struct bio_addrinfo_st { 59 int bai_family; 60 int bai_socktype; 61 int bai_protocol; 62 size_t bai_addrlen; 63 struct sockaddr *bai_addr; 64 struct bio_addrinfo_st *bai_next; 65 }; 66 #endif 67 #endif 68 69 /* END BIO_ADDRINFO/BIO_ADDR stuff. */ 70 71 #include "internal/cryptlib.h" 72 #include "internal/bio.h" 73 #include "internal/refcount.h" 74 75 typedef struct bio_f_buffer_ctx_struct { 76 /*- 77 * Buffers are setup like this: 78 * 79 * <---------------------- size -----------------------> 80 * +---------------------------------------------------+ 81 * | consumed | remaining | free space | 82 * +---------------------------------------------------+ 83 * <-- off --><------- len -------> 84 */ 85 /*- BIO *bio; */ /* 86 * this is now in the BIO struct 87 */ 88 int ibuf_size; /* how big is the input buffer */ 89 int obuf_size; /* how big is the output buffer */ 90 char *ibuf; /* the char array */ 91 int ibuf_len; /* how many bytes are in it */ 92 int ibuf_off; /* write/read offset */ 93 char *obuf; /* the char array */ 94 int obuf_len; /* how many bytes are in it */ 95 int obuf_off; /* write/read offset */ 96 } BIO_F_BUFFER_CTX; 97 98 struct bio_st { 99 OSSL_LIB_CTX *libctx; 100 const BIO_METHOD *method; 101 /* bio, mode, argp, argi, argl, ret */ 102 #ifndef OPENSSL_NO_DEPRECATED_3_0 103 BIO_callback_fn callback; 104 #endif 105 BIO_callback_fn_ex callback_ex; 106 char *cb_arg; /* first argument for the callback */ 107 int init; 108 int shutdown; 109 int flags; /* extra storage */ 110 int retry_reason; 111 int num; 112 void *ptr; 113 struct bio_st *next_bio; /* used by filter BIOs */ 114 struct bio_st *prev_bio; /* used by filter BIOs */ 115 CRYPTO_REF_COUNT references; 116 uint64_t num_read; 117 uint64_t num_write; 118 CRYPTO_EX_DATA ex_data; 119 }; 120 121 #ifndef OPENSSL_NO_SOCK 122 #ifdef OPENSSL_SYS_VMS 123 typedef unsigned int socklen_t; 124 #endif 125 126 extern CRYPTO_RWLOCK *bio_lookup_lock; 127 128 int BIO_ADDR_make(BIO_ADDR *ap, const struct sockaddr *sa); 129 const struct sockaddr *BIO_ADDR_sockaddr(const BIO_ADDR *ap); 130 struct sockaddr *BIO_ADDR_sockaddr_noconst(BIO_ADDR *ap); 131 socklen_t BIO_ADDR_sockaddr_size(const BIO_ADDR *ap); 132 socklen_t BIO_ADDRINFO_sockaddr_size(const BIO_ADDRINFO *bai); 133 const struct sockaddr *BIO_ADDRINFO_sockaddr(const BIO_ADDRINFO *bai); 134 135 #if defined(OPENSSL_SYS_WINDOWS) && defined(WSAID_WSARECVMSG) 136 #define BIO_HAVE_WSAMSG 137 extern LPFN_WSARECVMSG bio_WSARecvMsg; 138 extern LPFN_WSASENDMSG bio_WSASendMsg; 139 #endif 140 #endif 141 142 extern CRYPTO_REF_COUNT bio_type_count; 143 144 void bio_sock_cleanup_int(void); 145 146 #if BIO_FLAGS_UPLINK_INTERNAL == 0 147 /* Shortcut UPLINK calls on most platforms... */ 148 #define UP_stdin stdin 149 #define UP_stdout stdout 150 #define UP_stderr stderr 151 #define UP_fprintf fprintf 152 #define UP_fgets fgets 153 #define UP_fread fread 154 #define UP_fwrite fwrite 155 #undef UP_fsetmod 156 #define UP_feof feof 157 #define UP_fclose fclose 158 159 #define UP_fopen fopen 160 #define UP_fseek fseek 161 #define UP_ftell ftell 162 #define UP_fflush fflush 163 #define UP_ferror ferror 164 #ifdef _WIN32 165 #define UP_fileno _fileno 166 #define UP_open _open 167 #define UP_read _read 168 #define UP_write _write 169 #define UP_lseek _lseek 170 #define UP_close _close 171 #else 172 #define UP_fileno fileno 173 #define UP_open open 174 #define UP_read read 175 #define UP_write write 176 #define UP_lseek lseek 177 #define UP_close close 178 #endif 179 180 #endif 181