aboutsummaryrefslogtreecommitdiff
path: root/crypto/bio/bss_mem.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>1999-08-19 13:07:43 +0000
committerDr. Stephen Henson <steve@openssl.org>1999-08-19 13:07:43 +0000
commit8484721adb154f47de28e64d581b40adca6c5e68 (patch)
tree08bb758009dfb981d11b1b46b37a8f976d1c22a4 /crypto/bio/bss_mem.c
parentde1915e48c0be56fadf7c7f1987536e1522df275 (diff)
downloadopenssl-8484721adb154f47de28e64d581b40adca6c5e68.zip
openssl-8484721adb154f47de28e64d581b40adca6c5e68.tar.gz
openssl-8484721adb154f47de28e64d581b40adca6c5e68.tar.bz2
Allow memory bios to be read only and change PKCS#7 routines to use them.
Diffstat (limited to 'crypto/bio/bss_mem.c')
-rw-r--r--crypto/bio/bss_mem.c57
1 files changed, 46 insertions, 11 deletions
diff --git a/crypto/bio/bss_mem.c b/crypto/bio/bss_mem.c
index 7e749a5..d9a2280 100644
--- a/crypto/bio/bss_mem.c
+++ b/crypto/bio/bss_mem.c
@@ -89,6 +89,26 @@ BIO_METHOD *BIO_s_mem(void)
return(&mem_method);
}
+BIO *BIO_new_mem_buf(void *buf, int len)
+{
+ BIO *ret;
+ BUF_MEM *b;
+ if (!buf) {
+ BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER);
+ return NULL;
+ }
+ if(len == -1) len = strlen(buf);
+ if(!(ret = BIO_new(BIO_s_mem())) ) return NULL;
+ b = (BUF_MEM *)ret->ptr;
+ b->data = buf;
+ b->length = len;
+ b->max = len;
+ ret->flags |= BIO_FLAGS_MEM_RDONLY;
+ /* Since this is static data retrying wont help */
+ ret->num = 0;
+ return ret;
+}
+
static int mem_new(BIO *bi)
{
BUF_MEM *b;
@@ -109,7 +129,10 @@ static int mem_free(BIO *a)
{
if ((a->init) && (a->ptr != NULL))
{
- BUF_MEM_free((BUF_MEM *)a->ptr);
+ BUF_MEM *b;
+ b = (BUF_MEM *)a->ptr;
+ if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL;
+ BUF_MEM_free(b);
a->ptr=NULL;
}
}
@@ -126,17 +149,18 @@ static int mem_read(BIO *b, char *out, int outl)
bm=(BUF_MEM *)b->ptr;
BIO_clear_retry_flags(b);
ret=(outl > bm->length)?bm->length:outl;
- if ((out != NULL) && (ret > 0))
- {
+ if ((out != NULL) && (ret > 0)) {
memcpy(out,bm->data,ret);
bm->length-=ret;
/* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */
- from=(char *)&(bm->data[ret]);
- to=(char *)&(bm->data[0]);
- for (i=0; i<bm->length; i++)
- to[i]=from[i];
+ if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret;
+ else {
+ from=(char *)&(bm->data[ret]);
+ to=(char *)&(bm->data[0]);
+ for (i=0; i<bm->length; i++)
+ to[i]=from[i];
}
- else if (bm->length == 0)
+ } else if (bm->length == 0)
{
if (b->num != 0)
BIO_set_retry_read(b);
@@ -158,6 +182,11 @@ static int mem_write(BIO *b, char *in, int inl)
goto end;
}
+ if(b->flags & BIO_FLAGS_MEM_RDONLY) {
+ BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO);
+ goto end;
+ }
+
BIO_clear_retry_flags(b);
blen=bm->length;
if (BUF_MEM_grow(bm,blen+inl) != (blen+inl))
@@ -178,9 +207,15 @@ static long mem_ctrl(BIO *b, int cmd, long num, char *ptr)
switch (cmd)
{
case BIO_CTRL_RESET:
- if (bm->data != NULL)
- memset(bm->data,0,bm->max);
- bm->length=0;
+ if (bm->data != NULL) {
+ /* For read only case reset to the start again */
+ if(b->flags & BIO_FLAGS_MEM_RDONLY)
+ bm->data -= bm->max - bm->length;
+ else {
+ memset(bm->data,0,bm->max);
+ bm->length=0;
+ }
+ }
break;
case BIO_CTRL_EOF:
ret=(long)(bm->length == 0);