]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/conf/conf_api.c
2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* Part of the code in here was originally in conf.c, which is now removed */
13 #include "internal/cryptlib.h"
16 #include <openssl/conf.h>
17 #include <openssl/conf_api.h>
19 static void value_free_hash(const CONF_VALUE
*a
, LHASH_OF(CONF_VALUE
) *conf
);
20 static void value_free_stack_doall(CONF_VALUE
*a
);
22 CONF_VALUE
*_CONF_get_section(const CONF
*conf
, const char *section
)
26 if (conf
== NULL
|| section
== NULL
)
29 vv
.section
= (char *)section
;
30 return conf
->data
!= NULL
? lh_CONF_VALUE_retrieve(conf
->data
, &vv
) : NULL
;
33 STACK_OF(CONF_VALUE
) *_CONF_get_section_values(const CONF
*conf
,
38 v
= _CONF_get_section(conf
, section
);
41 return ((STACK_OF(CONF_VALUE
) *)v
->value
);
44 int _CONF_add_string(CONF
*conf
, CONF_VALUE
*section
, CONF_VALUE
*value
)
47 STACK_OF(CONF_VALUE
) *ts
;
49 ts
= (STACK_OF(CONF_VALUE
) *)section
->value
;
51 value
->section
= section
->section
;
52 if (!sk_CONF_VALUE_push(ts
, value
))
55 v
= lh_CONF_VALUE_insert(conf
->data
, value
);
57 (void)sk_CONF_VALUE_delete_ptr(ts
, v
);
58 OPENSSL_free(v
->name
);
59 OPENSSL_free(v
->value
);
65 char *_CONF_get_string(const CONF
*conf
, const char *section
,
74 return ossl_safe_getenv(name
);
75 if (conf
->data
== NULL
)
77 if (section
!= NULL
) {
78 vv
.name
= (char *)name
;
79 vv
.section
= (char *)section
;
80 v
= lh_CONF_VALUE_retrieve(conf
->data
, &vv
);
83 if (strcmp(section
, "ENV") == 0) {
84 p
= ossl_safe_getenv(name
);
89 vv
.section
= "default";
90 vv
.name
= (char *)name
;
91 v
= lh_CONF_VALUE_retrieve(conf
->data
, &vv
);
97 static unsigned long conf_value_hash(const CONF_VALUE
*v
)
99 return (OPENSSL_LH_strhash(v
->section
) << 2) ^ OPENSSL_LH_strhash(v
->name
);
102 static int conf_value_cmp(const CONF_VALUE
*a
, const CONF_VALUE
*b
)
106 if (a
->section
!= b
->section
) {
107 i
= strcmp(a
->section
, b
->section
);
112 if (a
->name
!= NULL
&& b
->name
!= NULL
)
113 return strcmp(a
->name
, b
->name
);
114 if (a
->name
== b
->name
)
116 return (a
->name
== NULL
) ? -1 : 1;
119 int _CONF_new_data(CONF
*conf
)
123 if (conf
->data
== NULL
) {
124 conf
->data
= lh_CONF_VALUE_new(conf_value_hash
, conf_value_cmp
);
125 if (conf
->data
== NULL
)
131 typedef LHASH_OF(CONF_VALUE
) LH_CONF_VALUE
;
133 IMPLEMENT_LHASH_DOALL_ARG_CONST(CONF_VALUE
, LH_CONF_VALUE
);
135 void _CONF_free_data(CONF
*conf
)
137 if (conf
== NULL
|| conf
->data
== NULL
)
140 /* evil thing to make sure the 'OPENSSL_free()' works as expected */
141 lh_CONF_VALUE_set_down_load(conf
->data
, 0);
142 lh_CONF_VALUE_doall_LH_CONF_VALUE(conf
->data
, value_free_hash
, conf
->data
);
145 * We now have only 'section' entries in the hash table. Due to problems
149 lh_CONF_VALUE_doall(conf
->data
, value_free_stack_doall
);
150 lh_CONF_VALUE_free(conf
->data
);
153 static void value_free_hash(const CONF_VALUE
*a
, LHASH_OF(CONF_VALUE
) *conf
)
156 (void)lh_CONF_VALUE_delete(conf
, a
);
159 static void value_free_stack_doall(CONF_VALUE
*a
)
162 STACK_OF(CONF_VALUE
) *sk
;
168 sk
= (STACK_OF(CONF_VALUE
) *)a
->value
;
169 for (i
= sk_CONF_VALUE_num(sk
) - 1; i
>= 0; i
--) {
170 vv
= sk_CONF_VALUE_value(sk
, i
);
171 OPENSSL_free(vv
->value
);
172 OPENSSL_free(vv
->name
);
175 sk_CONF_VALUE_free(sk
);
176 OPENSSL_free(a
->section
);
180 CONF_VALUE
*_CONF_new_section(CONF
*conf
, const char *section
)
182 STACK_OF(CONF_VALUE
) *sk
= NULL
;
184 CONF_VALUE
*v
= NULL
, *vv
;
186 if ((sk
= sk_CONF_VALUE_new_null()) == NULL
)
188 if ((v
= OPENSSL_malloc(sizeof(*v
))) == NULL
)
190 i
= strlen(section
) + 1;
191 if ((v
->section
= OPENSSL_malloc(i
)) == NULL
)
194 memcpy(v
->section
, section
, i
);
196 v
->value
= (char *)sk
;
198 vv
= lh_CONF_VALUE_insert(conf
->data
, v
);
199 if (vv
!= NULL
|| lh_CONF_VALUE_error(conf
->data
) > 0)
204 sk_CONF_VALUE_free(sk
);
206 OPENSSL_free(v
->section
);