bio_meth.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. * Copyright 2016-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. #include "bio_local.h"
  10. #include "internal/thread_once.h"
  11. CRYPTO_REF_COUNT bio_type_count;
  12. static CRYPTO_ONCE bio_type_init = CRYPTO_ONCE_STATIC_INIT;
  13. DEFINE_RUN_ONCE_STATIC(do_bio_type_init)
  14. {
  15. return CRYPTO_NEW_REF(&bio_type_count, BIO_TYPE_START);
  16. }
  17. int BIO_get_new_index(void)
  18. {
  19. int newval;
  20. if (!RUN_ONCE(&bio_type_init, do_bio_type_init)) {
  21. /* Perhaps the error should be raised in do_bio_type_init()? */
  22. ERR_raise(ERR_LIB_BIO, ERR_R_CRYPTO_LIB);
  23. return -1;
  24. }
  25. if (!CRYPTO_UP_REF(&bio_type_count, &newval))
  26. return -1;
  27. return newval;
  28. }
  29. BIO_METHOD *BIO_meth_new(int type, const char *name)
  30. {
  31. BIO_METHOD *biom = OPENSSL_zalloc(sizeof(BIO_METHOD));
  32. if (biom == NULL
  33. || (biom->name = OPENSSL_strdup(name)) == NULL) {
  34. OPENSSL_free(biom);
  35. return NULL;
  36. }
  37. biom->type = type;
  38. return biom;
  39. }
  40. void BIO_meth_free(BIO_METHOD *biom)
  41. {
  42. if (biom != NULL) {
  43. OPENSSL_free(biom->name);
  44. OPENSSL_free(biom);
  45. }
  46. }
  47. int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int)
  48. {
  49. return biom->bwrite_old;
  50. }
  51. int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t,
  52. size_t *)
  53. {
  54. return biom->bwrite;
  55. }
  56. /* Conversion for old style bwrite to new style */
  57. int bwrite_conv(BIO *bio, const char *data, size_t datal, size_t *written)
  58. {
  59. int ret;
  60. if (datal > INT_MAX)
  61. datal = INT_MAX;
  62. ret = bio->method->bwrite_old(bio, data, (int)datal);
  63. if (ret <= 0) {
  64. *written = 0;
  65. return ret;
  66. }
  67. *written = (size_t)ret;
  68. return 1;
  69. }
  70. int BIO_meth_set_write(BIO_METHOD *biom,
  71. int (*bwrite) (BIO *, const char *, int))
  72. {
  73. biom->bwrite_old = bwrite;
  74. biom->bwrite = bwrite_conv;
  75. return 1;
  76. }
  77. int BIO_meth_set_write_ex(BIO_METHOD *biom,
  78. int (*bwrite) (BIO *, const char *, size_t, size_t *))
  79. {
  80. biom->bwrite_old = NULL;
  81. biom->bwrite = bwrite;
  82. return 1;
  83. }
  84. int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int)
  85. {
  86. return biom->bread_old;
  87. }
  88. int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *)
  89. {
  90. return biom->bread;
  91. }
  92. /* Conversion for old style bread to new style */
  93. int bread_conv(BIO *bio, char *data, size_t datal, size_t *readbytes)
  94. {
  95. int ret;
  96. if (datal > INT_MAX)
  97. datal = INT_MAX;
  98. ret = bio->method->bread_old(bio, data, (int)datal);
  99. if (ret <= 0) {
  100. *readbytes = 0;
  101. return ret;
  102. }
  103. *readbytes = (size_t)ret;
  104. return 1;
  105. }
  106. int BIO_meth_set_read(BIO_METHOD *biom,
  107. int (*bread) (BIO *, char *, int))
  108. {
  109. biom->bread_old = bread;
  110. biom->bread = bread_conv;
  111. return 1;
  112. }
  113. int BIO_meth_set_read_ex(BIO_METHOD *biom,
  114. int (*bread) (BIO *, char *, size_t, size_t *))
  115. {
  116. biom->bread_old = NULL;
  117. biom->bread = bread;
  118. return 1;
  119. }
  120. int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *)
  121. {
  122. return biom->bputs;
  123. }
  124. int BIO_meth_set_puts(BIO_METHOD *biom,
  125. int (*bputs) (BIO *, const char *))
  126. {
  127. biom->bputs = bputs;
  128. return 1;
  129. }
  130. int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int)
  131. {
  132. return biom->bgets;
  133. }
  134. int BIO_meth_set_gets(BIO_METHOD *biom,
  135. int (*bgets) (BIO *, char *, int))
  136. {
  137. biom->bgets = bgets;
  138. return 1;
  139. }
  140. long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *)
  141. {
  142. return biom->ctrl;
  143. }
  144. int BIO_meth_set_ctrl(BIO_METHOD *biom,
  145. long (*ctrl) (BIO *, int, long, void *))
  146. {
  147. biom->ctrl = ctrl;
  148. return 1;
  149. }
  150. int (*BIO_meth_get_create(const BIO_METHOD *biom)) (BIO *)
  151. {
  152. return biom->create;
  153. }
  154. int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *))
  155. {
  156. biom->create = create;
  157. return 1;
  158. }
  159. int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *)
  160. {
  161. return biom->destroy;
  162. }
  163. int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *))
  164. {
  165. biom->destroy = destroy;
  166. return 1;
  167. }
  168. long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) (BIO *, int, BIO_info_cb *)
  169. {
  170. return biom->callback_ctrl;
  171. }
  172. int BIO_meth_set_callback_ctrl(BIO_METHOD *biom,
  173. long (*callback_ctrl) (BIO *, int,
  174. BIO_info_cb *))
  175. {
  176. biom->callback_ctrl = callback_ctrl;
  177. return 1;
  178. }
  179. int BIO_meth_set_sendmmsg(BIO_METHOD *biom,
  180. int (*bsendmmsg) (BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *))
  181. {
  182. biom->bsendmmsg = bsendmmsg;
  183. return 1;
  184. }
  185. int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *) {
  186. return biom->bsendmmsg;
  187. }
  188. int BIO_meth_set_recvmmsg(BIO_METHOD *biom,
  189. int (*brecvmmsg) (BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *))
  190. {
  191. biom->brecvmmsg = brecvmmsg;
  192. return 1;
  193. }
  194. int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *) {
  195. return biom->brecvmmsg;
  196. }