X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fbio%2Fbss_mem.c;h=a4edb711aec1a37389e7db77726ae89f1f67dd50;hb=70f34a58411014e76dd03ed6ac0b1bdb95b53b16;hp=4fa2cf15a4845d785cc2e430feb84dc41da2b988;hpb=7df1c720f60ad3813cc88607c4520da031e41e88;p=openssl.git diff --git a/crypto/bio/bss_mem.c b/crypto/bio/bss_mem.c index 4fa2cf15a4..a4edb711ae 100644 --- a/crypto/bio/bss_mem.c +++ b/crypto/bio/bss_mem.c @@ -163,11 +163,9 @@ static int mem_read(BIO *b, char *out, int outl) } } else if (bm->length == 0) { - if (b->num != 0) + ret = b->num; + if (ret != 0) BIO_set_retry_read(b); - ret= b->num; - if(ret < 0) - BIOerr(BIO_F_MEM_READ,BIO_R_EOF_ON_MEMORY_BIO); } return(ret); } @@ -192,7 +190,7 @@ static int mem_write(BIO *b, const char *in, int inl) BIO_clear_retry_flags(b); blen=bm->length; - if (BUF_MEM_grow(bm,blen+inl) != (blen+inl)) + if (BUF_MEM_grow_clean(bm,blen+inl) != (blen+inl)) goto end; memcpy(&(bm->data[blen]),in,inl); ret=inl; @@ -210,16 +208,20 @@ static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) switch (cmd) { case BIO_CTRL_RESET: - if (bm->data != NULL) { + 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; - bm->length = bm->max; - else { + { + bm->data -= bm->max - bm->length; + bm->length = bm->max; + } + else + { memset(bm->data,0,bm->max); bm->length=0; + } } - } break; case BIO_CTRL_EOF: ret=(long)(bm->length == 0); @@ -282,7 +284,11 @@ static int mem_gets(BIO *bp, char *buf, int size) BIO_clear_retry_flags(bp); j=bm->length; - if (j <= 0) return(0); + if (j <= 0) + { + *buf='\0'; + return 0; + } p=bm->data; for (i=0; i