1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/conf/conf.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Part of the code in here was originally in conf.c, which is now removed */
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/stack.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf_api.h>
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "conf_def.h"
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/buffer.h>
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *eat_ws(CONF *conf, char *p);
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *eat_alpha_numeric(CONF *conf, char *p);
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void clear_comments(CONF *conf, char *p);
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int str_copy(CONF *conf,char *section,char **to, char *from);
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *scan_quote(CONF *conf, char *p);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *scan_dquote(CONF *conf, char *p);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define scan_esc(conf,p)	(((IS_EOF((conf),(p)[1]))?((p)+1):((p)+2)))
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic CONF *def_create(CONF_METHOD *meth);
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_init_default(CONF *conf);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_init_WIN32(CONF *conf);
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_destroy(CONF *conf);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_destroy_data(CONF *conf);
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_load(CONF *conf, const char *name, long *eline);
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_load_bio(CONF *conf, BIO *bp, long *eline);
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_dump(const CONF *conf, BIO *bp);
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_is_number(const CONF *conf, char c);
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_to_int(const CONF *conf, char c);
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char CONF_def_version[]="CONF_def" OPENSSL_VERSION_PTEXT;
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic CONF_METHOD default_method = {
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"OpenSSL default",
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_create,
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_init_default,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_destroy,
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_destroy_data,
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_load_bio,
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_dump,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_is_number,
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_to_int,
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_load
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic CONF_METHOD WIN32_method = {
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"WIN32",
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_create,
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_init_WIN32,
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_destroy,
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_destroy_data,
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_load_bio,
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_dump,
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_is_number,
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_to_int,
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	def_load
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCONF_METHOD *NCONF_default()
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &default_method;
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCONF_METHOD *NCONF_WIN32()
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &WIN32_method;
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic CONF *def_create(CONF_METHOD *meth)
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF *ret;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = OPENSSL_malloc(sizeof(CONF) + sizeof(unsigned short *));
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret)
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (meth->init(ret) == 0)
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OPENSSL_free(ret);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = NULL;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_init_default(CONF *conf)
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->meth = &default_method;
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	conf->meth_data = CONF_type_default;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->data = NULL;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_init_WIN32(CONF *conf)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->meth = &WIN32_method;
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->meth_data = (void *)CONF_type_win32;
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->data = NULL;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_destroy(CONF *conf)
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (def_destroy_data(conf))
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(conf);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_destroy_data(CONF *conf)
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_CONF_free_data(conf);
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_load(CONF *conf, const char *name, long *line)
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *in=NULL;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	in=BIO_new_file(name, "r");
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	in=BIO_new_file(name, "rb");
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (in == NULL)
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ERR_GET_REASON(ERR_peek_last_error()) == BIO_R_NO_SUCH_FILE)
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CONFerr(CONF_F_DEF_LOAD,CONF_R_NO_SUCH_FILE);
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CONFerr(CONF_F_DEF_LOAD,ERR_R_SYS_LIB);
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = def_load_bio(conf, in, line);
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(in);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_load_bio(CONF *conf, BIO *in, long *line)
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The macro BUFSIZE conflicts with a system macro in VxWorks */
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define CONFBUFSIZE	512
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int bufnum=0,i,ii;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM *buff=NULL;
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *s,*p,*end;
21643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	int again;
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long eline=0;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char btmp[DECIMAL_SIZE(eline)+1];
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *v=NULL,*tv;
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *sv=NULL;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *section=NULL,*buf;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *start,*psection,*pname;
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *h = (void *)(conf->data);
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((buff=BUF_MEM_new()) == NULL)
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_BUF_LIB);
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	section=(char *)OPENSSL_malloc(10);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (section == NULL)
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_strlcpy(section,"default",10);
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (_CONF_new_data(conf) == 0)
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv=_CONF_new_section(conf,section);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sv == NULL)
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_DEF_LOAD_BIO,
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bufnum=0;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	again=0;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!BUF_MEM_grow(buff,bufnum+CONFBUFSIZE))
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CONFerr(CONF_F_DEF_LOAD_BIO,ERR_R_BUF_LIB);
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p= &(buff->data[bufnum]);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*p='\0';
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_gets(in, p, CONFBUFSIZE-1);
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p[CONFBUFSIZE-1]='\0';
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ii=i=strlen(p);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == 0 && !again) break;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		again=0;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (i > 0)
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((p[i-1] != '\r') && (p[i-1] != '\n'))
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i--;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* we removed some trailing stuff so there is a new
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * line on the end. */
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ii && i == ii)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			again=1; /* long line */
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p[i]='\0';
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			eline++; /* another input line */
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* we now have a line with trailing \r\n removed */
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* i is the number of bytes */
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufnum+=i;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		v=NULL;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* check for line continuation */
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (bufnum >= 1)
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* If we have bytes and the last char '\\' and
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * second last char is not '\\' */
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p= &(buff->data[bufnum-1]);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (IS_ESC(conf,p[0]) &&
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				((bufnum <= 1) || !IS_ESC(conf,p[-1])))
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				bufnum--;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				again=1;
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (again) continue;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufnum=0;
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf=buff->data;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		clear_comments(conf, buf);
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=eat_ws(conf, buf);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_EOF(conf,*s)) continue; /* blank line */
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*s == '[')
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			char *ss;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s++;
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			start=eat_ws(conf, s);
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ss=start;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectagain:
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			end=eat_alpha_numeric(conf, ss);
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=eat_ws(conf, end);
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*p != ']')
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (*p != '\0')
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ss=p;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto again;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*end='\0';
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!str_copy(conf,NULL,&section,start)) goto err;
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((sv=_CONF_get_section(conf,section)) == NULL)
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sv=_CONF_new_section(conf,section);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (sv == NULL)
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			pname=s;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			psection=NULL;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			end=eat_alpha_numeric(conf, s);
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((end[0] == ':') && (end[1] == ':'))
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*end='\0';
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				end+=2;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				psection=pname;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				pname=end;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				end=eat_alpha_numeric(conf, end);
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=eat_ws(conf, end);
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*p != '=')
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						CONF_R_MISSING_EQUAL_SIGN);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*end='\0';
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			start=eat_ws(conf, p);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (!IS_EOF(conf,*p))
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p++;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p--;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while ((p != start) && (IS_WS(conf,*p)))
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p--;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE))))
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							ERR_R_MALLOC_FAILURE);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (psection == NULL) psection=section;
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			v->name=(char *)OPENSSL_malloc(strlen(pname)+1);
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			v->value=NULL;
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (v->name == NULL)
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							ERR_R_MALLOC_FAILURE);
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BUF_strlcpy(v->name,pname,strlen(pname)+1);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!str_copy(conf,psection,&(v->value),start)) goto err;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strcmp(psection,section) != 0)
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((tv=_CONF_get_section(conf,psection))
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					== NULL)
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv=_CONF_new_section(conf,psection);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (tv == NULL)
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CONFerr(CONF_F_DEF_LOAD_BIO,
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					   CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tv=sv;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 1
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (_CONF_add_string(conf, tv, v) == 0)
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							ERR_R_MALLOC_FAILURE);
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			v->section=tv->section;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!sk_CONF_VALUE_push(ts,v))
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_DEF_LOAD_BIO,
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							ERR_R_MALLOC_FAILURE);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			vv=(CONF_VALUE *)lh_insert(conf->data,v);
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (vv != NULL)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sk_CONF_VALUE_delete_ptr(ts,vv);
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(vv->name);
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(vv->value);
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(vv);
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			v=NULL;
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (buff != NULL) BUF_MEM_free(buff);
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (section != NULL) OPENSSL_free(section);
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (buff != NULL) BUF_MEM_free(buff);
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (section != NULL) OPENSSL_free(section);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (line != NULL) *line=eline;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_snprintf(btmp,sizeof btmp,"%ld",eline);
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ERR_add_error_data(2,"line ",btmp);
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((h != conf->data) && (conf->data != NULL))
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF_free(conf->data);
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		conf->data=NULL;
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (v != NULL)
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v->name != NULL) OPENSSL_free(v->name);
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v->value != NULL) OPENSSL_free(v->value);
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v != NULL) OPENSSL_free(v);
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void clear_comments(CONF *conf, char *p)
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_FCOMMENT(conf,*p))
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return;
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!IS_WS(conf,*p))
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p++;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_COMMENT(conf,*p))
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return;
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_DQUOTE(conf,*p))
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=scan_dquote(conf, p);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_QUOTE(conf,*p))
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=scan_quote(conf, p);
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_ESC(conf,*p))
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=scan_esc(conf,p);
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_EOF(conf,*p))
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return;
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int str_copy(CONF *conf, char *section, char **pto, char *from)
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int q,r,rr=0,to=0,len=0;
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *s,*e,*rp,*p,*rrp,*np,*cp,v;
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM *buf;
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((buf=BUF_MEM_new()) == NULL) return(0);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=strlen(from)+1;
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!BUF_MEM_grow(buf,len)) goto err;
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_QUOTE(conf,*from))
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			q= *from;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			from++;
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (!IS_EOF(conf,*from) && (*from != q))
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (IS_ESC(conf,*from))
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					from++;
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (IS_EOF(conf,*from)) break;
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf->data[to++]= *(from++);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*from == q) from++;
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (IS_DQUOTE(conf,*from))
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			q= *from;
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			from++;
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (!IS_EOF(conf,*from))
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (*from == q)
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (*(from+1) == q)
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						from++;
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						break;
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf->data[to++]= *(from++);
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*from == q) from++;
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (IS_ESC(conf,*from))
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			from++;
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			v= *(from++);
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (IS_EOF(conf,v)) break;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (v == 'r') v='\r';
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (v == 'n') v='\n';
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (v == 'b') v='\b';
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (v == 't') v='\t';
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf->data[to++]= v;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (IS_EOF(conf,*from))
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (*from == '$')
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* try to expand it */
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rrp=NULL;
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s= &(from[1]);
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*s == '{')
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				q='}';
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (*s == '(')
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				q=')';
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else q=0;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (q) s++;
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cp=section;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			e=np=s;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (IS_ALPHA_NUMERIC(conf,*e))
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				e++;
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((e[0] == ':') && (e[1] == ':'))
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cp=np;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rrp=e;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rr= *e;
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*rrp='\0';
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				e+=2;
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				np=e;
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				while (IS_ALPHA_NUMERIC(conf,*e))
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					e++;
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			r= *e;
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*e='\0';
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rp=e;
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (q)
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (r != q)
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE);
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				e++;
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* So at this point we have
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * np which is the start of the name string which is
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 *   '\0' terminated.
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * cp which is the start of the section string which is
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 *   '\0' terminated.
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * e is the 'next point after'.
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * r and rr are the chars replaced by the '\0'
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * rp and rrp is where 'r' and 'rr' came from.
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=_CONF_get_string(conf,cp,np);
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (rrp != NULL) *rrp=rr;
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*rp=r;
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (p == NULL)
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BUF_MEM_grow_clean(buf,(strlen(p)+buf->length-(e-from)));
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (*p)
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf->data[to++]= *(p++);
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Since we change the pointer 'from', we also have
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   to change the perceived length of the string it
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   points at.  /RL */
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len -= e-from;
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			from=e;
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* In case there were no braces or parenthesis around
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   the variable reference, we have to put back the
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   character that was replaced with a '\0'.  /RL */
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*rp = r;
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf->data[to++]= *(from++);
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	buf->data[to]='\0';
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*pto != NULL) OPENSSL_free(*pto);
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*pto=buf->data;
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(buf);
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (buf != NULL) BUF_MEM_free(buf);
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *eat_ws(CONF *conf, char *p)
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (IS_WS(conf,*p) && (!IS_EOF(conf,*p)))
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p++;
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(p);
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *eat_alpha_numeric(CONF *conf, char *p)
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_ESC(conf,*p))
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p=scan_esc(conf,p);
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!IS_ALPHA_NUMERIC_PUNCT(conf,*p))
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(p);
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p++;
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *scan_quote(CONF *conf, char *p)
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int q= *p;
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p++;
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (!(IS_EOF(conf,*p)) && (*p != q))
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (IS_ESC(conf,*p))
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (IS_EOF(conf,*p)) return(p);
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p++;
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*p == q) p++;
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(p);
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *scan_dquote(CONF *conf, char *p)
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int q= *p;
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p++;
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (!(IS_EOF(conf,*p)))
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*p == q)
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*(p+1) == q)
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p++;
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p++;
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*p == q) p++;
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(p);
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void dump_value_doall_arg(CONF_VALUE *a, BIO *out)
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->name)
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "[%s] %s=%s\n", a->section, a->name, a->value);
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "[[%s]]\n", a->section);
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_ARG_FN(dump_value, CONF_VALUE, BIO)
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_dump(const CONF *conf, BIO *out)
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_CONF_VALUE_doall_arg(conf->data, LHASH_DOALL_ARG_FN(dump_value),
727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				BIO, out);
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_is_number(const CONF *conf, char c)
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return IS_NUMBER(conf,c);
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int def_to_int(const CONF *conf, char c)
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return c - '0';
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741