diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_utl.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_utl.c b/src/lib/libcrypto/x509v3/v3_utl.c index c01edf4e3c..a051baae62 100644 --- a/src/lib/libcrypto/x509v3/v3_utl.c +++ b/src/lib/libcrypto/x509v3/v3_utl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: v3_utl.c,v 1.36 2019/04/16 19:34:15 tb Exp $ */ | 1 | /* $OpenBSD: v3_utl.c,v 1.37 2019/04/16 19:42:20 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project. | 3 | * project. |
4 | */ | 4 | */ |
@@ -79,35 +79,42 @@ static int ipv6_from_asc(unsigned char *v6, const char *in); | |||
79 | static int ipv6_cb(const char *elem, int len, void *usr); | 79 | static int ipv6_cb(const char *elem, int len, void *usr); |
80 | static int ipv6_hex(unsigned char *out, const char *in, int inlen); | 80 | static int ipv6_hex(unsigned char *out, const char *in, int inlen); |
81 | 81 | ||
82 | /* Add a CONF_VALUE name value pair to stack */ | 82 | /* Add a CONF_VALUE name-value pair to stack. */ |
83 | |||
84 | int | 83 | int |
85 | X509V3_add_value(const char *name, const char *value, | 84 | X509V3_add_value(const char *name, const char *value, |
86 | STACK_OF(CONF_VALUE) **extlist) | 85 | STACK_OF(CONF_VALUE) **extlist) |
87 | { | 86 | { |
88 | CONF_VALUE *vtmp = NULL; | 87 | CONF_VALUE *vtmp = NULL; |
89 | char *tname = NULL, *tvalue = NULL; | 88 | STACK_OF(CONF_VALUE) *free_exts = NULL; |
90 | 89 | ||
91 | if (name && !(tname = strdup(name))) | 90 | if ((vtmp = calloc(1, sizeof(CONF_VALUE))) == NULL) |
92 | goto err; | ||
93 | if (value && !(tvalue = strdup(value))) | ||
94 | goto err; | ||
95 | if (!(vtmp = malloc(sizeof(CONF_VALUE)))) | ||
96 | goto err; | ||
97 | if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) | ||
98 | goto err; | 91 | goto err; |
99 | vtmp->section = NULL; | 92 | if (name != NULL) { |
100 | vtmp->name = tname; | 93 | if ((vtmp->name = strdup(name)) == NULL) |
101 | vtmp->value = tvalue; | 94 | goto err; |
95 | } | ||
96 | if (value != NULL) { | ||
97 | if ((vtmp->value = strdup(value)) == NULL) | ||
98 | goto err; | ||
99 | } | ||
100 | |||
101 | if (*extlist == NULL) { | ||
102 | if ((free_exts = *extlist = sk_CONF_VALUE_new_null()) == NULL) | ||
103 | goto err; | ||
104 | } | ||
105 | |||
102 | if (!sk_CONF_VALUE_push(*extlist, vtmp)) | 106 | if (!sk_CONF_VALUE_push(*extlist, vtmp)) |
103 | goto err; | 107 | goto err; |
108 | |||
104 | return 1; | 109 | return 1; |
105 | 110 | ||
106 | err: | 111 | err: |
107 | X509V3error(ERR_R_MALLOC_FAILURE); | 112 | X509V3error(ERR_R_MALLOC_FAILURE); |
108 | free(vtmp); | 113 | X509V3_conf_free(vtmp); |
109 | free(tname); | 114 | if (free_exts != NULL) { |
110 | free(tvalue); | 115 | sk_CONF_VALUE_free(*extlist); |
116 | *extlist = NULL; | ||
117 | } | ||
111 | return 0; | 118 | return 0; |
112 | } | 119 | } |
113 | 120 | ||