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 182