projects
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
embed support for CHOICE type
[openssl.git]
/
crypto
/
asn1
/
tasn_new.c
diff --git
a/crypto/asn1/tasn_new.c
b/crypto/asn1/tasn_new.c
index 3884897a4e5b4ce2961965e488ae125342e188e8..13db8676fc876e7a1085cc3fbc0cf72f5d414897 100644
(file)
--- a/
crypto/asn1/tasn_new.c
+++ b/
crypto/asn1/tasn_new.c
@@
-63,10
+63,13
@@
#include <openssl/err.h>
#include <openssl/asn1t.h>
#include <string.h>
#include <openssl/err.h>
#include <openssl/asn1t.h>
#include <string.h>
+#include "asn1_locl.h"
-static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
- int combine);
+static int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
+ int embed);
+static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
+static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
@@
-82,11
+85,10
@@
ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
{
int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
{
- return asn1_item_e
x_combine
_new(pval, it, 0);
+ return asn1_item_e
mbed
_new(pval, it, 0);
}
}
-static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
- int combine)
+int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int embed)
{
const ASN1_TEMPLATE *tt = NULL;
const ASN1_EXTERN_FUNCS *ef;
{
const ASN1_TEMPLATE *tt = NULL;
const ASN1_EXTERN_FUNCS *ef;
@@
-99,9
+101,6
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
else
asn1_cb = 0;
else
asn1_cb = 0;
- if (!combine)
- *pval = NULL;
-
#ifdef CRYPTO_MDEBUG
if (it->sname)
CRYPTO_push_info(it->sname);
#ifdef CRYPTO_MDEBUG
if (it->sname)
CRYPTO_push_info(it->sname);
@@
-119,14
+118,14
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
case ASN1_ITYPE_PRIMITIVE:
if (it->templates) {
case ASN1_ITYPE_PRIMITIVE:
if (it->templates) {
- if (!
ASN
1_template_new(pval, it->templates))
+ if (!
asn
1_template_new(pval, it->templates))
goto memerr;
goto memerr;
- } else if (!
ASN
1_primitive_new(pval, it))
+ } else if (!
asn
1_primitive_new(pval, it))
goto memerr;
break;
case ASN1_ITYPE_MSTRING:
goto memerr;
break;
case ASN1_ITYPE_MSTRING:
- if (!
ASN
1_primitive_new(pval, it))
+ if (!
asn
1_primitive_new(pval, it))
goto memerr;
break;
goto memerr;
break;
@@
-143,11
+142,12
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
return 1;
}
}
return 1;
}
}
- if (!combine) {
- *pval = OPENSSL_malloc(it->size);
+ if (embed) {
+ memset(*pval, 0, it->size);
+ } else {
+ *pval = OPENSSL_zalloc(it->size);
if (!*pval)
goto memerr;
if (!*pval)
goto memerr;
- memset(*pval, 0, it->size);
}
asn1_set_choice_selector(pval, -1, it);
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
}
asn1_set_choice_selector(pval, -1, it);
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
@@
-168,17
+168,18
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
return 1;
}
}
return 1;
}
}
- if (!combine) {
- *pval = OPENSSL_malloc(it->size);
+ if (embed) {
+ memset(*pval, 0, it->size);
+ } else {
+ *pval = OPENSSL_zalloc(it->size);
if (!*pval)
goto memerr;
if (!*pval)
goto memerr;
- memset(*pval, 0, it->size);
- asn1_do_lock(pval, 0, it);
- asn1_enc_init(pval, it);
}
}
+ asn1_do_lock(pval, 0, it);
+ asn1_enc_init(pval, it);
for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
pseqval = asn1_get_field_ptr(pval, tt);
for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
pseqval = asn1_get_field_ptr(pval, tt);
- if (!
ASN
1_template_new(pseqval, tt))
+ if (!
asn
1_template_new(pseqval, tt))
goto memerr;
}
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
goto memerr;
}
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
@@
-192,7
+193,7
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
return 1;
memerr:
return 1;
memerr:
- ASN1err(ASN1_F_ASN1_ITEM_E
X_COMBINE
_NEW, ERR_R_MALLOC_FAILURE);
+ ASN1err(ASN1_F_ASN1_ITEM_E
MBED
_NEW, ERR_R_MALLOC_FAILURE);
#ifdef CRYPTO_MDEBUG
if (it->sname)
CRYPTO_pop_info();
#ifdef CRYPTO_MDEBUG
if (it->sname)
CRYPTO_pop_info();
@@
-200,7
+201,7
@@
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
return 0;
auxerr:
return 0;
auxerr:
- ASN1err(ASN1_F_ASN1_ITEM_E
X_COMBINE
_NEW, ASN1_R_AUX_ERROR);
+ ASN1err(ASN1_F_ASN1_ITEM_E
MBED
_NEW, ASN1_R_AUX_ERROR);
ASN1_item_ex_free(pval, it);
#ifdef CRYPTO_MDEBUG
if (it->sname)
ASN1_item_ex_free(pval, it);
#ifdef CRYPTO_MDEBUG
if (it->sname)
@@
-243,10
+244,16
@@
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
}
}
}
}
-
int ASN
1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
+
static int asn
1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
{
const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item);
{
const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item);
+ int embed = tt->flags & ASN1_TFLG_EMBED;
+ ASN1_VALUE *tval;
int ret;
int ret;
+ if (embed) {
+ tval = (ASN1_VALUE *)pval;
+ pval = &tval;
+ }
if (tt->flags & ASN1_TFLG_OPTIONAL) {
asn1_template_clear(pval, tt);
return 1;
if (tt->flags & ASN1_TFLG_OPTIONAL) {
asn1_template_clear(pval, tt);
return 1;
@@
-275,7
+282,7
@@
int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
goto done;
}
/* Otherwise pass it back to the item routine */
goto done;
}
/* Otherwise pass it back to the item routine */
- ret = asn1_item_e
x_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE
);
+ ret = asn1_item_e
mbed_new(pval, it, embed
);
done:
#ifdef CRYPTO_MDEBUG
if (it->sname)
done:
#ifdef CRYPTO_MDEBUG
if (it->sname)
@@
-298,7
+305,7
@@
static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
* all the old functions.
*/
* all the old functions.
*/
-
int ASN
1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
+
static int asn
1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
{
ASN1_TYPE *typ;
ASN1_STRING *str;
{
ASN1_TYPE *typ;
ASN1_STRING *str;
@@
-331,7
+338,7
@@
int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
return 1;
case V_ASN1_ANY:
return 1;
case V_ASN1_ANY:
- typ = OPENSSL_malloc(sizeof(
ASN1_TYPE
));
+ typ = OPENSSL_malloc(sizeof(
*typ
));
if (!typ)
return 0;
typ->value.ptr = NULL;
if (!typ)
return 0;
typ->value.ptr = NULL;