OpenCoverage

txt_db.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/txt_db/txt_db.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: txt_db.c,v 1.18 2014/07/11 08:44:49 jsing Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60#include <stdlib.h>-
61#include <string.h>-
62-
63#include <openssl/buffer.h>-
64#include <openssl/txt_db.h>-
65-
66#undef BUFSIZE-
67#define BUFSIZE 512-
68-
69TXT_DB *-
70TXT_DB_read(BIO *in, int num)-
71{-
72 TXT_DB *ret = NULL;-
73 int er = 1;-
74 int esc = 0;-
75 long ln = 0;-
76 int i, add, n;-
77 int size = BUFSIZE;-
78 int offset = 0;-
79 char *p, *f;-
80 OPENSSL_STRING *pp;-
81 BUF_MEM *buf = NULL;-
82-
83 if ((buf = BUF_MEM_new()) == NULL)
(buf = BUF_MEM...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
84 goto err;
never executed: goto err;
0
85 if (!BUF_MEM_grow(buf, size))
!BUF_MEM_grow(buf, size)Description
TRUEnever evaluated
FALSEnever evaluated
0
86 goto err;
never executed: goto err;
0
87-
88 if ((ret = malloc(sizeof(TXT_DB))) == NULL)
(ret = malloc(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
89 goto err;
never executed: goto err;
0
90 ret->num_fields = num;-
91 ret->index = NULL;-
92 ret->qual = NULL;-
93 if ((ret->data = sk_OPENSSL_PSTRING_new_null()) == NULL)
(ret->data = (...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
94 goto err;
never executed: goto err;
0
95 if ((ret->index = reallocarray(NULL, num, sizeof(*ret->index))) == NULL)
(ret->index = ...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
96 goto err;
never executed: goto err;
0
97 if ((ret->qual = reallocarray(NULL, num, sizeof(*(ret->qual)))) == NULL)
(ret->qual = r...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
98 goto err;
never executed: goto err;
0
99 for (i = 0; i < num; i++) {
i < numDescription
TRUEnever evaluated
FALSEnever evaluated
0
100 ret->index[i] = NULL;-
101 ret->qual[i] = NULL;-
102 }
never executed: end of block
0
103-
104 add = (num + 1)*sizeof(char *);-
105 buf->data[size-1] = '\0';-
106 offset = 0;-
107 for (;;) {-
108 if (offset != 0) {
offset != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
109 size += BUFSIZE;-
110 if (!BUF_MEM_grow_clean(buf, size))
!BUF_MEM_grow_clean(buf, size)Description
TRUEnever evaluated
FALSEnever evaluated
0
111 goto err;
never executed: goto err;
0
112 }
never executed: end of block
0
113 buf->data[offset] = '\0';-
114 BIO_gets(in, &(buf->data[offset]), size - offset);-
115 ln++;-
116 if (buf->data[offset] == '\0')
buf->data[offset] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
117 break;
never executed: break;
0
118 if ((offset == 0) && (buf->data[0] == '#'))
(offset == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(buf->data[0] == '#')Description
TRUEnever evaluated
FALSEnever evaluated
0
119 continue;
never executed: continue;
0
120 i = strlen(&(buf->data[offset]));-
121 offset += i;-
122 if (buf->data[offset-1] != '\n')
buf->data[offset-1] != '\n'Description
TRUEnever evaluated
FALSEnever evaluated
0
123 continue;
never executed: continue;
0
124 else {-
125 buf->data[offset-1] = '\0'; /* blat the '\n' */-
126 if (!(p = malloc(add + offset)))
!(p = malloc(add + offset))Description
TRUEnever evaluated
FALSEnever evaluated
0
127 goto err;
never executed: goto err;
0
128 offset = 0;-
129 }
never executed: end of block
0
130 pp = (char **)p;-
131 p += add;-
132 n = 0;-
133 pp[n++] = p;-
134 i = 0;-
135 f = buf->data;-
136-
137 esc = 0;-
138 for (;;) {-
139 if (*f == '\0')
*f == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
140 break;
never executed: break;
0
141 if (*f == '\t') {
*f == '\t'Description
TRUEnever evaluated
FALSEnever evaluated
0
142 if (esc)
escDescription
TRUEnever evaluated
FALSEnever evaluated
0
143 p--;
never executed: p--;
0
144 else {-
145 *(p++)='\0';-
146 f++;-
147 if (n >= num)
n >= numDescription
TRUEnever evaluated
FALSEnever evaluated
0
148 break;
never executed: break;
0
149 pp[n++] = p;-
150 continue;
never executed: continue;
0
151 }-
152 }-
153 esc=(*f == '\\');-
154 *(p++)= *(f++);-
155 }
never executed: end of block
0
156 *(p++)='\0';-
157 if ((n != num) || (*f != '\0')) {
(n != num)Description
TRUEnever evaluated
FALSEnever evaluated
(*f != '\0')Description
TRUEnever evaluated
FALSEnever evaluated
0
158 fprintf(stderr, "wrong number of fields on line %ld (looking for field %d, got %d, '%s' left)\n",ln,num,n,f);-
159 er = 2;-
160 goto err;
never executed: goto err;
0
161 }-
162 pp[n] = p;-
163 if (!sk_OPENSSL_PSTRING_push(ret->data, pp)) {
!sk_push(((_ST...L_STRING*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
164 fprintf(stderr, "failure in sk_push\n");-
165 er = 2;-
166 goto err;
never executed: goto err;
0
167 }-
168 }
never executed: end of block
0
169 er = 0;-
170-
171err:
code before this statement never executed: err:
0
172 BUF_MEM_free(buf);-
173 if (er) {
erDescription
TRUEnever evaluated
FALSEnever evaluated
0
174 if (er == 1)
er == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
175 fprintf(stderr, "malloc failure\n");
never executed: fprintf( stderr , "malloc failure\n");
0
176 if (ret != NULL) {
ret != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
177 if (ret->data != NULL)
ret->data != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
178 sk_OPENSSL_PSTRING_free(ret->data);
never executed: sk_free(((_STACK*) (1 ? ret->data : (struct stack_st_OPENSSL_PSTRING*)0)));
0
179 free(ret->index);-
180 free(ret->qual);-
181 free(ret);-
182 }
never executed: end of block
0
183 return (NULL);
never executed: return ( ((void *)0) );
0
184 } else-
185 return (ret);
never executed: return (ret);
0
186}-
187-
188OPENSSL_STRING *-
189TXT_DB_get_by_index(TXT_DB *db, int idx, OPENSSL_STRING *value)-
190{-
191 OPENSSL_STRING *ret;-
192 LHASH_OF(OPENSSL_STRING) *lh;-
193-
194 if (idx >= db->num_fields) {
idx >= db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
195 db->error = DB_ERROR_INDEX_OUT_OF_RANGE;-
196 return (NULL);
never executed: return ( ((void *)0) );
0
197 }-
198 lh = db->index[idx];-
199 if (lh == NULL) {
lh == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
200 db->error = DB_ERROR_NO_INDEX;-
201 return (NULL);
never executed: return ( ((void *)0) );
0
202 }-
203 ret = lh_OPENSSL_STRING_retrieve(lh, value);-
204 db->error = DB_ERROR_OK;-
205 return (ret);
never executed: return (ret);
0
206}-
207-
208int-
209TXT_DB_create_index(TXT_DB *db, int field, int (*qual)(OPENSSL_STRING *),-
210 LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp)-
211{-
212 LHASH_OF(OPENSSL_STRING) *idx;-
213 OPENSSL_STRING *r;-
214 int i, n;-
215-
216 if (field >= db->num_fields) {
field >= db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
217 db->error = DB_ERROR_INDEX_OUT_OF_RANGE;-
218 return (0);
never executed: return (0);
0
219 }-
220 /* FIXME: we lose type checking at this point */-
221 if ((idx = (LHASH_OF(OPENSSL_STRING) *)lh_new(hash, cmp)) == NULL) {
(idx = (struct...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
222 db->error = DB_ERROR_MALLOC;-
223 return (0);
never executed: return (0);
0
224 }-
225 n = sk_OPENSSL_PSTRING_num(db->data);-
226 for (i = 0; i < n; i++) {
i < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
227 r = sk_OPENSSL_PSTRING_value(db->data, i);-
228 if ((qual != NULL) && (qual(r) == 0))
(qual != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(qual(r) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
229 continue;
never executed: continue;
0
230 if ((r = lh_OPENSSL_STRING_insert(idx, r)) != NULL) {
(r = ((OPENSSL...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
231 db->error = DB_ERROR_INDEX_CLASH;-
232 db->arg1 = sk_OPENSSL_PSTRING_find(db->data, r);-
233 db->arg2 = i;-
234 lh_OPENSSL_STRING_free(idx);-
235 return (0);
never executed: return (0);
0
236 }-
237 }
never executed: end of block
0
238 if (db->index[field] != NULL)
db->index[fiel...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
239 lh_OPENSSL_STRING_free(db->index[field]);
never executed: lh_free(((_LHASH *)((void*) (1 ? db->index[field] : (struct lhash_st_OPENSSL_STRING*)0))));
0
240 db->index[field] = idx;-
241 db->qual[field] = qual;-
242 return (1);
never executed: return (1);
0
243}-
244-
245long-
246TXT_DB_write(BIO *out, TXT_DB *db)-
247{-
248 long i, j,n, nn, l, tot = 0;-
249 char *p, **pp, *f;-
250 BUF_MEM *buf = NULL;-
251 long ret = -1;-
252-
253 if ((buf = BUF_MEM_new()) == NULL)
(buf = BUF_MEM...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
254 goto err;
never executed: goto err;
0
255 n = sk_OPENSSL_PSTRING_num(db->data);-
256 nn = db->num_fields;-
257 for (i = 0; i < n; i++) {
i < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
258 pp = sk_OPENSSL_PSTRING_value(db->data, i);-
259-
260 l = 0;-
261 for (j = 0; j < nn; j++) {
j < nnDescription
TRUEnever evaluated
FALSEnever evaluated
0
262 if (pp[j] != NULL)
pp[j] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
263 l += strlen(pp[j]);
never executed: l += strlen(pp[j]);
0
264 }
never executed: end of block
0
265 if (!BUF_MEM_grow_clean(buf, (int)(l*2 + nn)))
!BUF_MEM_grow_...nt)(l*2 + nn))Description
TRUEnever evaluated
FALSEnever evaluated
0
266 goto err;
never executed: goto err;
0
267-
268 p = buf->data;-
269 for (j = 0; j < nn; j++) {
j < nnDescription
TRUEnever evaluated
FALSEnever evaluated
0
270 f = pp[j];-
271 if (f != NULL)
f != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
272 for (;;) {-
273 if (*f == '\0')
*f == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
274 break;
never executed: break;
0
275 if (*f == '\t')
*f == '\t'Description
TRUEnever evaluated
FALSEnever evaluated
0
276 *(p++) = '\\';
never executed: *(p++) = '\\';
0
277 *(p++) = *(f++);-
278 }
never executed: end of block
0
279 *(p++) = '\t';-
280 }
never executed: end of block
0
281 p[-1] = '\n';-
282 j = p - buf->data;-
283 if (BIO_write(out, buf->data, (int)j) != j)
BIO_write(out,..., (int)j) != jDescription
TRUEnever evaluated
FALSEnever evaluated
0
284 goto err;
never executed: goto err;
0
285 tot += j;-
286 }
never executed: end of block
0
287 ret = tot;-
288-
289err:
code before this statement never executed: err:
0
290 if (buf != NULL)
buf != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
291 BUF_MEM_free(buf);
never executed: BUF_MEM_free(buf);
0
292 return (ret);
never executed: return (ret);
0
293}-
294-
295int-
296TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *row)-
297{-
298 int i;-
299 OPENSSL_STRING *r;-
300-
301 for (i = 0; i < db->num_fields; i++) {
i < db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
302 if (db->index[i] != NULL) {
db->index[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
303 if ((db->qual[i] != NULL) && (db->qual[i](row) == 0))
(db->qual[i] != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(db->qual[i](row) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
304 continue;
never executed: continue;
0
305 r = lh_OPENSSL_STRING_retrieve(db->index[i], row);-
306 if (r != NULL) {
r != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
307 db->error = DB_ERROR_INDEX_CLASH;-
308 db->arg1 = i;-
309 db->arg_row = r;-
310 goto err;
never executed: goto err;
0
311 }-
312 }
never executed: end of block
0
313 }
never executed: end of block
0
314 /* We have passed the index checks, now just append and insert */-
315 if (!sk_OPENSSL_PSTRING_push(db->data, row)) {
!sk_push(((_ST...L_STRING*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
316 db->error = DB_ERROR_MALLOC;-
317 goto err;
never executed: goto err;
0
318 }-
319-
320 for (i = 0; i < db->num_fields; i++) {
i < db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
321 if (db->index[i] != NULL) {
db->index[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
322 if ((db->qual[i] != NULL) && (db->qual[i](row) == 0))
(db->qual[i] != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(db->qual[i](row) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
323 continue;
never executed: continue;
0
324 (void)lh_OPENSSL_STRING_insert(db->index[i], row);-
325 }
never executed: end of block
0
326 }
never executed: end of block
0
327 return (1);
never executed: return (1);
0
328-
329err:-
330 return (0);
never executed: return (0);
0
331}-
332-
333void-
334TXT_DB_free(TXT_DB *db)-
335{-
336 int i, n;-
337 char **p, *max;-
338-
339 if (db == NULL)
db == ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • freenull
FALSEnever evaluated
0-1
340 return;
executed 1 time by 1 test: return;
Executed by:
  • freenull
1
341-
342 if (db->index != NULL) {
db->index != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
343 for (i = db->num_fields - 1; i >= 0; i--)
i >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
344 if (db->index[i] != NULL)
db->index[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
345 lh_OPENSSL_STRING_free(db->index[i]);
never executed: lh_free(((_LHASH *)((void*) (1 ? db->index[i] : (struct lhash_st_OPENSSL_STRING*)0))));
0
346 free(db->index);-
347 }
never executed: end of block
0
348 free(db->qual);-
349 if (db->data != NULL) {
db->data != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
350 for (i = sk_OPENSSL_PSTRING_num(db->data) - 1; i >= 0; i--) {
i >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
351 /* check if any 'fields' have been allocated-
352 * from outside of the initial block */-
353 p = sk_OPENSSL_PSTRING_value(db->data, i);-
354 max = p[db->num_fields]; /* last address */-
355 if (max == NULL) /* new row */
max == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
356 {-
357 for (n = 0; n < db->num_fields; n++)
n < db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
358 free(p[n]);
never executed: free(p[n]);
0
359 } else {
never executed: end of block
0
360 for (n = 0; n < db->num_fields; n++) {
n < db->num_fieldsDescription
TRUEnever evaluated
FALSEnever evaluated
0
361 if (((p[n] < (char *)p) ||
(p[n] < (char *)p)Description
TRUEnever evaluated
FALSEnever evaluated
0
362 (p[n] > max)) &&
(p[n] > max)Description
TRUEnever evaluated
FALSEnever evaluated
0
363 (p[n] != NULL))
(p[n] != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
364 free(p[n]);
never executed: free(p[n]);
0
365 }
never executed: end of block
0
366 }
never executed: end of block
0
367 free(sk_OPENSSL_PSTRING_value(db->data, i));-
368 }
never executed: end of block
0
369 sk_OPENSSL_PSTRING_free(db->data);-
370 }
never executed: end of block
0
371 free(db);-
372}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2