OpenSSL 1.1.1-pre2
This commit is contained in:
+73
-3
@@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
#include "bio_lcl.h"
|
||||
#include <internal/thread_once.h>
|
||||
#include "internal/thread_once.h"
|
||||
|
||||
CRYPTO_RWLOCK *bio_type_lock = NULL;
|
||||
static CRYPTO_ONCE bio_type_init = CRYPTO_ONCE_STATIC_INIT;
|
||||
@@ -21,14 +21,14 @@ DEFINE_RUN_ONCE_STATIC(do_bio_type_init)
|
||||
|
||||
int BIO_get_new_index()
|
||||
{
|
||||
static int bio_count = BIO_TYPE_START;
|
||||
static CRYPTO_REF_COUNT bio_count = BIO_TYPE_START;
|
||||
int newval;
|
||||
|
||||
if (!RUN_ONCE(&bio_type_init, do_bio_type_init)) {
|
||||
BIOerr(BIO_F_BIO_GET_NEW_INDEX, ERR_R_MALLOC_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
if (!CRYPTO_atomic_add(&bio_count, 1, &newval, bio_type_lock))
|
||||
if (!CRYPTO_UP_REF(&bio_count, &newval, bio_type_lock))
|
||||
return -1;
|
||||
return newval;
|
||||
}
|
||||
@@ -43,6 +43,7 @@ BIO_METHOD *BIO_meth_new(int type, const char *name)
|
||||
BIOerr(BIO_F_BIO_METH_NEW, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
biom->type = type;
|
||||
return biom;
|
||||
}
|
||||
|
||||
@@ -55,25 +56,94 @@ void BIO_meth_free(BIO_METHOD *biom)
|
||||
}
|
||||
|
||||
int (*BIO_meth_get_write(BIO_METHOD *biom)) (BIO *, const char *, int)
|
||||
{
|
||||
return biom->bwrite_old;
|
||||
}
|
||||
|
||||
int (*BIO_meth_get_write_ex(BIO_METHOD *biom)) (BIO *, const char *, size_t,
|
||||
size_t *)
|
||||
{
|
||||
return biom->bwrite;
|
||||
}
|
||||
|
||||
/* Conversion for old style bwrite to new style */
|
||||
int bwrite_conv(BIO *bio, const char *data, size_t datal, size_t *written)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (datal > INT_MAX)
|
||||
datal = INT_MAX;
|
||||
|
||||
ret = bio->method->bwrite_old(bio, data, (int)datal);
|
||||
|
||||
if (ret <= 0) {
|
||||
*written = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
*written = (size_t)ret;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int BIO_meth_set_write(BIO_METHOD *biom,
|
||||
int (*bwrite) (BIO *, const char *, int))
|
||||
{
|
||||
biom->bwrite_old = bwrite;
|
||||
biom->bwrite = bwrite_conv;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int BIO_meth_set_write_ex(BIO_METHOD *biom,
|
||||
int (*bwrite) (BIO *, const char *, size_t, size_t *))
|
||||
{
|
||||
biom->bwrite_old = NULL;
|
||||
biom->bwrite = bwrite;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*BIO_meth_get_read(BIO_METHOD *biom)) (BIO *, char *, int)
|
||||
{
|
||||
return biom->bread_old;
|
||||
}
|
||||
|
||||
int (*BIO_meth_get_read_ex(BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *)
|
||||
{
|
||||
return biom->bread;
|
||||
}
|
||||
|
||||
/* Conversion for old style bread to new style */
|
||||
int bread_conv(BIO *bio, char *data, size_t datal, size_t *readbytes)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (datal > INT_MAX)
|
||||
datal = INT_MAX;
|
||||
|
||||
ret = bio->method->bread_old(bio, data, (int)datal);
|
||||
|
||||
if (ret <= 0) {
|
||||
*readbytes = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
*readbytes = (size_t)ret;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int BIO_meth_set_read(BIO_METHOD *biom,
|
||||
int (*bread) (BIO *, char *, int))
|
||||
{
|
||||
biom->bread_old = bread;
|
||||
biom->bread = bread_conv;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int BIO_meth_set_read_ex(BIO_METHOD *biom,
|
||||
int (*bread) (BIO *, char *, size_t, size_t *))
|
||||
{
|
||||
biom->bread_old = NULL;
|
||||
biom->bread = bread;
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user