LCOV - code coverage report
Current view: top level - conf - conf_def.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 198 309 64.1 %
Date: 2014-08-02 Functions: 14 20 70.0 %
Branches: 102 224 45.5 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/conf/conf.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                 :            : /* Part of the code in here was originally in conf.c, which is now removed */
      60                 :            : 
      61                 :            : #include <stdio.h>
      62                 :            : #include <string.h>
      63                 :            : #include "cryptlib.h"
      64                 :            : #include <openssl/stack.h>
      65                 :            : #include <openssl/lhash.h>
      66                 :            : #include <openssl/conf.h>
      67                 :            : #include <openssl/conf_api.h>
      68                 :            : #include "conf_def.h"
      69                 :            : #include <openssl/buffer.h>
      70                 :            : #include <openssl/err.h>
      71                 :            : 
      72                 :            : static char *eat_ws(CONF *conf, char *p);
      73                 :            : static char *eat_alpha_numeric(CONF *conf, char *p);
      74                 :            : static void clear_comments(CONF *conf, char *p);
      75                 :            : static int str_copy(CONF *conf,char *section,char **to, char *from);
      76                 :            : static char *scan_quote(CONF *conf, char *p);
      77                 :            : static char *scan_dquote(CONF *conf, char *p);
      78                 :            : #define scan_esc(conf,p)        (((IS_EOF((conf),(p)[1]))?((p)+1):((p)+2)))
      79                 :            : 
      80                 :            : static CONF *def_create(CONF_METHOD *meth);
      81                 :            : static int def_init_default(CONF *conf);
      82                 :            : static int def_init_WIN32(CONF *conf);
      83                 :            : static int def_destroy(CONF *conf);
      84                 :            : static int def_destroy_data(CONF *conf);
      85                 :            : static int def_load(CONF *conf, const char *name, long *eline);
      86                 :            : static int def_load_bio(CONF *conf, BIO *bp, long *eline);
      87                 :            : static int def_dump(const CONF *conf, BIO *bp);
      88                 :            : static int def_is_number(const CONF *conf, char c);
      89                 :            : static int def_to_int(const CONF *conf, char c);
      90                 :            : 
      91                 :            : const char CONF_def_version[]="CONF_def" OPENSSL_VERSION_PTEXT;
      92                 :            : 
      93                 :            : static CONF_METHOD default_method = {
      94                 :            :         "OpenSSL default",
      95                 :            :         def_create,
      96                 :            :         def_init_default,
      97                 :            :         def_destroy,
      98                 :            :         def_destroy_data,
      99                 :            :         def_load_bio,
     100                 :            :         def_dump,
     101                 :            :         def_is_number,
     102                 :            :         def_to_int,
     103                 :            :         def_load
     104                 :            :         };
     105                 :            : 
     106                 :            : static CONF_METHOD WIN32_method = {
     107                 :            :         "WIN32",
     108                 :            :         def_create,
     109                 :            :         def_init_WIN32,
     110                 :            :         def_destroy,
     111                 :            :         def_destroy_data,
     112                 :            :         def_load_bio,
     113                 :            :         def_dump,
     114                 :            :         def_is_number,
     115                 :            :         def_to_int,
     116                 :            :         def_load
     117                 :            :         };
     118                 :            : 
     119                 :        776 : CONF_METHOD *NCONF_default()
     120                 :            :         {
     121                 :        776 :         return &default_method;
     122                 :            :         }
     123                 :          0 : CONF_METHOD *NCONF_WIN32()
     124                 :            :         {
     125                 :          0 :         return &WIN32_method;
     126                 :            :         }
     127                 :            : 
     128                 :        776 : static CONF *def_create(CONF_METHOD *meth)
     129                 :            :         {
     130                 :            :         CONF *ret;
     131                 :            : 
     132                 :        776 :         ret = OPENSSL_malloc(sizeof(CONF) + sizeof(unsigned short *));
     133         [ +  - ]:        776 :         if (ret)
     134         [ -  + ]:        776 :                 if (meth->init(ret) == 0)
     135                 :            :                         {
     136                 :          0 :                         OPENSSL_free(ret);
     137                 :          0 :                         ret = NULL;
     138                 :            :                         }
     139                 :        776 :         return ret;
     140                 :            :         }
     141                 :            :         
     142                 :        776 : static int def_init_default(CONF *conf)
     143                 :            :         {
     144         [ +  - ]:        776 :         if (conf == NULL)
     145                 :            :                 return 0;
     146                 :            : 
     147                 :        776 :         conf->meth = &default_method;
     148                 :        776 :         conf->meth_data = CONF_type_default;
     149                 :        776 :         conf->data = NULL;
     150                 :            : 
     151                 :        776 :         return 1;
     152                 :            :         }
     153                 :            : 
     154                 :          0 : static int def_init_WIN32(CONF *conf)
     155                 :            :         {
     156         [ #  # ]:          0 :         if (conf == NULL)
     157                 :            :                 return 0;
     158                 :            : 
     159                 :          0 :         conf->meth = &WIN32_method;
     160                 :          0 :         conf->meth_data = (void *)CONF_type_win32;
     161                 :          0 :         conf->data = NULL;
     162                 :            : 
     163                 :          0 :         return 1;
     164                 :            :         }
     165                 :            : 
     166                 :        775 : static int def_destroy(CONF *conf)
     167                 :            :         {
     168         [ +  - ]:        775 :         if (def_destroy_data(conf))
     169                 :            :                 {
     170                 :        775 :                 OPENSSL_free(conf);
     171                 :        775 :                 return 1;
     172                 :            :                 }
     173                 :            :         return 0;
     174                 :            :         }
     175                 :            : 
     176                 :        775 : static int def_destroy_data(CONF *conf)
     177                 :            :         {
     178         [ +  - ]:        775 :         if (conf == NULL)
     179                 :            :                 return 0;
     180                 :        775 :         _CONF_free_data(conf);
     181                 :        775 :         return 1;
     182                 :            :         }
     183                 :            : 
     184                 :        775 : static int def_load(CONF *conf, const char *name, long *line)
     185                 :            :         {
     186                 :            :         int ret;
     187                 :        775 :         BIO *in=NULL;
     188                 :            : 
     189                 :            : #ifdef OPENSSL_SYS_VMS
     190                 :            :         in=BIO_new_file(name, "r");
     191                 :            : #else
     192                 :        775 :         in=BIO_new_file(name, "rb");
     193                 :            : #endif
     194         [ +  + ]:        775 :         if (in == NULL)
     195                 :            :                 {
     196         [ +  - ]:          5 :                 if (ERR_GET_REASON(ERR_peek_last_error()) == BIO_R_NO_SUCH_FILE)
     197                 :          5 :                         CONFerr(CONF_F_DEF_LOAD,CONF_R_NO_SUCH_FILE);
     198                 :            :                 else
     199                 :          0 :                         CONFerr(CONF_F_DEF_LOAD,ERR_R_SYS_LIB);
     200                 :            :                 return 0;
     201                 :            :                 }
     202                 :            : 
     203                 :        770 :         ret = def_load_bio(conf, in, line);
     204                 :        770 :         BIO_free(in);
     205                 :            : 
     206                 :        770 :         return ret;
     207                 :            :         }
     208                 :            : 
     209                 :        771 : static int def_load_bio(CONF *conf, BIO *in, long *line)
     210                 :            :         {
     211                 :            : /* The macro BUFSIZE conflicts with a system macro in VxWorks */
     212                 :            : #define CONFBUFSIZE     512
     213                 :        771 :         int bufnum=0,i,ii;
     214                 :        771 :         BUF_MEM *buff=NULL;
     215                 :            :         char *s,*p,*end;
     216                 :            :         int again;
     217                 :        771 :         long eline=0;
     218                 :            :         char btmp[DECIMAL_SIZE(eline)+1];
     219                 :        771 :         CONF_VALUE *v=NULL,*tv;
     220                 :        771 :         CONF_VALUE *sv=NULL;
     221                 :        771 :         char *section=NULL,*buf;
     222                 :            :         char *start,*psection,*pname;
     223                 :        771 :         void *h = (void *)(conf->data);
     224                 :            : 
     225         [ -  + ]:        771 :         if ((buff=BUF_MEM_new()) == NULL)
     226                 :            :                 {
     227                 :          0 :                 CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_BUF_LIB);
     228                 :          0 :                 goto err;
     229                 :            :                 }
     230                 :            : 
     231                 :        771 :         section=(char *)OPENSSL_malloc(10);
     232         [ -  + ]:        771 :         if (section == NULL)
     233                 :            :                 {
     234                 :          0 :                 CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
     235                 :          0 :                 goto err;
     236                 :            :                 }
     237                 :        771 :         BUF_strlcpy(section,"default",10);
     238                 :            : 
     239         [ -  + ]:        771 :         if (_CONF_new_data(conf) == 0)
     240                 :            :                 {
     241                 :          0 :                 CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
     242                 :          0 :                 goto err;
     243                 :            :                 }
     244                 :            : 
     245                 :        771 :         sv=_CONF_new_section(conf,section);
     246         [ +  - ]:        771 :         if (sv == NULL)
     247                 :            :                 {
     248                 :          0 :                 CONFerr(CONF_F_DEF_LOAD_BIO,
     249                 :            :                                         CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
     250                 :     256388 :                 goto err;
     251                 :            :                 }
     252                 :            : 
     253                 :            :         bufnum=0;
     254                 :            :         again=0;
     255                 :            :         for (;;)
     256                 :            :                 {
     257         [ -  + ]:     257159 :                 if (!BUF_MEM_grow(buff,bufnum+CONFBUFSIZE))
     258                 :            :                         {
     259                 :          0 :                         CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_BUF_LIB);
     260                 :          0 :                         goto err;
     261                 :            :                         }
     262                 :     257159 :                 p= &(buff->data[bufnum]);
     263                 :     257159 :                 *p='\0';
     264                 :     257159 :                 BIO_gets(in, p, CONFBUFSIZE-1);
     265                 :     257159 :                 p[CONFBUFSIZE-1]='\0';
     266                 :     257159 :                 ii=i=strlen(p);
     267         [ +  + ]:     257159 :                 if (i == 0 && !again) break;
     268                 :            :                 again=0;
     269         [ +  + ]:     512776 :                 while (i > 0)
     270                 :            :                         {
     271         [ +  + ]:     449190 :                         if ((p[i-1] != '\r') && (p[i-1] != '\n'))
     272                 :            :                                 break;
     273                 :            :                         else
     274                 :     256388 :                                 i--;
     275                 :            :                         }
     276                 :            :                 /* we removed some trailing stuff so there is a new
     277                 :            :                  * line on the end. */
     278         [ +  - ]:     256388 :                 if (ii && i == ii)
     279                 :            :                         again=1; /* long line */
     280                 :            :                 else
     281                 :            :                         {
     282                 :     256388 :                         p[i]='\0';
     283                 :     256388 :                         eline++; /* another input line */
     284                 :            :                         }
     285                 :            : 
     286                 :            :                 /* we now have a line with trailing \r\n removed */
     287                 :            : 
     288                 :            :                 /* i is the number of bytes */
     289                 :     256388 :                 bufnum+=i;
     290                 :            : 
     291                 :     256388 :                 v=NULL;
     292                 :            :                 /* check for line continuation */
     293         [ +  + ]:     256388 :                 if (bufnum >= 1)
     294                 :            :                         {
     295                 :            :                         /* If we have bytes and the last char '\\' and
     296                 :            :                          * second last char is not '\\' */
     297                 :     192802 :                         p= &(buff->data[bufnum-1]);
     298 [ -  + ][ #  # ]:     192802 :                         if (IS_ESC(conf,p[0]) &&
     299         [ #  # ]:          0 :                                 ((bufnum <= 1) || !IS_ESC(conf,p[-1])))
     300                 :            :                                 {
     301                 :          0 :                                 bufnum--;
     302                 :          0 :                                 again=1;
     303                 :            :                                 }
     304                 :            :                         }
     305         [ -  + ]:     256388 :                 if (again) continue;
     306                 :     256388 :                 bufnum=0;
     307                 :     256388 :                 buf=buff->data;
     308                 :            : 
     309                 :     256388 :                 clear_comments(conf, buf);
     310                 :     256388 :                 s=eat_ws(conf, buf);
     311         [ +  + ]:     256388 :                 if (IS_EOF(conf,*s)) continue; /* blank line */
     312         [ +  + ]:      81427 :                 if (*s == '[')
     313                 :            :                         {
     314                 :            :                         char *ss;
     315                 :            : 
     316                 :      11354 :                         s++;
     317                 :      11354 :                         start=eat_ws(conf, s);
     318                 :      11354 :                         ss=start;
     319                 :            : again:
     320                 :      11354 :                         end=eat_alpha_numeric(conf, ss);
     321                 :      11354 :                         p=eat_ws(conf, end);
     322         [ -  + ]:      11354 :                         if (*p != ']')
     323                 :            :                                 {
     324 [ #  # ][ #  # ]:          0 :                                 if (*p != '\0' && ss != p)
     325                 :            :                                         {
     326                 :            :                                         ss=p;
     327                 :            :                                         goto again;
     328                 :            :                                         }
     329                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     330                 :            :                                         CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
     331                 :          0 :                                 goto err;
     332                 :            :                                 }
     333                 :      11354 :                         *end='\0';
     334         [ +  - ]:      11354 :                         if (!str_copy(conf,NULL,&section,start)) goto err;
     335         [ +  - ]:      11354 :                         if ((sv=_CONF_get_section(conf,section)) == NULL)
     336                 :      11354 :                                 sv=_CONF_new_section(conf,section);
     337         [ -  + ]:      11354 :                         if (sv == NULL)
     338                 :            :                                 {
     339                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     340                 :            :                                         CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
     341                 :          0 :                                 goto err;
     342                 :            :                                 }
     343                 :      11354 :                         continue;
     344                 :            :                         }
     345                 :            :                 else
     346                 :            :                         {
     347                 :      70073 :                         pname=s;
     348                 :      70073 :                         psection=NULL;
     349                 :      70073 :                         end=eat_alpha_numeric(conf, s);
     350 [ -  + ][ #  # ]:      70073 :                         if ((end[0] == ':') && (end[1] == ':'))
     351                 :            :                                 {
     352                 :          0 :                                 *end='\0';
     353                 :          0 :                                 end+=2;
     354                 :          0 :                                 psection=pname;
     355                 :          0 :                                 pname=end;
     356                 :          0 :                                 end=eat_alpha_numeric(conf, end);
     357                 :            :                                 }
     358                 :      70073 :                         p=eat_ws(conf, end);
     359         [ -  + ]:      70073 :                         if (*p != '=')
     360                 :            :                                 {
     361                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     362                 :            :                                                 CONF_R_MISSING_EQUAL_SIGN);
     363                 :          0 :                                 goto err;
     364                 :            :                                 }
     365                 :      70073 :                         *end='\0';
     366                 :      70073 :                         p++;
     367                 :      70073 :                         start=eat_ws(conf, p);
     368         [ +  + ]:    1054990 :                         while (!IS_EOF(conf,*p))
     369                 :     984917 :                                 p++;
     370                 :      70073 :                         p--;
     371 [ +  + ][ +  + ]:     114603 :                         while ((p != start) && (IS_WS(conf,*p)))
     372                 :      44530 :                                 p--;
     373                 :      70073 :                         p++;
     374                 :      70073 :                         *p='\0';
     375                 :            : 
     376         [ -  + ]:      70073 :                         if (!(v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE))))
     377                 :            :                                 {
     378                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     379                 :            :                                                         ERR_R_MALLOC_FAILURE);
     380                 :          0 :                                 goto err;
     381                 :            :                                 }
     382         [ +  - ]:      70073 :                         if (psection == NULL) psection=section;
     383                 :      70073 :                         v->name=(char *)OPENSSL_malloc(strlen(pname)+1);
     384                 :      70073 :                         v->value=NULL;
     385         [ -  + ]:      70073 :                         if (v->name == NULL)
     386                 :            :                                 {
     387                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     388                 :            :                                                         ERR_R_MALLOC_FAILURE);
     389                 :          0 :                                 goto err;
     390                 :            :                                 }
     391                 :      70073 :                         BUF_strlcpy(v->name,pname,strlen(pname)+1);
     392         [ +  - ]:      70073 :                         if (!str_copy(conf,psection,&(v->value),start)) goto err;
     393                 :            : 
     394         [ -  + ]:      70073 :                         if (strcmp(psection,section) != 0)
     395                 :            :                                 {
     396         [ #  # ]:          0 :                                 if ((tv=_CONF_get_section(conf,psection))
     397                 :            :                                         == NULL)
     398                 :          0 :                                         tv=_CONF_new_section(conf,psection);
     399         [ #  # ]:          0 :                                 if (tv == NULL)
     400                 :            :                                         {
     401                 :          0 :                                         CONFerr(CONF_F_DEF_LOAD_BIO,
     402                 :            :                                            CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
     403                 :          0 :                                         goto err;
     404                 :            :                                         }
     405                 :            :                                 }
     406                 :            :                         else
     407                 :            :                                 tv=sv;
     408                 :            : #if 1
     409         [ +  - ]:      70073 :                         if (_CONF_add_string(conf, tv, v) == 0)
     410                 :            :                                 {
     411                 :          0 :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     412                 :            :                                                         ERR_R_MALLOC_FAILURE);
     413                 :          0 :                                 goto err;
     414                 :            :                                 }
     415                 :            : #else
     416                 :            :                         v->section=tv->section;   
     417                 :            :                         if (!sk_CONF_VALUE_push(ts,v))
     418                 :            :                                 {
     419                 :            :                                 CONFerr(CONF_F_DEF_LOAD_BIO,
     420                 :            :                                                         ERR_R_MALLOC_FAILURE);
     421                 :            :                                 goto err;
     422                 :            :                                 }
     423                 :            :                         vv=(CONF_VALUE *)lh_insert(conf->data,v);
     424                 :            :                         if (vv != NULL)
     425                 :            :                                 {
     426                 :            :                                 sk_CONF_VALUE_delete_ptr(ts,vv);
     427                 :            :                                 OPENSSL_free(vv->name);
     428                 :            :                                 OPENSSL_free(vv->value);
     429                 :            :                                 OPENSSL_free(vv);
     430                 :            :                                 }
     431                 :            : #endif
     432                 :            :                         v=NULL;
     433                 :            :                         }
     434                 :            :                 }
     435         [ +  - ]:        771 :         if (buff != NULL) BUF_MEM_free(buff);
     436         [ +  - ]:        771 :         if (section != NULL) OPENSSL_free(section);
     437                 :            :         return(1);
     438                 :            : err:
     439         [ #  # ]:          0 :         if (buff != NULL) BUF_MEM_free(buff);
     440         [ #  # ]:          0 :         if (section != NULL) OPENSSL_free(section);
     441         [ #  # ]:          0 :         if (line != NULL) *line=eline;
     442                 :          0 :         BIO_snprintf(btmp,sizeof btmp,"%ld",eline);
     443                 :          0 :         ERR_add_error_data(2,"line ",btmp);
     444 [ #  # ][ #  # ]:          0 :         if ((h != conf->data) && (conf->data != NULL))
     445                 :            :                 {
     446                 :          0 :                 CONF_free(conf->data);
     447                 :          0 :                 conf->data=NULL;
     448                 :            :                 }
     449         [ #  # ]:          0 :         if (v != NULL)
     450                 :            :                 {
     451         [ #  # ]:          0 :                 if (v->name != NULL) OPENSSL_free(v->name);
     452         [ #  # ]:          0 :                 if (v->value != NULL) OPENSSL_free(v->value);
     453         [ #  # ]:          0 :                 if (v != NULL) OPENSSL_free(v);
     454                 :            :                 }
     455                 :            :         return(0);
     456                 :            :         }
     457                 :            : 
     458                 :     512776 : static void clear_comments(CONF *conf, char *p)
     459                 :            :         {
     460                 :            :         for (;;)
     461                 :            :                 {
     462         [ -  + ]:     284620 :                 if (IS_FCOMMENT(conf,*p))
     463                 :            :                         {
     464                 :          0 :                         *p='\0';
     465                 :            :                         return;
     466                 :            :                         }
     467         [ +  + ]:     284620 :                 if (!IS_WS(conf,*p))
     468                 :            :                         {
     469                 :            :                         break;
     470                 :            :                         }
     471                 :    2212605 :                 p++;
     472                 :            :                 }
     473                 :            : 
     474                 :            :         for (;;)
     475                 :            :                 {
     476         [ +  + ]:    2440761 :                 if (IS_COMMENT(conf,*p))
     477                 :            :                         {
     478                 :     137839 :                         *p='\0';
     479                 :            :                         return;
     480                 :            :                         }
     481         [ -  + ]:    2302922 :                 if (IS_DQUOTE(conf,*p))
     482                 :            :                         {
     483                 :          0 :                         p=scan_dquote(conf, p);
     484                 :          0 :                         continue;
     485                 :            :                         }
     486         [ +  + ]:    2302922 :                 if (IS_QUOTE(conf,*p))
     487                 :            :                         {
     488                 :       1416 :                         p=scan_quote(conf, p);
     489                 :       1416 :                         continue;
     490                 :            :                         }
     491         [ -  + ]:    2301506 :                 if (IS_ESC(conf,*p))
     492                 :            :                         {
     493         [ #  # ]:          0 :                         p=scan_esc(conf,p);
     494                 :          0 :                         continue;
     495                 :            :                         }
     496         [ +  + ]:    2301506 :                 if (IS_EOF(conf,*p))
     497                 :            :                         return;
     498                 :            :                 else
     499                 :    2182957 :                         p++;
     500                 :            :                 }
     501                 :            :         }
     502                 :            : 
     503                 :      81427 : static int str_copy(CONF *conf, char *section, char **pto, char *from)
     504                 :            :         {
     505                 :      81427 :         int q,r,rr=0,to=0,len=0;
     506                 :            :         char *s,*e,*rp,*p,*rrp,*np,*cp,v;
     507                 :            :         BUF_MEM *buf;
     508                 :            : 
     509         [ +  - ]:      81427 :         if ((buf=BUF_MEM_new()) == NULL) return(0);
     510                 :            : 
     511                 :      81427 :         len=strlen(from)+1;
     512         [ +  - ]:     982225 :         if (!BUF_MEM_grow(buf,len)) goto err;
     513                 :            : 
     514                 :            :         for (;;)
     515                 :            :                 {
     516         [ +  + ]:     982225 :                 if (IS_QUOTE(conf,*from))
     517                 :            :                         {
     518                 :       1416 :                         q= *from;
     519                 :       1416 :                         from++;
     520 [ +  - ][ +  + ]:      42480 :                         while (!IS_EOF(conf,*from) && (*from != q))
     521                 :            :                                 {
     522         [ -  + ]:      41064 :                                 if (IS_ESC(conf,*from))
     523                 :            :                                         {
     524                 :          0 :                                         from++;
     525         [ #  # ]:          0 :                                         if (IS_EOF(conf,*from)) break;
     526                 :            :                                         }
     527                 :      41064 :                                 buf->data[to++]= *(from++);
     528                 :            :                                 }
     529         [ -  + ]:       1416 :                         if (*from == q) from++;
     530                 :            :                         }
     531         [ -  + ]:     980809 :                 else if (IS_DQUOTE(conf,*from))
     532                 :            :                         {
     533                 :          0 :                         q= *from;
     534                 :          0 :                         from++;
     535         [ #  # ]:          0 :                         while (!IS_EOF(conf,*from))
     536                 :            :                                 {
     537         [ #  # ]:          0 :                                 if (*from == q)
     538                 :            :                                         {
     539         [ #  # ]:          0 :                                         if (*(from+1) == q)
     540                 :            :                                                 {
     541                 :          0 :                                                 from++;
     542                 :            :                                                 }
     543                 :            :                                         else
     544                 :            :                                                 {
     545                 :            :                                                 break;
     546                 :            :                                                 }
     547                 :            :                                         }
     548                 :          0 :                                 buf->data[to++]= *(from++);
     549                 :            :                                 }
     550         [ #  # ]:          0 :                         if (*from == q) from++;
     551                 :            :                         }
     552         [ -  + ]:     980809 :                 else if (IS_ESC(conf,*from))
     553                 :            :                         {
     554                 :          0 :                         from++;
     555                 :          0 :                         v= *(from++);
     556         [ #  # ]:          0 :                         if (IS_EOF(conf,v)) break;
     557         [ #  # ]:          0 :                         else if (v == 'r') v='\r';
     558         [ #  # ]:          0 :                         else if (v == 'n') v='\n';
     559         [ #  # ]:          0 :                         else if (v == 'b') v='\b';
     560         [ #  # ]:          0 :                         else if (v == 't') v='\t';
     561                 :          0 :                         buf->data[to++]= v;
     562                 :            :                         }
     563         [ +  + ]:     980809 :                 else if (IS_EOF(conf,*from))
     564                 :            :                         break;
     565         [ +  + ]:     899382 :                 else if (*from == '$')
     566                 :            :                         {
     567                 :            :                         /* try to expand it */
     568                 :      11490 :                         rrp=NULL;
     569                 :      11490 :                         s= &(from[1]);
     570         [ +  - ]:      11490 :                         if (*s == '{')
     571                 :            :                                 q='}';
     572         [ +  - ]:      11490 :                         else if (*s == '(')
     573                 :            :                                 q=')';
     574                 :      11490 :                         else q=0;
     575                 :            : 
     576         [ -  + ]:      11490 :                         if (q) s++;
     577                 :      11490 :                         cp=section;
     578                 :      11490 :                         e=np=s;
     579         [ +  + ]:      45960 :                         while (IS_ALPHA_NUMERIC(conf,*e))
     580                 :      34470 :                                 e++;
     581 [ +  + ][ +  - ]:      11490 :                         if ((e[0] == ':') && (e[1] == ':'))
     582                 :            :                                 {
     583                 :        804 :                                 cp=np;
     584                 :        804 :                                 rrp=e;
     585                 :        804 :                                 rr= *e;
     586                 :        804 :                                 *rrp='\0';
     587                 :        804 :                                 e+=2;
     588                 :        804 :                                 np=e;
     589         [ +  + ]:       4260 :                                 while (IS_ALPHA_NUMERIC(conf,*e))
     590                 :       3456 :                                         e++;
     591                 :            :                                 }
     592                 :      11490 :                         r= *e;
     593                 :      11490 :                         *e='\0';
     594                 :      11490 :                         rp=e;
     595         [ -  + ]:      11490 :                         if (q)
     596                 :            :                                 {
     597         [ #  # ]:          0 :                                 if (r != q)
     598                 :            :                                         {
     599                 :          0 :                                         CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE);
     600                 :          0 :                                         goto err;
     601                 :            :                                         }
     602                 :          0 :                                 e++;
     603                 :            :                                 }
     604                 :            :                         /* So at this point we have
     605                 :            :                          * np which is the start of the name string which is
     606                 :            :                          *   '\0' terminated. 
     607                 :            :                          * cp which is the start of the section string which is
     608                 :            :                          *   '\0' terminated.
     609                 :            :                          * e is the 'next point after'.
     610                 :            :                          * r and rr are the chars replaced by the '\0'
     611                 :            :                          * rp and rrp is where 'r' and 'rr' came from.
     612                 :            :                          */
     613                 :      11490 :                         p=_CONF_get_string(conf,cp,np);
     614         [ +  + ]:      11490 :                         if (rrp != NULL) *rrp=rr;
     615                 :      11490 :                         *rp=r;
     616         [ -  + ]:      11490 :                         if (p == NULL)
     617                 :            :                                 {
     618                 :          0 :                                 CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);
     619                 :          0 :                                 goto err;
     620                 :            :                                 }
     621                 :      11490 :                         BUF_MEM_grow_clean(buf,(strlen(p)+buf->length-(e-from)));
     622         [ +  + ]:     101188 :                         while (*p)
     623                 :      89698 :                                 buf->data[to++]= *(p++);
     624                 :            : 
     625                 :            :                         /* Since we change the pointer 'from', we also have
     626                 :            :                            to change the perceived length of the string it
     627                 :            :                            points at.  /RL */
     628                 :      11490 :                         len -= e-from;
     629                 :      11490 :                         from=e;
     630                 :            : 
     631                 :            :                         /* In case there were no braces or parenthesis around
     632                 :            :                            the variable reference, we have to put back the
     633                 :            :                            character that was replaced with a '\0'.  /RL */
     634                 :      11490 :                         *rp = r;
     635                 :            :                         }
     636                 :            :                 else
     637                 :     887892 :                         buf->data[to++]= *(from++);
     638                 :            :                 }
     639                 :      81427 :         buf->data[to]='\0';
     640         [ +  + ]:      81427 :         if (*pto != NULL) OPENSSL_free(*pto);
     641                 :      81427 :         *pto=buf->data;
     642                 :      81427 :         OPENSSL_free(buf);
     643                 :      81427 :         return(1);
     644                 :            : err:
     645         [ #  # ]:          0 :         if (buf != NULL) BUF_MEM_free(buf);
     646                 :            :         return(0);
     647                 :            :         }
     648                 :            : 
     649                 :     838484 : static char *eat_ws(CONF *conf, char *p)
     650                 :            :         {
     651         [ +  + ]:     636813 :         while (IS_WS(conf,*p) && (!IS_EOF(conf,*p)))
     652                 :     217571 :                 p++;
     653                 :     419242 :         return(p);
     654                 :            :         }
     655                 :            : 
     656                 :    1185232 : static char *eat_alpha_numeric(CONF *conf, char *p)
     657                 :            :         {
     658                 :            :         for (;;)
     659                 :            :                 {
     660         [ -  + ]:    1103805 :                 if (IS_ESC(conf,*p))
     661                 :            :                         {
     662         [ #  # ]:          0 :                         p=scan_esc(conf,p);
     663                 :          0 :                         continue;
     664                 :            :                         }
     665         [ +  + ]:    1103805 :                 if (!IS_ALPHA_NUMERIC_PUNCT(conf,*p))
     666                 :      81427 :                         return(p);
     667                 :    1022378 :                 p++;
     668                 :            :                 }
     669                 :            :         }
     670                 :            : 
     671                 :       2832 : static char *scan_quote(CONF *conf, char *p)
     672                 :            :         {
     673                 :       1416 :         int q= *p;
     674                 :            : 
     675                 :       1416 :         p++;
     676 [ +  - ][ +  + ]:      42480 :         while (!(IS_EOF(conf,*p)) && (*p != q))
     677                 :            :                 {
     678         [ -  + ]:      41064 :                 if (IS_ESC(conf,*p))
     679                 :            :                         {
     680                 :          0 :                         p++;
     681         [ #  # ]:          0 :                         if (IS_EOF(conf,*p)) return(p);
     682                 :            :                         }
     683                 :      41064 :                 p++;
     684                 :            :                 }
     685         [ +  - ]:       1416 :         if (*p == q) p++;
     686                 :            :         return(p);
     687                 :            :         }
     688                 :            : 
     689                 :            : 
     690                 :          0 : static char *scan_dquote(CONF *conf, char *p)
     691                 :            :         {
     692                 :          0 :         int q= *p;
     693                 :            : 
     694                 :          0 :         p++;
     695         [ #  # ]:          0 :         while (!(IS_EOF(conf,*p)))
     696                 :            :                 {
     697         [ #  # ]:          0 :                 if (*p == q)
     698                 :            :                         {
     699         [ #  # ]:          0 :                         if (*(p+1) == q)
     700                 :            :                                 {
     701                 :          0 :                                 p++;
     702                 :            :                                 }
     703                 :            :                         else
     704                 :            :                                 {
     705                 :            :                                 break;
     706                 :            :                                 }
     707                 :            :                         }
     708                 :          0 :                 p++;
     709                 :            :                 }
     710         [ #  # ]:          0 :         if (*p == q) p++;
     711                 :          0 :         return(p);
     712                 :            :         }
     713                 :            : 
     714                 :          0 : static void dump_value_doall_arg(CONF_VALUE *a, BIO *out)
     715                 :            :         {
     716         [ #  # ]:          0 :         if (a->name)
     717                 :          0 :                 BIO_printf(out, "[%s] %s=%s\n", a->section, a->name, a->value);
     718                 :            :         else
     719                 :          0 :                 BIO_printf(out, "[[%s]]\n", a->section);
     720                 :          0 :         }
     721                 :            : 
     722                 :          0 : static IMPLEMENT_LHASH_DOALL_ARG_FN(dump_value, CONF_VALUE, BIO)
     723                 :            : 
     724                 :          0 : static int def_dump(const CONF *conf, BIO *out)
     725                 :            :         {
     726                 :          0 :         lh_CONF_VALUE_doall_arg(conf->data, LHASH_DOALL_ARG_FN(dump_value),
     727                 :            :                                 BIO, out);
     728                 :          0 :         return 1;
     729                 :            :         }
     730                 :            : 
     731                 :         54 : static int def_is_number(const CONF *conf, char c)
     732                 :            :         {
     733                 :         54 :         return IS_NUMBER(conf,c);
     734                 :            :         }
     735                 :            : 
     736                 :         43 : static int def_to_int(const CONF *conf, char c)
     737                 :            :         {
     738                 :         43 :         return c - '0';
     739                 :            :         }
     740                 :            : 

Generated by: LCOV version 1.9