blob: e82fdbfaea3dbef5a468ccb7b0c1a275c3f6c086 [file] [log] [blame]
Rich Salz440e5d82016-05-17 14:20:24 -04001/*
Rich Salz629192c2017-02-28 10:53:28 -05002 * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved.
Rich Salze6390ac2015-07-21 10:06:03 -04003 *
Rich Salz440e5d82016-05-17 14:20:24 -04004 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
Rich Salze6390ac2015-07-21 10:06:03 -04008 */
Rich Salz440e5d82016-05-17 14:20:24 -04009
Rich Salze6390ac2015-07-21 10:06:03 -040010#include <stdio.h>
Rich Salze6390ac2015-07-21 10:06:03 -040011#include <string.h>
12#include <stdlib.h>
Rich Salz629192c2017-02-28 10:53:28 -050013#include <assert.h>
Rich Salze6390ac2015-07-21 10:06:03 -040014#include <openssl/crypto.h>
15
Rich Salz629192c2017-02-28 10:53:28 -050016static long saved_argl;
17static void *saved_argp;
18static int saved_idx;
Rich Salze6390ac2015-07-21 10:06:03 -040019
20static void exnew(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
21 int idx, long argl, void *argp)
22{
Rich Salz629192c2017-02-28 10:53:28 -050023 assert(idx == saved_idx);
24 assert(argl == saved_argl);
25 assert(argp == saved_argp);
Rich Salze6390ac2015-07-21 10:06:03 -040026}
27
Rich Salz629192c2017-02-28 10:53:28 -050028static int exdup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from,
Rich Salze6390ac2015-07-21 10:06:03 -040029 void *from_d, int idx, long argl, void *argp)
30{
Rich Salz629192c2017-02-28 10:53:28 -050031 assert(idx == saved_idx);
32 assert(argl == saved_argl);
33 assert(argp == saved_argp);
Rich Salze6390ac2015-07-21 10:06:03 -040034 return 0;
35}
36
37static void exfree(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
38 int idx, long argl, void *argp)
39{
Rich Salz629192c2017-02-28 10:53:28 -050040 assert(idx == saved_idx);
41 assert(argl == saved_argl);
42 assert(argp == saved_argp);
Rich Salze6390ac2015-07-21 10:06:03 -040043}
44
45typedef struct myobj_st {
46 CRYPTO_EX_DATA ex_data;
47 int id;
Rich Salz629192c2017-02-28 10:53:28 -050048 int st;
Rich Salze6390ac2015-07-21 10:06:03 -040049} MYOBJ;
50
51static MYOBJ *MYOBJ_new()
52{
53 static int count = 0;
54 MYOBJ *obj = OPENSSL_malloc(sizeof(*obj));
Rich Salze6390ac2015-07-21 10:06:03 -040055
56 obj->id = ++count;
Rich Salz629192c2017-02-28 10:53:28 -050057 obj->st = CRYPTO_new_ex_data(CRYPTO_EX_INDEX_APP, obj, &obj->ex_data);
58 assert(obj->st != 0);
Rich Salze6390ac2015-07-21 10:06:03 -040059 return obj;
60}
61
62static void MYOBJ_sethello(MYOBJ *obj, char *cp)
63{
Rich Salz629192c2017-02-28 10:53:28 -050064 obj->st = CRYPTO_set_ex_data(&obj->ex_data, saved_idx, cp);
65 assert(obj->st != 0);
Rich Salze6390ac2015-07-21 10:06:03 -040066}
67
68static char *MYOBJ_gethello(MYOBJ *obj)
69{
Rich Salz629192c2017-02-28 10:53:28 -050070 return CRYPTO_get_ex_data(&obj->ex_data, saved_idx);
Rich Salze6390ac2015-07-21 10:06:03 -040071}
72
73static void MYOBJ_free(MYOBJ *obj)
74{
75 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_APP, obj, &obj->ex_data);
76 OPENSSL_free(obj);
77}
78
79int main()
80{
81 MYOBJ *t1, *t2;
82 const char *cp;
83 char *p;
84
85 p = strdup("hello world");
Rich Salz629192c2017-02-28 10:53:28 -050086 saved_argl = 21;
87 saved_argp = malloc(1);
88 saved_idx = CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_APP,
89 saved_argl, saved_argp,
90 exnew, exdup, exfree);
Rich Salze6390ac2015-07-21 10:06:03 -040091 t1 = MYOBJ_new();
92 t2 = MYOBJ_new();
93 MYOBJ_sethello(t1, p);
94 cp = MYOBJ_gethello(t1);
95 assert(cp == p);
Rich Salz629192c2017-02-28 10:53:28 -050096 if (cp != p)
97 return 1;
Rich Salze6390ac2015-07-21 10:06:03 -040098 cp = MYOBJ_gethello(t2);
99 assert(cp == NULL);
Rich Salz629192c2017-02-28 10:53:28 -0500100 if (cp != NULL)
101 return 1;
Rich Salze6390ac2015-07-21 10:06:03 -0400102 MYOBJ_free(t1);
103 MYOBJ_free(t2);
Rich Salz629192c2017-02-28 10:53:28 -0500104 free(saved_argp);
Rich Salze6390ac2015-07-21 10:06:03 -0400105 free(p);
106 return 0;
107}