Skip to content

Commit 1550ed7

Browse files
davidbentorben-hansen
authored andcommitted
Const-correct the i2d/dup functions we can.
Types which do not contain an X509_NAME can be const. X509_NAME still requires some thought. (i2d_X509_NAME can mutate the object and isn't even thread-safe when modified.) Bug: 407 Change-Id: Iceafa2b4ea9c4194cfcc3044d90393b5d91f7c11 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/53305 Reviewed-by: Bob Beck <[email protected]> Commit-Queue: Bob Beck <[email protected]> (cherry picked from commit dc112e7ffc9bf95d01f08478ac9be90d6a695cdd)
1 parent 973e068 commit 1550ed7

24 files changed

+111
-79
lines changed

.clang-format

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ StatementMacros:
3838
- "IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname"
3939
- "IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname"
4040
- "IMPLEMENT_ASN1_DUP_FUNCTION"
41+
- "IMPLEMENT_ASN1_DUP_FUNCTION_const"
4142
- "IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname"
4243
- "IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname"
4344
- "IMPLEMENT_ASN1_FUNCTIONS"

crypto/pkcs8/pkcs8_x509.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ ASN1_SEQUENCE_cb(PKCS8_PRIV_KEY_INFO, pkey_cb) = {
110110
ASN1_IMP_SET_OF_OPT(PKCS8_PRIV_KEY_INFO, attributes, X509_ATTRIBUTE, 0),
111111
} ASN1_SEQUENCE_END_cb(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO)
112112

113-
IMPLEMENT_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)
113+
IMPLEMENT_ASN1_FUNCTIONS_const(PKCS8_PRIV_KEY_INFO)
114114

115115
int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, int version,
116116
int ptype, void *pval, uint8_t *penc, int penclen) {

crypto/x509/internal.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ typedef struct X509_val_st {
7777
ASN1_TIME *notAfter;
7878
} X509_VAL;
7979

80-
DECLARE_ASN1_FUNCTIONS(X509_VAL)
80+
DECLARE_ASN1_FUNCTIONS_const(X509_VAL)
8181

8282
struct X509_pubkey_st {
8383
X509_ALGOR *algor;
@@ -113,7 +113,7 @@ typedef struct x509_cert_aux_st {
113113
ASN1_OCTET_STRING *keyid; // key id of private key
114114
} X509_CERT_AUX;
115115

116-
DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX)
116+
DECLARE_ASN1_FUNCTIONS_const(X509_CERT_AUX)
117117

118118
struct X509_extension_st {
119119
ASN1_OBJECT *object;
@@ -135,6 +135,8 @@ typedef struct {
135135
ASN1_ENCODING enc;
136136
} X509_CINF;
137137

138+
// TODO(https://crbug.com/boringssl/407): This is not const because it contains
139+
// an |X509_NAME|.
138140
DECLARE_ASN1_FUNCTIONS(X509_CINF)
139141

140142
struct x509_st {
@@ -171,6 +173,8 @@ typedef struct {
171173
STACK_OF(X509_ATTRIBUTE) *attributes; // [ 0 ]
172174
} X509_REQ_INFO;
173175

176+
// TODO(https://crbug.com/boringssl/407): This is not const because it contains
177+
// an |X509_NAME|.
174178
DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO)
175179

176180
struct X509_req_st {
@@ -201,6 +205,8 @@ typedef struct {
201205
ASN1_ENCODING enc;
202206
} X509_CRL_INFO;
203207

208+
// TODO(https://crbug.com/boringssl/407): This is not const because it contains
209+
// an |X509_NAME|.
204210
DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO)
205211

206212
struct X509_crl_st {

crypto/x509/rsa_pss.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ ASN1_SEQUENCE_cb(RSA_PSS_PARAMS, rsa_pss_cb) = {
8383
ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER, 3),
8484
} ASN1_SEQUENCE_END_cb(RSA_PSS_PARAMS, RSA_PSS_PARAMS)
8585

86-
IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS)
86+
IMPLEMENT_ASN1_FUNCTIONS_const(RSA_PSS_PARAMS)
8787

8888

8989
// Given an MGF1 Algorithm ID decode to an Algorithm Identifier

crypto/x509/x509cset.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,8 @@ int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) {
245245
}
246246

247247
int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo) {
248-
// TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
249-
// should be const. Alternatively, when we can embed required fields
250-
// directly in structs, import |X509_ALGOR_copy| from upstream.
251-
X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
252-
X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
248+
X509_ALGOR *copy1 = X509_ALGOR_dup(algo);
249+
X509_ALGOR *copy2 = X509_ALGOR_dup(algo);
253250
if (copy1 == NULL || copy2 == NULL) {
254251
X509_ALGOR_free(copy1);
255252
X509_ALGOR_free(copy2);

crypto/x509/x509rset.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,7 @@ int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey) {
8888
}
8989

9090
int X509_REQ_set1_signature_algo(X509_REQ *req, const X509_ALGOR *algo) {
91-
// TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
92-
// should be const. Alternatively, when we can embed required fields
93-
// directly in structs, import |X509_ALGOR_copy| from upstream.
94-
X509_ALGOR *copy = X509_ALGOR_dup((X509_ALGOR *)algo);
91+
X509_ALGOR *copy = X509_ALGOR_dup(algo);
9592
if (copy == NULL) {
9693
return 0;
9794
}

crypto/x509/x_algor.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ ASN1_ITEM_TEMPLATE(X509_ALGORS) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF,
7474
X509_ALGOR)
7575
ASN1_ITEM_TEMPLATE_END(X509_ALGORS)
7676

77-
IMPLEMENT_ASN1_FUNCTIONS(X509_ALGOR)
78-
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_ALGORS, X509_ALGORS, X509_ALGORS)
79-
IMPLEMENT_ASN1_DUP_FUNCTION(X509_ALGOR)
77+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_ALGOR)
78+
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(X509_ALGORS, X509_ALGORS,
79+
X509_ALGORS)
80+
IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ALGOR)
8081

8182
int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval) {
8283
if (!alg) {

crypto/x509/x_attrib.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ ASN1_SEQUENCE(X509_ATTRIBUTE) = {
6767
ASN1_SET_OF(X509_ATTRIBUTE, set, ASN1_ANY),
6868
} ASN1_SEQUENCE_END(X509_ATTRIBUTE)
6969

70-
IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE)
71-
IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
70+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_ATTRIBUTE)
71+
IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ATTRIBUTE)
7272

7373
X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, void *value) {
7474
ASN1_OBJECT *obj = OBJ_nid2obj(nid);

crypto/x509/x_exten.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ ASN1_ITEM_TEMPLATE(X509_EXTENSIONS) =
7272
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Extension, X509_EXTENSION)
7373
ASN1_ITEM_TEMPLATE_END(X509_EXTENSIONS)
7474

75-
IMPLEMENT_ASN1_FUNCTIONS(X509_EXTENSION)
76-
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_EXTENSIONS, X509_EXTENSIONS,
77-
X509_EXTENSIONS)
78-
IMPLEMENT_ASN1_DUP_FUNCTION(X509_EXTENSION)
75+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_EXTENSION)
76+
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(X509_EXTENSIONS, X509_EXTENSIONS,
77+
X509_EXTENSIONS)
78+
IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_EXTENSION)

crypto/x509/x_name.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ ASN1_SEQUENCE(X509_NAME_ENTRY) = {
9999
ASN1_SIMPLE(X509_NAME_ENTRY, value, ASN1_PRINTABLE),
100100
} ASN1_SEQUENCE_END(X509_NAME_ENTRY)
101101

102-
IMPLEMENT_ASN1_FUNCTIONS(X509_NAME_ENTRY)
103-
IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME_ENTRY)
102+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_NAME_ENTRY)
103+
IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_NAME_ENTRY)
104104

105105
// For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
106106
// declare two template wrappers for this

crypto/x509/x_pubkey.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = {
8585
ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING),
8686
} ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY)
8787

88-
IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY)
88+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_PUBKEY)
8989

9090
int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) {
9191
X509_PUBKEY *pk = NULL;

crypto/x509/x_sig.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ ASN1_SEQUENCE(X509_SIG) = {
7171
ASN1_SIMPLE(X509_SIG, digest, ASN1_OCTET_STRING),
7272
} ASN1_SEQUENCE_END(X509_SIG)
7373

74-
IMPLEMENT_ASN1_FUNCTIONS(X509_SIG)
74+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_SIG)
7575

7676
void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **out_alg,
7777
const ASN1_OCTET_STRING **out_digest) {

crypto/x509/x_spki.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ ASN1_SEQUENCE(NETSCAPE_SPKAC) = {
6767
ASN1_SIMPLE(NETSCAPE_SPKAC, challenge, ASN1_IA5STRING),
6868
} ASN1_SEQUENCE_END(NETSCAPE_SPKAC)
6969

70-
IMPLEMENT_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
70+
IMPLEMENT_ASN1_FUNCTIONS_const(NETSCAPE_SPKAC)
7171

7272
ASN1_SEQUENCE(NETSCAPE_SPKI) = {
7373
ASN1_SIMPLE(NETSCAPE_SPKI, spkac, NETSCAPE_SPKAC),
7474
ASN1_SIMPLE(NETSCAPE_SPKI, sig_algor, X509_ALGOR),
7575
ASN1_SIMPLE(NETSCAPE_SPKI, signature, ASN1_BIT_STRING),
7676
} ASN1_SEQUENCE_END(NETSCAPE_SPKI)
7777

78-
IMPLEMENT_ASN1_FUNCTIONS(NETSCAPE_SPKI)
78+
IMPLEMENT_ASN1_FUNCTIONS_const(NETSCAPE_SPKI)

crypto/x509/x_val.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,4 @@ ASN1_SEQUENCE(X509_VAL) = {
6868
ASN1_SIMPLE(X509_VAL, notAfter, ASN1_TIME),
6969
} ASN1_SEQUENCE_END(X509_VAL)
7070

71-
IMPLEMENT_ASN1_FUNCTIONS(X509_VAL)
71+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_VAL)

crypto/x509/x_x509.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,8 @@ int i2d_X509_tbs(X509 *x509, unsigned char **outp) {
338338
}
339339

340340
int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo) {
341-
// TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
342-
// should be const. Alternatively, when we can embed required fields
343-
// directly in structs, import |X509_ALGOR_copy| from upstream.
344-
X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
345-
X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
341+
X509_ALGOR *copy1 = X509_ALGOR_dup(algo);
342+
X509_ALGOR *copy2 = X509_ALGOR_dup(algo);
346343
if (copy1 == NULL || copy2 == NULL) {
347344
X509_ALGOR_free(copy1);
348345
X509_ALGOR_free(copy2);

crypto/x509/x_x509a.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ ASN1_SEQUENCE(X509_CERT_AUX) = {
7878
ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
7979
} ASN1_SEQUENCE_END(X509_CERT_AUX)
8080

81-
IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
81+
IMPLEMENT_ASN1_FUNCTIONS_const(X509_CERT_AUX)
8282

8383
static X509_CERT_AUX *aux_get(X509 *x) {
8484
if (!x) {

crypto/x509v3/v3_bcons.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ ASN1_SEQUENCE(BASIC_CONSTRAINTS) = {
9393
ASN1_OPT(BASIC_CONSTRAINTS, pathlen, ASN1_INTEGER),
9494
} ASN1_SEQUENCE_END(BASIC_CONSTRAINTS)
9595

96-
IMPLEMENT_ASN1_FUNCTIONS(BASIC_CONSTRAINTS)
96+
IMPLEMENT_ASN1_FUNCTIONS_const(BASIC_CONSTRAINTS)
9797

9898
static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS(
9999
const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist) {

crypto/x509v3/v3_cpols.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,14 @@ ASN1_ITEM_TEMPLATE(CERTIFICATEPOLICIES) = ASN1_EX_TEMPLATE_TYPE(
107107
ASN1_TFLG_SEQUENCE_OF, 0, CERTIFICATEPOLICIES, POLICYINFO)
108108
ASN1_ITEM_TEMPLATE_END(CERTIFICATEPOLICIES)
109109

110-
IMPLEMENT_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)
110+
IMPLEMENT_ASN1_FUNCTIONS_const(CERTIFICATEPOLICIES)
111111

112112
ASN1_SEQUENCE(POLICYINFO) = {
113113
ASN1_SIMPLE(POLICYINFO, policyid, ASN1_OBJECT),
114114
ASN1_SEQUENCE_OF_OPT(POLICYINFO, qualifiers, POLICYQUALINFO),
115115
} ASN1_SEQUENCE_END(POLICYINFO)
116116

117-
IMPLEMENT_ASN1_FUNCTIONS(POLICYINFO)
117+
IMPLEMENT_ASN1_FUNCTIONS_const(POLICYINFO)
118118

119119
ASN1_ADB_TEMPLATE(policydefault) = ASN1_SIMPLE(POLICYQUALINFO, d.other,
120120
ASN1_ANY);
@@ -131,21 +131,21 @@ ASN1_SEQUENCE(POLICYQUALINFO) = {
131131
ASN1_ADB_OBJECT(POLICYQUALINFO),
132132
} ASN1_SEQUENCE_END(POLICYQUALINFO)
133133

134-
IMPLEMENT_ASN1_FUNCTIONS(POLICYQUALINFO)
134+
IMPLEMENT_ASN1_FUNCTIONS_const(POLICYQUALINFO)
135135

136136
ASN1_SEQUENCE(USERNOTICE) = {
137137
ASN1_OPT(USERNOTICE, noticeref, NOTICEREF),
138138
ASN1_OPT(USERNOTICE, exptext, DISPLAYTEXT),
139139
} ASN1_SEQUENCE_END(USERNOTICE)
140140

141-
IMPLEMENT_ASN1_FUNCTIONS(USERNOTICE)
141+
IMPLEMENT_ASN1_FUNCTIONS_const(USERNOTICE)
142142

143143
ASN1_SEQUENCE(NOTICEREF) = {
144144
ASN1_SIMPLE(NOTICEREF, organization, DISPLAYTEXT),
145145
ASN1_SEQUENCE_OF(NOTICEREF, noticenos, ASN1_INTEGER),
146146
} ASN1_SEQUENCE_END(NOTICEREF)
147147

148-
IMPLEMENT_ASN1_FUNCTIONS(NOTICEREF)
148+
IMPLEMENT_ASN1_FUNCTIONS_const(NOTICEREF)
149149

150150
static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
151151
const char *value) {

crypto/x509v3/v3_extku.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ ASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) = ASN1_EX_TEMPLATE_TYPE(
108108
ASN1_TFLG_SEQUENCE_OF, 0, EXTENDED_KEY_USAGE, ASN1_OBJECT)
109109
ASN1_ITEM_TEMPLATE_END(EXTENDED_KEY_USAGE)
110110

111-
IMPLEMENT_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
111+
IMPLEMENT_ASN1_FUNCTIONS_const(EXTENDED_KEY_USAGE)
112112

113113
static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(
114114
const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *ext_list) {

crypto/x509v3/v3_genn.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ ASN1_SEQUENCE(OTHERNAME) = {
6969
ASN1_EXP(OTHERNAME, value, ASN1_ANY, 0),
7070
} ASN1_SEQUENCE_END(OTHERNAME)
7171

72-
IMPLEMENT_ASN1_FUNCTIONS(OTHERNAME)
72+
IMPLEMENT_ASN1_FUNCTIONS_const(OTHERNAME)
7373

7474
ASN1_SEQUENCE(EDIPARTYNAME) = {
7575
// DirectoryString is a CHOICE type, so use explicit tagging.
7676
ASN1_EXP_OPT(EDIPARTYNAME, nameAssigner, DIRECTORYSTRING, 0),
7777
ASN1_EXP(EDIPARTYNAME, partyName, DIRECTORYSTRING, 1),
7878
} ASN1_SEQUENCE_END(EDIPARTYNAME)
7979

80-
IMPLEMENT_ASN1_FUNCTIONS(EDIPARTYNAME)
80+
IMPLEMENT_ASN1_FUNCTIONS_const(EDIPARTYNAME)
8181

8282
ASN1_CHOICE(GENERAL_NAME) = {
8383
ASN1_IMP(GENERAL_NAME, d.otherName, OTHERNAME, GEN_OTHERNAME),

crypto/x509v3/v3_pcia.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ ASN1_SEQUENCE(PROXY_POLICY) = {
4545
ASN1_OPT(PROXY_POLICY, policy, ASN1_OCTET_STRING),
4646
} ASN1_SEQUENCE_END(PROXY_POLICY)
4747

48-
IMPLEMENT_ASN1_FUNCTIONS(PROXY_POLICY)
48+
IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_POLICY)
4949

5050
ASN1_SEQUENCE(PROXY_CERT_INFO_EXTENSION) = {
5151
ASN1_OPT(PROXY_CERT_INFO_EXTENSION, pcPathLengthConstraint, ASN1_INTEGER),
5252
ASN1_SIMPLE(PROXY_CERT_INFO_EXTENSION, proxyPolicy, PROXY_POLICY),
5353
} ASN1_SEQUENCE_END(PROXY_CERT_INFO_EXTENSION)
5454

55-
IMPLEMENT_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION)
55+
IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_CERT_INFO_EXTENSION)

include/openssl/asn1t.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -677,13 +677,17 @@ typedef struct ASN1_AUX_st {
677677
int i2d_##fname(const stname *a, unsigned char **out) \
678678
{ \
679679
return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
680-
}
680+
}
681+
682+
#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
683+
stname *stname##_dup(stname *x) { \
684+
return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
685+
}
681686

682-
#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
683-
stname * stname##_dup(stname *x) \
684-
{ \
685-
return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
686-
}
687+
#define IMPLEMENT_ASN1_DUP_FUNCTION_const(stname) \
688+
stname *stname##_dup(const stname *x) { \
689+
return ASN1_item_dup(ASN1_ITEM_rptr(stname), (void *)x); \
690+
}
687691

688692
#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
689693
IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)

0 commit comments

Comments
 (0)