X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=test%2Fexdatatest.c;h=e0eadd32dd79a91cd3b9cfe3d5d6bccc8361abdf;hp=8e3506840613aac5b841b254862f9093a659f642;hb=b3c31a65;hpb=440e5d805f449d662520313b33fd90aeee86980b diff --git a/test/exdatatest.c b/test/exdatatest.c index 8e35068406..e0eadd32dd 100644 --- a/test/exdatatest.c +++ b/test/exdatatest.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -8,68 +8,67 @@ */ #include -#include #include #include #include -static long sargl; -static void *sargp; -static int sidx; +static long saved_argl; +static void *saved_argp; +static int saved_idx; static void exnew(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) { - assert(idx == sidx); - assert(argl == sargl); - assert(argp == sargp); + OPENSSL_assert(idx == saved_idx); + OPENSSL_assert(argl == saved_argl); + OPENSSL_assert(argp == saved_argp); + OPENSSL_assert(ptr == NULL); } -static int exdup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, +static int exdup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, void *from_d, int idx, long argl, void *argp) { - assert(idx == sidx); - assert(argl == sargl); - assert(argp == sargp); - return 0; + OPENSSL_assert(idx == saved_idx); + OPENSSL_assert(argl == saved_argl); + OPENSSL_assert(argp == saved_argp); + OPENSSL_assert(from_d != NULL); + return 1; } static void exfree(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) { - assert(idx == sidx); - assert(argl == sargl); - assert(argp == sargp); + OPENSSL_assert(idx == saved_idx); + OPENSSL_assert(argl == saved_argl); + OPENSSL_assert(argp == saved_argp); } typedef struct myobj_st { CRYPTO_EX_DATA ex_data; int id; + int st; } MYOBJ; static MYOBJ *MYOBJ_new() { static int count = 0; MYOBJ *obj = OPENSSL_malloc(sizeof(*obj)); - int st; obj->id = ++count; - st = CRYPTO_new_ex_data(CRYPTO_EX_INDEX_APP, obj, &obj->ex_data); - assert(st != 0); + obj->st = CRYPTO_new_ex_data(CRYPTO_EX_INDEX_APP, obj, &obj->ex_data); + OPENSSL_assert(obj->st != 0); return obj; } static void MYOBJ_sethello(MYOBJ *obj, char *cp) { - int st; - - st = CRYPTO_set_ex_data(&obj->ex_data, sidx, cp); - assert(st != 0); + obj->st = CRYPTO_set_ex_data(&obj->ex_data, saved_idx, cp); + OPENSSL_assert(obj->st != 0); } static char *MYOBJ_gethello(MYOBJ *obj) { - return CRYPTO_get_ex_data(&obj->ex_data, sidx); + return CRYPTO_get_ex_data(&obj->ex_data, saved_idx); } static void MYOBJ_free(MYOBJ *obj) @@ -78,27 +77,49 @@ static void MYOBJ_free(MYOBJ *obj) OPENSSL_free(obj); } +static MYOBJ *MYOBJ_dup(MYOBJ *in) +{ + MYOBJ *obj = MYOBJ_new(); + + obj->st = CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_APP, &obj->ex_data, + &in->ex_data); + OPENSSL_assert(obj->st != 0); + return obj; +} + int main() { - MYOBJ *t1, *t2; + MYOBJ *t1, *t2, *t3; const char *cp; char *p; p = strdup("hello world"); - sargl = 21; - sargp = malloc(1); - sidx = CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_APP, sargl, sargp, - exnew, exdup, exfree); + saved_argl = 21; + saved_argp = malloc(1); + saved_idx = CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_APP, + saved_argl, saved_argp, + exnew, exdup, exfree); t1 = MYOBJ_new(); t2 = MYOBJ_new(); MYOBJ_sethello(t1, p); cp = MYOBJ_gethello(t1); - assert(cp == p); + OPENSSL_assert(cp == p); + if (cp != p) + return 1; + cp = MYOBJ_gethello(t2); + OPENSSL_assert(cp == NULL); + if (cp != NULL) + return 1; + t3 = MYOBJ_dup(t1); + cp = MYOBJ_gethello(t3); + OPENSSL_assert(cp == p); + if (cp != p) + return 1; cp = MYOBJ_gethello(t2); - assert(cp == NULL); MYOBJ_free(t1); MYOBJ_free(t2); - free(sargp); + MYOBJ_free(t3); + free(saved_argp); free(p); return 0; }