summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/bss_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio/bss_mem.c')
-rw-r--r--src/lib/libcrypto/bio/bss_mem.c130
1 files changed, 75 insertions, 55 deletions
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c
index 40c4e39f02..28ff7582bf 100644
--- a/src/lib/libcrypto/bio/bss_mem.c
+++ b/src/lib/libcrypto/bio/bss_mem.c
@@ -59,26 +59,15 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "bio.h" 62#include <openssl/bio.h>
63 63
64#ifndef NOPROTO 64static int mem_write(BIO *h, const char *buf, int num);
65static int mem_write(BIO *h,char *buf,int num); 65static int mem_read(BIO *h, char *buf, int size);
66static int mem_read(BIO *h,char *buf,int size); 66static int mem_puts(BIO *h, const char *str);
67static int mem_puts(BIO *h,char *str); 67static int mem_gets(BIO *h, char *str, int size);
68static int mem_gets(BIO *h,char *str,int size); 68static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2);
69static long mem_ctrl(BIO *h,int cmd,long arg1,char *arg2);
70static int mem_new(BIO *h); 69static int mem_new(BIO *h);
71static int mem_free(BIO *data); 70static int mem_free(BIO *data);
72#else
73static int mem_write();
74static int mem_read();
75static int mem_puts();
76static int mem_gets();
77static long mem_ctrl();
78static int mem_new();
79static int mem_free();
80#endif
81
82static BIO_METHOD mem_method= 71static BIO_METHOD mem_method=
83 { 72 {
84 BIO_TYPE_MEM, 73 BIO_TYPE_MEM,
@@ -90,15 +79,38 @@ static BIO_METHOD mem_method=
90 mem_ctrl, 79 mem_ctrl,
91 mem_new, 80 mem_new,
92 mem_free, 81 mem_free,
82 NULL,
93 }; 83 };
94 84
95BIO_METHOD *BIO_s_mem() 85/* bio->num is used to hold the value to return on 'empty', if it is
86 * 0, should_retry is not set */
87
88BIO_METHOD *BIO_s_mem(void)
96 { 89 {
97 return(&mem_method); 90 return(&mem_method);
98 } 91 }
99 92
100static int mem_new(bi) 93BIO *BIO_new_mem_buf(void *buf, int len)
101BIO *bi; 94{
95 BIO *ret;
96 BUF_MEM *b;
97 if (!buf) {
98 BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER);
99 return NULL;
100 }
101 if(len == -1) len = strlen(buf);
102 if(!(ret = BIO_new(BIO_s_mem())) ) return NULL;
103 b = (BUF_MEM *)ret->ptr;
104 b->data = buf;
105 b->length = len;
106 b->max = len;
107 ret->flags |= BIO_FLAGS_MEM_RDONLY;
108 /* Since this is static data retrying wont help */
109 ret->num = 0;
110 return ret;
111}
112
113static int mem_new(BIO *bi)
102 { 114 {
103 BUF_MEM *b; 115 BUF_MEM *b;
104 116
@@ -106,30 +118,29 @@ BIO *bi;
106 return(0); 118 return(0);
107 bi->shutdown=1; 119 bi->shutdown=1;
108 bi->init=1; 120 bi->init=1;
109 bi->num=0; 121 bi->num= -1;
110 bi->ptr=(char *)b; 122 bi->ptr=(char *)b;
111 return(1); 123 return(1);
112 } 124 }
113 125
114static int mem_free(a) 126static int mem_free(BIO *a)
115BIO *a;
116 { 127 {
117 if (a == NULL) return(0); 128 if (a == NULL) return(0);
118 if (a->shutdown) 129 if (a->shutdown)
119 { 130 {
120 if ((a->init) && (a->ptr != NULL)) 131 if ((a->init) && (a->ptr != NULL))
121 { 132 {
122 BUF_MEM_free((BUF_MEM *)a->ptr); 133 BUF_MEM *b;
134 b = (BUF_MEM *)a->ptr;
135 if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL;
136 BUF_MEM_free(b);
123 a->ptr=NULL; 137 a->ptr=NULL;
124 } 138 }
125 } 139 }
126 return(1); 140 return(1);
127 } 141 }
128 142
129static int mem_read(b,out,outl) 143static int mem_read(BIO *b, char *out, int outl)
130BIO *b;
131char *out;
132int outl;
133 { 144 {
134 int ret= -1; 145 int ret= -1;
135 BUF_MEM *bm; 146 BUF_MEM *bm;
@@ -139,28 +150,27 @@ int outl;
139 bm=(BUF_MEM *)b->ptr; 150 bm=(BUF_MEM *)b->ptr;
140 BIO_clear_retry_flags(b); 151 BIO_clear_retry_flags(b);
141 ret=(outl > bm->length)?bm->length:outl; 152 ret=(outl > bm->length)?bm->length:outl;
142 if ((out != NULL) && (ret > 0)) 153 if ((out != NULL) && (ret > 0)) {
143 {
144 memcpy(out,bm->data,ret); 154 memcpy(out,bm->data,ret);
145 bm->length-=ret; 155 bm->length-=ret;
146 /* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */ 156 /* memmove(&(bm->data[0]),&(bm->data[ret]), bm->length); */
147 from=(char *)&(bm->data[ret]); 157 if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret;
148 to=(char *)&(bm->data[0]); 158 else {
149 for (i=0; i<bm->length; i++) 159 from=(char *)&(bm->data[ret]);
150 to[i]=from[i]; 160 to=(char *)&(bm->data[0]);
161 for (i=0; i<bm->length; i++)
162 to[i]=from[i];
151 } 163 }
152 else if (bm->length == 0) 164 } else if (bm->length == 0)
153 { 165 {
154 BIO_set_retry_read(b); 166 ret = b->num;
155 ret= -1; 167 if (ret != 0)
168 BIO_set_retry_read(b);
156 } 169 }
157 return(ret); 170 return(ret);
158 } 171 }
159 172
160static int mem_write(b,in,inl) 173static int mem_write(BIO *b, const char *in, int inl)
161BIO *b;
162char *in;
163int inl;
164 { 174 {
165 int ret= -1; 175 int ret= -1;
166 int blen; 176 int blen;
@@ -173,6 +183,11 @@ int inl;
173 goto end; 183 goto end;
174 } 184 }
175 185
186 if(b->flags & BIO_FLAGS_MEM_RDONLY) {
187 BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO);
188 goto end;
189 }
190
176 BIO_clear_retry_flags(b); 191 BIO_clear_retry_flags(b);
177 blen=bm->length; 192 blen=bm->length;
178 if (BUF_MEM_grow(bm,blen+inl) != (blen+inl)) 193 if (BUF_MEM_grow(bm,blen+inl) != (blen+inl))
@@ -183,11 +198,7 @@ end:
183 return(ret); 198 return(ret);
184 } 199 }
185 200
186static long mem_ctrl(b,cmd,num,ptr) 201static long mem_ctrl(BIO *b, int cmd, long num, void *ptr)
187BIO *b;
188int cmd;
189long num;
190char *ptr;
191 { 202 {
192 long ret=1; 203 long ret=1;
193 char **pptr; 204 char **pptr;
@@ -198,12 +209,26 @@ char *ptr;
198 { 209 {
199 case BIO_CTRL_RESET: 210 case BIO_CTRL_RESET:
200 if (bm->data != NULL) 211 if (bm->data != NULL)
201 memset(bm->data,0,bm->max); 212 {
202 bm->length=0; 213 /* For read only case reset to the start again */
214 if(b->flags & BIO_FLAGS_MEM_RDONLY)
215 {
216 bm->data -= bm->max - bm->length;
217 bm->length = bm->max;
218 }
219 else
220 {
221 memset(bm->data,0,bm->max);
222 bm->length=0;
223 }
224 }
203 break; 225 break;
204 case BIO_CTRL_EOF: 226 case BIO_CTRL_EOF:
205 ret=(long)(bm->length == 0); 227 ret=(long)(bm->length == 0);
206 break; 228 break;
229 case BIO_C_SET_BUF_MEM_EOF_RETURN:
230 b->num=(int)num;
231 break;
207 case BIO_CTRL_INFO: 232 case BIO_CTRL_INFO:
208 ret=(long)bm->length; 233 ret=(long)bm->length;
209 if (ptr != NULL) 234 if (ptr != NULL)
@@ -250,10 +275,7 @@ char *ptr;
250 return(ret); 275 return(ret);
251 } 276 }
252 277
253static int mem_gets(bp,buf,size) 278static int mem_gets(BIO *bp, char *buf, int size)
254BIO *bp;
255char *buf;
256int size;
257 { 279 {
258 int i,j; 280 int i,j;
259 int ret= -1; 281 int ret= -1;
@@ -283,9 +305,7 @@ int size;
283 return(ret); 305 return(ret);
284 } 306 }
285 307
286static int mem_puts(bp,str) 308static int mem_puts(BIO *bp, const char *str)
287BIO *bp;
288char *str;
289 { 309 {
290 int n,ret; 310 int n,ret;
291 311