LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/txt_db - txt_db.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 170 0.0 %
Date: 2015-10-10 Functions: 0 6 0.0 %

          Line data    Source code
       1             : /* crypto/txt_db/txt_db.c */
       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             : #include "cryptlib.h"
      63             : #include <openssl/buffer.h>
      64             : #include <openssl/txt_db.h>
      65             : 
      66             : #undef BUFSIZE
      67             : #define BUFSIZE 512
      68             : 
      69             : const char TXT_DB_version[] = "TXT_DB" OPENSSL_VERSION_PTEXT;
      70             : 
      71           0 : TXT_DB *TXT_DB_read(BIO *in, int num)
      72             : {
      73             :     TXT_DB *ret = NULL;
      74             :     int er = 1;
      75             :     int esc = 0;
      76             :     long ln = 0;
      77             :     int i, add, n;
      78             :     int size = BUFSIZE;
      79             :     int offset = 0;
      80             :     char *p, *f;
      81             :     OPENSSL_STRING *pp;
      82             :     BUF_MEM *buf = NULL;
      83             : 
      84           0 :     if ((buf = BUF_MEM_new()) == NULL)
      85             :         goto err;
      86           0 :     if (!BUF_MEM_grow(buf, size))
      87             :         goto err;
      88             : 
      89           0 :     if ((ret = OPENSSL_malloc(sizeof(TXT_DB))) == NULL)
      90             :         goto err;
      91           0 :     ret->num_fields = num;
      92           0 :     ret->index = NULL;
      93           0 :     ret->qual = NULL;
      94           0 :     if ((ret->data = sk_OPENSSL_PSTRING_new_null()) == NULL)
      95             :         goto err;
      96           0 :     if ((ret->index = OPENSSL_malloc(sizeof(*ret->index) * num)) == NULL)
      97             :         goto err;
      98           0 :     if ((ret->qual = OPENSSL_malloc(sizeof(*(ret->qual)) * num)) == NULL)
      99             :         goto err;
     100           0 :     for (i = 0; i < num; i++) {
     101           0 :         ret->index[i] = NULL;
     102           0 :         ret->qual[i] = NULL;
     103             :     }
     104             : 
     105           0 :     add = (num + 1) * sizeof(char *);
     106           0 :     buf->data[size - 1] = '\0';
     107             :     offset = 0;
     108             :     for (;;) {
     109           0 :         if (offset != 0) {
     110           0 :             size += BUFSIZE;
     111           0 :             if (!BUF_MEM_grow_clean(buf, size))
     112             :                 goto err;
     113             :         }
     114           0 :         buf->data[offset] = '\0';
     115           0 :         BIO_gets(in, &(buf->data[offset]), size - offset);
     116           0 :         ln++;
     117           0 :         if (buf->data[offset] == '\0')
     118             :             break;
     119           0 :         if ((offset == 0) && (buf->data[0] == '#'))
     120           0 :             continue;
     121           0 :         i = strlen(&(buf->data[offset]));
     122           0 :         offset += i;
     123           0 :         if (buf->data[offset - 1] != '\n')
     124           0 :             continue;
     125             :         else {
     126           0 :             buf->data[offset - 1] = '\0'; /* blat the '\n' */
     127           0 :             if (!(p = OPENSSL_malloc(add + offset)))
     128             :                 goto err;
     129             :             offset = 0;
     130             :         }
     131             :         pp = (char **)p;
     132           0 :         p += add;
     133             :         n = 0;
     134           0 :         pp[n++] = p;
     135             :         i = 0;
     136           0 :         f = buf->data;
     137             : 
     138             :         esc = 0;
     139             :         for (;;) {
     140           0 :             if (*f == '\0')
     141             :                 break;
     142           0 :             if (*f == '\t') {
     143           0 :                 if (esc)
     144           0 :                     p--;
     145             :                 else {
     146           0 :                     *(p++) = '\0';
     147           0 :                     f++;
     148           0 :                     if (n >= num)
     149             :                         break;
     150           0 :                     pp[n++] = p;
     151           0 :                     continue;
     152             :                 }
     153             :             }
     154           0 :             esc = (*f == '\\');
     155           0 :             *(p++) = *(f++);
     156             :         }
     157           0 :         *(p++) = '\0';
     158           0 :         if ((n != num) || (*f != '\0')) {
     159             : #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) /* temporary
     160             :                                                                * fix :-( */
     161           0 :             fprintf(stderr,
     162             :                     "wrong number of fields on line %ld (looking for field %d, got %d, '%s' left)\n",
     163             :                     ln, num, n, f);
     164             : #endif
     165             :             er = 2;
     166           0 :             goto err;
     167             :         }
     168           0 :         pp[n] = p;
     169           0 :         if (!sk_OPENSSL_PSTRING_push(ret->data, pp)) {
     170             : #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) /* temporary
     171             :                                                                * fix :-( */
     172           0 :             fprintf(stderr, "failure in sk_push\n");
     173             : #endif
     174             :             er = 2;
     175           0 :             goto err;
     176             :         }
     177             :     }
     178             :     er = 0;
     179             :  err:
     180           0 :     BUF_MEM_free(buf);
     181           0 :     if (er) {
     182             : #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)
     183           0 :         if (er == 1)
     184           0 :             fprintf(stderr, "OPENSSL_malloc failure\n");
     185             : #endif
     186           0 :         if (ret != NULL) {
     187           0 :             if (ret->data != NULL)
     188           0 :                 sk_OPENSSL_PSTRING_free(ret->data);
     189           0 :             if (ret->index != NULL)
     190           0 :                 OPENSSL_free(ret->index);
     191           0 :             if (ret->qual != NULL)
     192           0 :                 OPENSSL_free(ret->qual);
     193           0 :             if (ret != NULL)
     194           0 :                 OPENSSL_free(ret);
     195             :         }
     196             :         return (NULL);
     197             :     } else
     198             :         return (ret);
     199             : }
     200             : 
     201           0 : OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx,
     202             :                                     OPENSSL_STRING *value)
     203             : {
     204             :     OPENSSL_STRING *ret;
     205             :     LHASH_OF(OPENSSL_STRING) *lh;
     206             : 
     207           0 :     if (idx >= db->num_fields) {
     208           0 :         db->error = DB_ERROR_INDEX_OUT_OF_RANGE;
     209           0 :         return (NULL);
     210             :     }
     211           0 :     lh = db->index[idx];
     212           0 :     if (lh == NULL) {
     213           0 :         db->error = DB_ERROR_NO_INDEX;
     214           0 :         return (NULL);
     215             :     }
     216           0 :     ret = lh_OPENSSL_STRING_retrieve(lh, value);
     217           0 :     db->error = DB_ERROR_OK;
     218           0 :     return (ret);
     219             : }
     220             : 
     221           0 : int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *),
     222             :                         LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp)
     223             : {
     224             :     LHASH_OF(OPENSSL_STRING) *idx;
     225             :     OPENSSL_STRING *r;
     226             :     int i, n;
     227             : 
     228           0 :     if (field >= db->num_fields) {
     229           0 :         db->error = DB_ERROR_INDEX_OUT_OF_RANGE;
     230           0 :         return (0);
     231             :     }
     232             :     /* FIXME: we lose type checking at this point */
     233           0 :     if ((idx = (LHASH_OF(OPENSSL_STRING) *)lh_new(hash, cmp)) == NULL) {
     234           0 :         db->error = DB_ERROR_MALLOC;
     235           0 :         return (0);
     236             :     }
     237           0 :     n = sk_OPENSSL_PSTRING_num(db->data);
     238           0 :     for (i = 0; i < n; i++) {
     239           0 :         r = sk_OPENSSL_PSTRING_value(db->data, i);
     240           0 :         if ((qual != NULL) && (qual(r) == 0))
     241           0 :             continue;
     242           0 :         if ((r = lh_OPENSSL_STRING_insert(idx, r)) != NULL) {
     243           0 :             db->error = DB_ERROR_INDEX_CLASH;
     244           0 :             db->arg1 = sk_OPENSSL_PSTRING_find(db->data, r);
     245           0 :             db->arg2 = i;
     246           0 :             lh_OPENSSL_STRING_free(idx);
     247           0 :             return (0);
     248             :         }
     249             :     }
     250           0 :     if (db->index[field] != NULL)
     251           0 :         lh_OPENSSL_STRING_free(db->index[field]);
     252           0 :     db->index[field] = idx;
     253           0 :     db->qual[field] = qual;
     254           0 :     return (1);
     255             : }
     256             : 
     257           0 : long TXT_DB_write(BIO *out, TXT_DB *db)
     258             : {
     259             :     long i, j, n, nn, l, tot = 0;
     260             :     char *p, **pp, *f;
     261             :     BUF_MEM *buf = NULL;
     262             :     long ret = -1;
     263             : 
     264           0 :     if ((buf = BUF_MEM_new()) == NULL)
     265             :         goto err;
     266           0 :     n = sk_OPENSSL_PSTRING_num(db->data);
     267           0 :     nn = db->num_fields;
     268           0 :     for (i = 0; i < n; i++) {
     269           0 :         pp = sk_OPENSSL_PSTRING_value(db->data, i);
     270             : 
     271             :         l = 0;
     272           0 :         for (j = 0; j < nn; j++) {
     273           0 :             if (pp[j] != NULL)
     274           0 :                 l += strlen(pp[j]);
     275             :         }
     276           0 :         if (!BUF_MEM_grow_clean(buf, (int)(l * 2 + nn)))
     277             :             goto err;
     278             : 
     279           0 :         p = buf->data;
     280           0 :         for (j = 0; j < nn; j++) {
     281           0 :             f = pp[j];
     282           0 :             if (f != NULL)
     283             :                 for (;;) {
     284           0 :                     if (*f == '\0')
     285             :                         break;
     286           0 :                     if (*f == '\t')
     287           0 :                         *(p++) = '\\';
     288           0 :                     *(p++) = *(f++);
     289           0 :                 }
     290           0 :             *(p++) = '\t';
     291             :         }
     292           0 :         p[-1] = '\n';
     293           0 :         j = p - buf->data;
     294           0 :         if (BIO_write(out, buf->data, (int)j) != j)
     295             :             goto err;
     296           0 :         tot += j;
     297             :     }
     298             :     ret = tot;
     299             :  err:
     300           0 :     if (buf != NULL)
     301           0 :         BUF_MEM_free(buf);
     302           0 :     return (ret);
     303             : }
     304             : 
     305           0 : int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *row)
     306             : {
     307             :     int i;
     308             :     OPENSSL_STRING *r;
     309             : 
     310           0 :     for (i = 0; i < db->num_fields; i++) {
     311           0 :         if (db->index[i] != NULL) {
     312           0 :             if ((db->qual[i] != NULL) && (db->qual[i] (row) == 0))
     313           0 :                 continue;
     314           0 :             r = lh_OPENSSL_STRING_retrieve(db->index[i], row);
     315           0 :             if (r != NULL) {
     316           0 :                 db->error = DB_ERROR_INDEX_CLASH;
     317           0 :                 db->arg1 = i;
     318           0 :                 db->arg_row = r;
     319           0 :                 goto err;
     320             :             }
     321             :         }
     322             :     }
     323             :     /* We have passed the index checks, now just append and insert */
     324           0 :     if (!sk_OPENSSL_PSTRING_push(db->data, row)) {
     325           0 :         db->error = DB_ERROR_MALLOC;
     326           0 :         goto err;
     327             :     }
     328             : 
     329           0 :     for (i = 0; i < db->num_fields; i++) {
     330           0 :         if (db->index[i] != NULL) {
     331           0 :             if ((db->qual[i] != NULL) && (db->qual[i] (row) == 0))
     332           0 :                 continue;
     333           0 :             (void)lh_OPENSSL_STRING_insert(db->index[i], row);
     334             :         }
     335             :     }
     336             :     return (1);
     337             :  err:
     338             :     return (0);
     339             : }
     340             : 
     341           0 : void TXT_DB_free(TXT_DB *db)
     342             : {
     343             :     int i, n;
     344             :     char **p, *max;
     345             : 
     346           0 :     if (db == NULL)
     347           0 :         return;
     348             : 
     349           0 :     if (db->index != NULL) {
     350           0 :         for (i = db->num_fields - 1; i >= 0; i--)
     351           0 :             if (db->index[i] != NULL)
     352           0 :                 lh_OPENSSL_STRING_free(db->index[i]);
     353           0 :         OPENSSL_free(db->index);
     354             :     }
     355           0 :     if (db->qual != NULL)
     356           0 :         OPENSSL_free(db->qual);
     357           0 :     if (db->data != NULL) {
     358           0 :         for (i = sk_OPENSSL_PSTRING_num(db->data) - 1; i >= 0; i--) {
     359             :             /*
     360             :              * check if any 'fields' have been allocated from outside of the
     361             :              * initial block
     362             :              */
     363           0 :             p = sk_OPENSSL_PSTRING_value(db->data, i);
     364           0 :             max = p[db->num_fields]; /* last address */
     365           0 :             if (max == NULL) {  /* new row */
     366           0 :                 for (n = 0; n < db->num_fields; n++)
     367           0 :                     if (p[n] != NULL)
     368           0 :                         OPENSSL_free(p[n]);
     369             :             } else {
     370           0 :                 for (n = 0; n < db->num_fields; n++) {
     371           0 :                     if (((p[n] < (char *)p) || (p[n] > max))
     372           0 :                         && (p[n] != NULL))
     373           0 :                         OPENSSL_free(p[n]);
     374             :                 }
     375             :             }
     376           0 :             OPENSSL_free(sk_OPENSSL_PSTRING_value(db->data, i));
     377             :         }
     378           0 :         sk_OPENSSL_PSTRING_free(db->data);
     379             :     }
     380           0 :     OPENSSL_free(db);
     381             : }

Generated by: LCOV version 1.10