1 /* _ _
2 ** _ __ ___ ___ __| | ___ ___| | mod_ssl
3 ** | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
4 ** | | | | | | (_) | (_| | \__ \__ \ | www.modssl.org
5 ** |_| |_| |_|\___/ \__,_|___|___/___/_| ftp.modssl.org
6 ** |_____|
7 ** ssl_engine_ds.c
8 ** Additional Data Structures
9 */
10
11 /* ====================================================================
12 * Copyright (c) 1998-2003 Ralf S. Engelschall. All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 *
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following
23 * disclaimer in the documentation and/or other materials
24 * provided with the distribution.
25 *
26 * 3. All advertising materials mentioning features or use of this
27 * software must display the following acknowledgment:
28 * "This product includes software developed by
29 * Ralf S. Engelschall <rse@engelschall.com> for use in the
30 * mod_ssl project (http://www.modssl.org/)."
31 *
32 * 4. The names "mod_ssl" must not be used to endorse or promote
33 * products derived from this software without prior written
34 * permission. For written permission, please contact
35 * rse@engelschall.com.
36 *
37 * 5. Products derived from this software may not be called "mod_ssl"
38 * nor may "mod_ssl" appear in their names without prior
39 * written permission of Ralf S. Engelschall.
40 *
41 * 6. Redistributions of any form whatsoever must retain the following
42 * acknowledgment:
43 * "This product includes software developed by
44 * Ralf S. Engelschall <rse@engelschall.com> for use in the
45 * mod_ssl project (http://www.modssl.org/)."
46 *
47 * THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY
48 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
50 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR
51 * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
53 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
54 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
56 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
57 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
58 * OF THE POSSIBILITY OF SUCH DAMAGE.
59 * ====================================================================
60 */
61 /* ``If you can't do it in
62 C or assembly language,
63 it isn't worth doing.''
64 -- Unknown */
65 #include "mod_ssl.h"
66
67
68 /* _________________________________________________________________
69 **
70 ** Data Structures which store _arbitrary_ data
71 ** _________________________________________________________________
72 */
73
ssl_ds_array_make(pool * p,int size)74 ssl_ds_array *ssl_ds_array_make(pool *p, int size)
75 {
76 ssl_ds_array *a;
77
78 if ((a = (ssl_ds_array *)ap_palloc(p, sizeof(ssl_ds_array))) == NULL)
79 return NULL;
80 a->pPool = p;
81 if ((a->pSubPool = ap_make_sub_pool(p)) == NULL)
82 return NULL;
83 a->aData = ap_make_array(a->pSubPool, 2, size);
84 return a;
85 }
86
ssl_ds_array_isempty(ssl_ds_array * a)87 BOOL ssl_ds_array_isempty(ssl_ds_array *a)
88 {
89 if (a == NULL || a->aData == NULL || a->aData->nelts == 0)
90 return TRUE;
91 else
92 return FALSE;
93 }
94
ssl_ds_array_push(ssl_ds_array * a)95 void *ssl_ds_array_push(ssl_ds_array *a)
96 {
97 void *d;
98
99 d = (void *)ap_push_array(a->aData);
100 return d;
101 }
102
ssl_ds_array_get(ssl_ds_array * a,int n)103 void *ssl_ds_array_get(ssl_ds_array *a, int n)
104 {
105 void *d;
106
107 if (n < 0 || n >= a->aData->nelts)
108 return NULL;
109 d = (void *)(a->aData->elts+(a->aData->elt_size*n));
110 return d;
111 }
112
ssl_ds_array_wipeout(ssl_ds_array * a)113 void ssl_ds_array_wipeout(ssl_ds_array *a)
114 {
115 if (a->aData->nelts > 0)
116 memset(a->aData->elts, 0, a->aData->elt_size*a->aData->nelts);
117 return;
118 }
119
ssl_ds_array_kill(ssl_ds_array * a)120 void ssl_ds_array_kill(ssl_ds_array *a)
121 {
122 ap_destroy_pool(a->pSubPool);
123 a->pSubPool = NULL;
124 a->aData = NULL;
125 return;
126 }
127
ssl_ds_table_make(pool * p,int size)128 ssl_ds_table *ssl_ds_table_make(pool *p, int size)
129 {
130 ssl_ds_table *t;
131
132 if ((t = (ssl_ds_table *)ap_palloc(p, sizeof(ssl_ds_table))) == NULL)
133 return NULL;
134 t->pPool = p;
135 if ((t->pSubPool = ap_make_sub_pool(p)) == NULL)
136 return NULL;
137 t->aKey = ap_make_array(t->pSubPool, 2, MAX_STRING_LEN);
138 t->aData = ap_make_array(t->pSubPool, 2, size);
139 return t;
140 }
141
ssl_ds_table_isempty(ssl_ds_table * t)142 BOOL ssl_ds_table_isempty(ssl_ds_table *t)
143 {
144 if (t == NULL || t->aKey == NULL || t->aKey->nelts == 0)
145 return TRUE;
146 else
147 return FALSE;
148 }
149
ssl_ds_table_push(ssl_ds_table * t,char * key)150 void *ssl_ds_table_push(ssl_ds_table *t, char *key)
151 {
152 char *k;
153 void *d;
154
155 k = (char *)ap_push_array(t->aKey);
156 d = (void *)ap_push_array(t->aData);
157 ap_cpystrn(k, key, t->aKey->elt_size);
158 return d;
159 }
160
ssl_ds_table_get(ssl_ds_table * t,char * key)161 void *ssl_ds_table_get(ssl_ds_table *t, char *key)
162 {
163 char *k;
164 void *d;
165 int i;
166
167 d = NULL;
168 for (i = 0; i < t->aKey->nelts; i++) {
169 k = (t->aKey->elts+(t->aKey->elt_size*i));
170 if (strEQ(k, key)) {
171 d = (void *)(t->aData->elts+(t->aData->elt_size*i));
172 break;
173 }
174 }
175 return d;
176 }
177
ssl_ds_table_wipeout(ssl_ds_table * t)178 void ssl_ds_table_wipeout(ssl_ds_table *t)
179 {
180 if (t->aKey->nelts > 0) {
181 memset(t->aKey->elts, 0, t->aKey->elt_size*t->aKey->nelts);
182 memset(t->aData->elts, 0, t->aData->elt_size*t->aData->nelts);
183 }
184 return;
185 }
186
ssl_ds_table_kill(ssl_ds_table * t)187 void ssl_ds_table_kill(ssl_ds_table *t)
188 {
189 ap_destroy_pool(t->pSubPool);
190 t->pSubPool = NULL;
191 t->aKey = NULL;
192 t->aData = NULL;
193 return;
194 }
195
196