diff options
Diffstat (limited to 'src/lib/libcrypto/bio/bss_mem.c')
-rw-r--r-- | src/lib/libcrypto/bio/bss_mem.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c index e7ab9cb3a3..37d4194e4b 100644 --- a/src/lib/libcrypto/bio/bss_mem.c +++ b/src/lib/libcrypto/bio/bss_mem.c | |||
@@ -94,16 +94,18 @@ BIO *BIO_new_mem_buf(void *buf, int len) | |||
94 | { | 94 | { |
95 | BIO *ret; | 95 | BIO *ret; |
96 | BUF_MEM *b; | 96 | BUF_MEM *b; |
97 | size_t sz; | ||
98 | |||
97 | if (!buf) { | 99 | if (!buf) { |
98 | BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); | 100 | BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); |
99 | return NULL; | 101 | return NULL; |
100 | } | 102 | } |
101 | if(len == -1) len = strlen(buf); | 103 | sz = (len<0) ? strlen(buf) : (size_t)len; |
102 | if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; | 104 | if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; |
103 | b = (BUF_MEM *)ret->ptr; | 105 | b = (BUF_MEM *)ret->ptr; |
104 | b->data = buf; | 106 | b->data = buf; |
105 | b->length = len; | 107 | b->length = sz; |
106 | b->max = len; | 108 | b->max = sz; |
107 | ret->flags |= BIO_FLAGS_MEM_RDONLY; | 109 | ret->flags |= BIO_FLAGS_MEM_RDONLY; |
108 | /* Since this is static data retrying wont help */ | 110 | /* Since this is static data retrying wont help */ |
109 | ret->num = 0; | 111 | ret->num = 0; |
@@ -144,22 +146,16 @@ static int mem_read(BIO *b, char *out, int outl) | |||
144 | { | 146 | { |
145 | int ret= -1; | 147 | int ret= -1; |
146 | BUF_MEM *bm; | 148 | BUF_MEM *bm; |
147 | int i; | ||
148 | char *from,*to; | ||
149 | 149 | ||
150 | bm=(BUF_MEM *)b->ptr; | 150 | bm=(BUF_MEM *)b->ptr; |
151 | BIO_clear_retry_flags(b); | 151 | BIO_clear_retry_flags(b); |
152 | ret=(outl > bm->length)?bm->length:outl; | 152 | ret=(outl >=0 && (size_t)outl > bm->length)?(int)bm->length:outl; |
153 | if ((out != NULL) && (ret > 0)) { | 153 | if ((out != NULL) && (ret > 0)) { |
154 | memcpy(out,bm->data,ret); | 154 | memcpy(out,bm->data,ret); |
155 | bm->length-=ret; | 155 | bm->length-=ret; |
156 | /* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */ | ||
157 | if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; | 156 | if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; |
158 | else { | 157 | else { |
159 | from=(char *)&(bm->data[ret]); | 158 | memmove(&(bm->data[0]),&(bm->data[ret]),bm->length); |
160 | to=(char *)&(bm->data[0]); | ||
161 | for (i=0; i<bm->length; i++) | ||
162 | to[i]=from[i]; | ||
163 | } | 159 | } |
164 | } else if (bm->length == 0) | 160 | } else if (bm->length == 0) |
165 | { | 161 | { |