OLD | NEW |
1 /* crypto/store/str_mem.c -*- mode:C; c-file-style: "eay" -*- */ | 1 /* crypto/store/str_mem.c -*- mode:C; c-file-style: "eay" -*- */ |
2 /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL | 2 /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL |
3 * project 2003. | 3 * project 2003. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 2003 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2003 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 This is currently provided for by sorting the entries by numbers that | 69 This is currently provided for by sorting the entries by numbers that |
70 are composed of bits set at the positions indicated by attribute type | 70 are composed of bits set at the positions indicated by attribute type |
71 codes. This provides for ranges determined by the highest attribute | 71 codes. This provides for ranges determined by the highest attribute |
72 type code value. A better idea might be to sort by values computed | 72 type code value. A better idea might be to sort by values computed |
73 from the range of attributes associated with the object (basically, | 73 from the range of attributes associated with the object (basically, |
74 the difference between the highest and lowest attribute type code) | 74 the difference between the highest and lowest attribute type code) |
75 and it's distance from a base (basically, the lowest associated | 75 and it's distance from a base (basically, the lowest associated |
76 attribute type code). | 76 attribute type code). |
77 */ | 77 */ |
78 | 78 |
79 struct mem_object_data_st | 79 typedef struct mem_object_data_st |
80 { | 80 { |
81 STORE_OBJECT *object; | 81 STORE_OBJECT *object; |
82 STORE_ATTR_INFO *attr_info; | 82 STORE_ATTR_INFO *attr_info; |
83 int references; | 83 int references; |
84 » }; | 84 » } MEM_OBJECT_DATA; |
85 | 85 |
| 86 DECLARE_STACK_OF(MEM_OBJECT_DATA) |
86 struct mem_data_st | 87 struct mem_data_st |
87 { | 88 { |
88 » STACK *data;» » /* A stack of mem_object_data_st, | 89 » STACK_OF(MEM_OBJECT_DATA) *data; /* sorted with |
89 » » » » sorted with STORE_ATTR_INFO_compare(). */ | 90 » » » » » * STORE_ATTR_INFO_compare(). */ |
90 unsigned int compute_components : 1; /* Currently unused, but can | 91 unsigned int compute_components : 1; /* Currently unused, but can |
91 be used to add attributes | 92 be used to add attributes |
92 from parts of the data. */ | 93 from parts of the data. */ |
93 }; | 94 }; |
94 | 95 |
| 96 DECLARE_STACK_OF(STORE_ATTR_INFO) |
95 struct mem_ctx_st | 97 struct mem_ctx_st |
96 { | 98 { |
97 int type; /* The type we're searching for */ | 99 int type; /* The type we're searching for */ |
98 » STACK *search_attributes; /* Sets of attributes to search for. | 100 » STACK_OF(STORE_ATTR_INFO) *search_attributes; /* Sets of |
99 » » » » Each element is a STORE_ATTR_INFO. */ | 101 » » » » attributes to search for. Each |
100 » int search_index;» /* which of the search attributes we found a mat
ch | 102 » » » » element is a STORE_ATTR_INFO. */ |
101 » » » » for, -1 when we still haven't found any */ | 103 » int search_index;» /* which of the search attributes we |
102 » int index;» » /* -1 as long as we're searching for the first *
/ | 104 » » » » found a match for, -1 when we still |
| 105 » » » » haven't found any */ |
| 106 » int index;» » /* -1 as long as we're searching for |
| 107 the first */ |
103 }; | 108 }; |
104 | 109 |
105 static int mem_init(STORE *s); | 110 static int mem_init(STORE *s); |
106 static void mem_clean(STORE *s); | 111 static void mem_clean(STORE *s); |
107 static STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type, | 112 static STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type, |
108 OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); | 113 OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); |
109 static STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type, | 114 static STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type, |
110 OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); | 115 OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); |
111 static int mem_store(STORE *s, STORE_OBJECT_TYPES type, | 116 static int mem_store(STORE *s, STORE_OBJECT_TYPES type, |
112 STORE_OBJECT *data, OPENSSL_ITEM attributes[], | 117 STORE_OBJECT *data, OPENSSL_ITEM attributes[], |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 { | 238 { |
234 STOREerr(STORE_F_MEM_LIST_START, ERR_R_STORE_LIB); | 239 STOREerr(STORE_F_MEM_LIST_START, ERR_R_STORE_LIB); |
235 goto err; | 240 goto err; |
236 } | 241 } |
237 | 242 |
238 while((attrs = STORE_parse_attrs_next(attribute_context))) | 243 while((attrs = STORE_parse_attrs_next(attribute_context))) |
239 { | 244 { |
240 if (context->search_attributes == NULL) | 245 if (context->search_attributes == NULL) |
241 { | 246 { |
242 context->search_attributes = | 247 context->search_attributes = |
243 » » » » sk_new((int (*)(const char * const *, const char
* const *))STORE_ATTR_INFO_compare); | 248 » » » » sk_STORE_ATTR_INFO_new(STORE_ATTR_INFO_compare); |
244 if (!context->search_attributes) | 249 if (!context->search_attributes) |
245 { | 250 { |
246 STOREerr(STORE_F_MEM_LIST_START, | 251 STOREerr(STORE_F_MEM_LIST_START, |
247 ERR_R_MALLOC_FAILURE); | 252 ERR_R_MALLOC_FAILURE); |
248 goto err; | 253 goto err; |
249 } | 254 } |
250 } | 255 } |
251 » » sk_push(context->search_attributes,(char *)attrs); | 256 » » sk_STORE_ATTR_INFO_push(context->search_attributes,attrs); |
252 } | 257 } |
253 if (!STORE_parse_attrs_endp(attribute_context)) | 258 if (!STORE_parse_attrs_endp(attribute_context)) |
254 goto err; | 259 goto err; |
255 STORE_parse_attrs_end(attribute_context); | 260 STORE_parse_attrs_end(attribute_context); |
256 context->search_index = -1; | 261 context->search_index = -1; |
257 context->index = -1; | 262 context->index = -1; |
258 return context; | 263 return context; |
259 err: | 264 err: |
260 if (attribute_context) STORE_parse_attrs_end(attribute_context); | 265 if (attribute_context) STORE_parse_attrs_end(attribute_context); |
261 mem_list_end(s, context); | 266 mem_list_end(s, context); |
(...skipping 15 matching lines...) Expand all Loading... |
277 return NULL; | 282 return NULL; |
278 } | 283 } |
279 if (!store) | 284 if (!store) |
280 { | 285 { |
281 STOREerr(STORE_F_MEM_LIST_NEXT, STORE_R_NO_STORE); | 286 STOREerr(STORE_F_MEM_LIST_NEXT, STORE_R_NO_STORE); |
282 return NULL; | 287 return NULL; |
283 } | 288 } |
284 | 289 |
285 if (context->search_index == -1) | 290 if (context->search_index == -1) |
286 { | 291 { |
287 » » for (i = 0; i < sk_num(context->search_attributes); i++) | 292 » » for (i = 0; |
| 293 » » i < sk_STORE_ATTR_INFO_num(context->search_attributes); |
| 294 » » i++) |
288 { | 295 { |
289 » » » key.attr_info = | 296 » » » key.attr_info |
290 » » » » (STORE_ATTR_INFO *)sk_value(context->search_attr
ibutes, i); | 297 » » » = sk_STORE_ATTR_INFO_value(context->search_attributes, |
291 » » » srch = sk_find_ex(store->data, (char *)&key); | 298 » » » » » » i); |
| 299 » » » srch = sk_MEM_OBJECT_DATA_find_ex(store->data, &key); |
292 | 300 |
293 if (srch >= 0) | 301 if (srch >= 0) |
294 { | 302 { |
295 context->search_index = srch; | 303 context->search_index = srch; |
296 break; | 304 break; |
297 } | 305 } |
298 } | 306 } |
299 } | 307 } |
300 if (context->search_index < 0) | 308 if (context->search_index < 0) |
301 return NULL; | 309 return NULL; |
302 | 310 |
303 key.attr_info = | 311 key.attr_info = |
304 » » (STORE_ATTR_INFO *)sk_value(context->search_attributes, | 312 » » sk_STORE_ATTR_INFO_value(context->search_attributes, |
305 » » » context->search_index); | 313 » » » » » context->search_index); |
306 for(srch = context->search_index; | 314 for(srch = context->search_index; |
307 » srch < sk_num(store->data) | 315 » srch < sk_MEM_OBJECT_DATA_num(store->data) |
308 && STORE_ATTR_INFO_in_range(key.attr_info, | 316 && STORE_ATTR_INFO_in_range(key.attr_info, |
309 » » » (STORE_ATTR_INFO *)sk_value(store->data, srch)) | 317 » » » sk_MEM_OBJECT_DATA_value(store->data, srch)->attr_in
fo) |
310 && !(cres = STORE_ATTR_INFO_in_ex(key.attr_info, | 318 && !(cres = STORE_ATTR_INFO_in_ex(key.attr_info, |
311 » » » » (STORE_ATTR_INFO *)sk_value(store->data, srch))
); | 319 » » » » sk_MEM_OBJECT_DATA_value(store->data, srch)->at
tr_info)); |
312 srch++) | 320 srch++) |
313 ; | 321 ; |
314 | 322 |
315 context->search_index = srch; | 323 context->search_index = srch; |
316 if (cres) | 324 if (cres) |
317 » » return ((struct mem_object_data_st *)sk_value(store->data, | 325 » » return (sk_MEM_OBJECT_DATA_value(store->data, srch))->object; |
318 » » » » srch))->object; | |
319 return NULL; | 326 return NULL; |
320 } | 327 } |
321 static int mem_list_end(STORE *s, void *handle) | 328 static int mem_list_end(STORE *s, void *handle) |
322 { | 329 { |
323 struct mem_ctx_st *context = (struct mem_ctx_st *)handle; | 330 struct mem_ctx_st *context = (struct mem_ctx_st *)handle; |
324 | 331 |
325 if (!context) | 332 if (!context) |
326 { | 333 { |
327 STOREerr(STORE_F_MEM_LIST_END, ERR_R_PASSED_NULL_PARAMETER); | 334 STOREerr(STORE_F_MEM_LIST_END, ERR_R_PASSED_NULL_PARAMETER); |
328 return 0; | 335 return 0; |
329 } | 336 } |
330 if (context && context->search_attributes) | 337 if (context && context->search_attributes) |
331 » » sk_free(context->search_attributes); | 338 » » sk_STORE_ATTR_INFO_free(context->search_attributes); |
332 if (context) OPENSSL_free(context); | 339 if (context) OPENSSL_free(context); |
333 return 1; | 340 return 1; |
334 } | 341 } |
335 static int mem_list_endp(STORE *s, void *handle) | 342 static int mem_list_endp(STORE *s, void *handle) |
336 { | 343 { |
337 struct mem_ctx_st *context = (struct mem_ctx_st *)handle; | 344 struct mem_ctx_st *context = (struct mem_ctx_st *)handle; |
338 | 345 |
339 if (!context | 346 if (!context |
340 » » || context->search_index == sk_num(context->search_attributes)) | 347 » || context->search_index |
| 348 » == sk_STORE_ATTR_INFO_num(context->search_attributes)) |
341 return 1; | 349 return 1; |
342 return 0; | 350 return 0; |
343 } | 351 } |
344 static int mem_lock(STORE *s, OPENSSL_ITEM attributes[], | 352 static int mem_lock(STORE *s, OPENSSL_ITEM attributes[], |
345 OPENSSL_ITEM parameters[]) | 353 OPENSSL_ITEM parameters[]) |
346 { | 354 { |
347 return 1; | 355 return 1; |
348 } | 356 } |
349 static int mem_unlock(STORE *s, OPENSSL_ITEM attributes[], | 357 static int mem_unlock(STORE *s, OPENSSL_ITEM attributes[], |
350 OPENSSL_ITEM parameters[]) | 358 OPENSSL_ITEM parameters[]) |
351 { | 359 { |
352 return 1; | 360 return 1; |
353 } | 361 } |
354 static int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f)(void)) | 362 static int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f)(void)) |
355 { | 363 { |
356 return 1; | 364 return 1; |
357 } | 365 } |
OLD | NEW |