Fix CRYPTO_dup_ex_data.
On malloc error, CRYPTO_set_ex_data may fail. (See upstream's
62f488d31733e5dc77b339f905b44f165550e47d.)
It also failed to copy the reserved slots when we revised the app-data
machinery, although this is unreachable as EC_KEY is the only thing
which uses this function and EC_KEY has no reserved slots. (We probably
can/should also take CRYPTO_dup_ex_data out of there, as it's a little
bit weird...)
Change-Id: I60bbc301f919d4c0ee7fff362f979f6ec18d73b7
Reviewed-on: https://boringssl-review.googlesource.com/14604
Reviewed-by: Steven Valdez <svaldez@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: Steven Valdez <svaldez@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/ex_data.c b/crypto/ex_data.c
index 5286513..20b762e 100644
--- a/crypto/ex_data.c
+++ b/crypto/ex_data.c
@@ -239,6 +239,13 @@
return 1;
}
+ for (size_t i = 0; i < ex_data_class->num_reserved; i++) {
+ void *ptr = CRYPTO_get_ex_data(from, i);
+ if (!CRYPTO_set_ex_data(to, i, ptr)) {
+ return 0;
+ }
+ }
+
STACK_OF(CRYPTO_EX_DATA_FUNCS) *func_pointers;
if (!get_func_pointers(&func_pointers, ex_data_class)) {
return 0;
@@ -252,7 +259,10 @@
func_pointer->dup_func(to, from, &ptr, i + ex_data_class->num_reserved,
func_pointer->argl, func_pointer->argp);
}
- CRYPTO_set_ex_data(to, i + ex_data_class->num_reserved, ptr);
+ if (!CRYPTO_set_ex_data(to, i + ex_data_class->num_reserved, ptr)) {
+ sk_CRYPTO_EX_DATA_FUNCS_free(func_pointers);
+ return 0;
+ }
}
sk_CRYPTO_EX_DATA_FUNCS_free(func_pointers);