OLD | NEW |
1 /* crypto/engine/eng_dyn.c */ | 1 /* crypto/engine/eng_dyn.c */ |
2 /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 * project 2001. | 3 * project 2001. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 1999-2001 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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 * ENGINE list. If 2, the add must succeed or the entire load should fai
l. */ | 139 * ENGINE list. If 2, the add must succeed or the entire load should fai
l. */ |
140 int list_add_value; | 140 int list_add_value; |
141 /* The symbol name for the version checking function */ | 141 /* The symbol name for the version checking function */ |
142 const char *DYNAMIC_F1; | 142 const char *DYNAMIC_F1; |
143 /* The symbol name for the "initialise ENGINE structure" function */ | 143 /* The symbol name for the "initialise ENGINE structure" function */ |
144 const char *DYNAMIC_F2; | 144 const char *DYNAMIC_F2; |
145 /* Whether to never use 'dirs', use 'dirs' as a fallback, or only use | 145 /* Whether to never use 'dirs', use 'dirs' as a fallback, or only use |
146 * 'dirs' for loading. Default is to use 'dirs' as a fallback. */ | 146 * 'dirs' for loading. Default is to use 'dirs' as a fallback. */ |
147 int dir_load; | 147 int dir_load; |
148 /* A stack of directories from which ENGINEs could be loaded */ | 148 /* A stack of directories from which ENGINEs could be loaded */ |
149 » STACK *dirs; | 149 » STACK_OF(OPENSSL_STRING) *dirs; |
150 }; | 150 }; |
151 | 151 |
152 /* This is the "ex_data" index we obtain and reserve for use with our context | 152 /* This is the "ex_data" index we obtain and reserve for use with our context |
153 * structure. */ | 153 * structure. */ |
154 static int dynamic_ex_data_idx = -1; | 154 static int dynamic_ex_data_idx = -1; |
155 | 155 |
156 static void int_free_str(void *s) { OPENSSL_free(s); } | 156 static void int_free_str(char *s) { OPENSSL_free(s); } |
157 /* Because our ex_data element may or may not get allocated depending on whether | 157 /* Because our ex_data element may or may not get allocated depending on whether |
158 * a "first-use" occurs before the ENGINE is freed, we have a memory leak | 158 * a "first-use" occurs before the ENGINE is freed, we have a memory leak |
159 * problem to solve. We can't declare a "new" handler for the ex_data as we | 159 * problem to solve. We can't declare a "new" handler for the ex_data as we |
160 * don't want a dynamic_data_ctx in *all* ENGINE structures of all types (this | 160 * don't want a dynamic_data_ctx in *all* ENGINE structures of all types (this |
161 * is a bug in the design of CRYPTO_EX_DATA). As such, we just declare a "free" | 161 * is a bug in the design of CRYPTO_EX_DATA). As such, we just declare a "free" |
162 * handler and that will get called if an ENGINE is being destroyed and there | 162 * handler and that will get called if an ENGINE is being destroyed and there |
163 * was an ex_data element corresponding to our context type. */ | 163 * was an ex_data element corresponding to our context type. */ |
164 static void dynamic_data_ctx_free_func(void *parent, void *ptr, | 164 static void dynamic_data_ctx_free_func(void *parent, void *ptr, |
165 CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) | 165 CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) |
166 { | 166 { |
167 if(ptr) | 167 if(ptr) |
168 { | 168 { |
169 dynamic_data_ctx *ctx = (dynamic_data_ctx *)ptr; | 169 dynamic_data_ctx *ctx = (dynamic_data_ctx *)ptr; |
170 if(ctx->dynamic_dso) | 170 if(ctx->dynamic_dso) |
171 DSO_free(ctx->dynamic_dso); | 171 DSO_free(ctx->dynamic_dso); |
172 if(ctx->DYNAMIC_LIBNAME) | 172 if(ctx->DYNAMIC_LIBNAME) |
173 OPENSSL_free((void*)ctx->DYNAMIC_LIBNAME); | 173 OPENSSL_free((void*)ctx->DYNAMIC_LIBNAME); |
174 if(ctx->engine_id) | 174 if(ctx->engine_id) |
175 OPENSSL_free((void*)ctx->engine_id); | 175 OPENSSL_free((void*)ctx->engine_id); |
176 if(ctx->dirs) | 176 if(ctx->dirs) |
177 » » » sk_pop_free(ctx->dirs, int_free_str); | 177 » » » sk_OPENSSL_STRING_pop_free(ctx->dirs, int_free_str); |
178 OPENSSL_free(ctx); | 178 OPENSSL_free(ctx); |
179 } | 179 } |
180 } | 180 } |
181 | 181 |
182 /* Construct the per-ENGINE context. We create it blindly and then use a lock to | 182 /* Construct the per-ENGINE context. We create it blindly and then use a lock to |
183 * check for a race - if so, all but one of the threads "racing" will have | 183 * check for a race - if so, all but one of the threads "racing" will have |
184 * wasted their time. The alternative involves creating everything inside the | 184 * wasted their time. The alternative involves creating everything inside the |
185 * lock which is far worse. */ | 185 * lock which is far worse. */ |
186 static int dynamic_set_data_ctx(ENGINE *e, dynamic_data_ctx **ctx) | 186 static int dynamic_set_data_ctx(ENGINE *e, dynamic_data_ctx **ctx) |
187 { | 187 { |
188 dynamic_data_ctx *c; | 188 dynamic_data_ctx *c; |
189 c = OPENSSL_malloc(sizeof(dynamic_data_ctx)); | 189 c = OPENSSL_malloc(sizeof(dynamic_data_ctx)); |
190 if(!c) | 190 if(!c) |
191 { | 191 { |
192 ENGINEerr(ENGINE_F_DYNAMIC_SET_DATA_CTX,ERR_R_MALLOC_FAILURE); | 192 ENGINEerr(ENGINE_F_DYNAMIC_SET_DATA_CTX,ERR_R_MALLOC_FAILURE); |
193 return 0; | 193 return 0; |
194 } | 194 } |
195 memset(c, 0, sizeof(dynamic_data_ctx)); | 195 memset(c, 0, sizeof(dynamic_data_ctx)); |
196 c->dynamic_dso = NULL; | 196 c->dynamic_dso = NULL; |
197 c->v_check = NULL; | 197 c->v_check = NULL; |
198 c->bind_engine = NULL; | 198 c->bind_engine = NULL; |
199 c->DYNAMIC_LIBNAME = NULL; | 199 c->DYNAMIC_LIBNAME = NULL; |
200 c->no_vcheck = 0; | 200 c->no_vcheck = 0; |
201 c->engine_id = NULL; | 201 c->engine_id = NULL; |
202 c->list_add_value = 0; | 202 c->list_add_value = 0; |
203 c->DYNAMIC_F1 = "v_check"; | 203 c->DYNAMIC_F1 = "v_check"; |
204 c->DYNAMIC_F2 = "bind_engine"; | 204 c->DYNAMIC_F2 = "bind_engine"; |
205 c->dir_load = 1; | 205 c->dir_load = 1; |
206 » c->dirs = sk_new_null(); | 206 » c->dirs = sk_OPENSSL_STRING_new_null(); |
207 if(!c->dirs) | 207 if(!c->dirs) |
208 { | 208 { |
209 ENGINEerr(ENGINE_F_DYNAMIC_SET_DATA_CTX,ERR_R_MALLOC_FAILURE); | 209 ENGINEerr(ENGINE_F_DYNAMIC_SET_DATA_CTX,ERR_R_MALLOC_FAILURE); |
210 OPENSSL_free(c); | 210 OPENSSL_free(c); |
211 return 0; | 211 return 0; |
212 } | 212 } |
213 CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); | 213 CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); |
214 if((*ctx = (dynamic_data_ctx *)ENGINE_get_ex_data(e, | 214 if((*ctx = (dynamic_data_ctx *)ENGINE_get_ex_data(e, |
215 dynamic_ex_data_idx)) == NULL) | 215 dynamic_ex_data_idx)) == NULL) |
216 { | 216 { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 return 0; | 386 return 0; |
387 } | 387 } |
388 { | 388 { |
389 char *tmp_str = BUF_strdup(p); | 389 char *tmp_str = BUF_strdup(p); |
390 if(!tmp_str) | 390 if(!tmp_str) |
391 { | 391 { |
392 ENGINEerr(ENGINE_F_DYNAMIC_CTRL, | 392 ENGINEerr(ENGINE_F_DYNAMIC_CTRL, |
393 ERR_R_MALLOC_FAILURE); | 393 ERR_R_MALLOC_FAILURE); |
394 return 0; | 394 return 0; |
395 } | 395 } |
396 » » sk_insert(ctx->dirs, tmp_str, -1); | 396 » » sk_OPENSSL_STRING_insert(ctx->dirs, tmp_str, -1); |
397 } | 397 } |
398 return 1; | 398 return 1; |
399 default: | 399 default: |
400 break; | 400 break; |
401 } | 401 } |
402 ENGINEerr(ENGINE_F_DYNAMIC_CTRL,ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED); | 402 ENGINEerr(ENGINE_F_DYNAMIC_CTRL,ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED); |
403 return 0; | 403 return 0; |
404 } | 404 } |
405 | 405 |
406 static int int_load(dynamic_data_ctx *ctx) | 406 static int int_load(dynamic_data_ctx *ctx) |
407 { | 407 { |
408 int num, loop; | 408 int num, loop; |
409 /* Unless told not to, try a direct load */ | 409 /* Unless told not to, try a direct load */ |
410 if((ctx->dir_load != 2) && (DSO_load(ctx->dynamic_dso, | 410 if((ctx->dir_load != 2) && (DSO_load(ctx->dynamic_dso, |
411 ctx->DYNAMIC_LIBNAME, NULL, 0)) != NULL) | 411 ctx->DYNAMIC_LIBNAME, NULL, 0)) != NULL) |
412 return 1; | 412 return 1; |
413 /* If we're not allowed to use 'dirs' or we have none, fail */ | 413 /* If we're not allowed to use 'dirs' or we have none, fail */ |
414 » if(!ctx->dir_load || ((num = sk_num(ctx->dirs)) < 1)) | 414 » if(!ctx->dir_load || (num = sk_OPENSSL_STRING_num(ctx->dirs)) < 1) |
415 return 0; | 415 return 0; |
416 for(loop = 0; loop < num; loop++) | 416 for(loop = 0; loop < num; loop++) |
417 { | 417 { |
418 » » const char *s = sk_value(ctx->dirs, loop); | 418 » » const char *s = sk_OPENSSL_STRING_value(ctx->dirs, loop); |
419 char *merge = DSO_merge(ctx->dynamic_dso, ctx->DYNAMIC_LIBNAME,
s); | 419 char *merge = DSO_merge(ctx->dynamic_dso, ctx->DYNAMIC_LIBNAME,
s); |
420 if(!merge) | 420 if(!merge) |
421 return 0; | 421 return 0; |
422 if(DSO_load(ctx->dynamic_dso, merge, NULL, 0)) | 422 if(DSO_load(ctx->dynamic_dso, merge, NULL, 0)) |
423 { | 423 { |
424 /* Found what we're looking for */ | 424 /* Found what we're looking for */ |
425 OPENSSL_free(merge); | 425 OPENSSL_free(merge); |
426 return 1; | 426 return 1; |
427 } | 427 } |
428 OPENSSL_free(merge); | 428 OPENSSL_free(merge); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 ENGINEerr(ENGINE_F_DYNAMIC_LOAD, | 539 ENGINEerr(ENGINE_F_DYNAMIC_LOAD, |
540 ENGINE_R_CONFLICTING_ENGINE_ID); | 540 ENGINE_R_CONFLICTING_ENGINE_ID); |
541 return 0; | 541 return 0; |
542 } | 542 } |
543 /* Tolerate */ | 543 /* Tolerate */ |
544 ERR_clear_error(); | 544 ERR_clear_error(); |
545 } | 545 } |
546 } | 546 } |
547 return 1; | 547 return 1; |
548 } | 548 } |
OLD | NEW |