Skip to content

Commit de1d14c

Browse files
rheniummatzbot
authored andcommitted
[ruby/openssl] Add const qualifiers for OpenSSL 4.0 compatibility
OpenSSL's master branch is changing functions to return const pointers where the returned objects are not meant to be modified by the caller. Update ossl_*_new() to take const pointers accordingly. Unfortunately, *_dup() in older versions of OpenSSL and in LibreSSL/AWS-LC take non-const pointers, so const casts are required. ruby/openssl@34c49e6c6c
1 parent 6afed23 commit de1d14c

11 files changed

Lines changed: 52 additions & 43 deletions

ext/openssl/ossl_ocsp.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ ossl_ocspbres_get_status(VALUE self)
922922
VALUE ext = rb_ary_new();
923923
int ext_count = OCSP_SINGLERESP_get_ext_count(single);
924924
for (int j = 0; j < ext_count; j++) {
925-
X509_EXTENSION *x509ext = OCSP_SINGLERESP_get_ext(single, j);
925+
const X509_EXTENSION *x509ext = OCSP_SINGLERESP_get_ext(single, j);
926926
rb_ary_push(ext, ossl_x509ext_new(x509ext));
927927
}
928928
rb_ary_push(ary, ext);
@@ -1341,7 +1341,6 @@ static VALUE
13411341
ossl_ocspsres_get_extensions(VALUE self)
13421342
{
13431343
OCSP_SINGLERESP *sres;
1344-
X509_EXTENSION *ext;
13451344
int count, i;
13461345
VALUE ary;
13471346

@@ -1350,7 +1349,7 @@ ossl_ocspsres_get_extensions(VALUE self)
13501349
count = OCSP_SINGLERESP_get_ext_count(sres);
13511350
ary = rb_ary_new2(count);
13521351
for (i = 0; i < count; i++) {
1353-
ext = OCSP_SINGLERESP_get_ext(sres, i);
1352+
const X509_EXTENSION *ext = OCSP_SINGLERESP_get_ext(sres, i);
13541353
rb_ary_push(ary, ossl_x509ext_new(ext)); /* will dup */
13551354
}
13561355

ext/openssl/ossl_ts.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ ossl_ts_resp_get_tsa_certificate(VALUE self)
706706
TS_RESP *resp;
707707
PKCS7 *p7;
708708
PKCS7_SIGNER_INFO *ts_info;
709-
X509 *cert;
709+
const X509 *cert;
710710

711711
GetTSResponse(self, resp);
712712
if (!(p7 = TS_RESP_get_token(resp)))

ext/openssl/ossl_x509.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void Init_ossl_x509(void);
2929
*/
3030
extern VALUE cX509Attr;
3131

32-
VALUE ossl_x509attr_new(X509_ATTRIBUTE *);
32+
VALUE ossl_x509attr_new(const X509_ATTRIBUTE *);
3333
X509_ATTRIBUTE *GetX509AttrPtr(VALUE);
3434
void Init_ossl_x509attr(void);
3535

@@ -38,15 +38,15 @@ void Init_ossl_x509attr(void);
3838
*/
3939
extern VALUE cX509Cert;
4040

41-
VALUE ossl_x509_new(X509 *);
41+
VALUE ossl_x509_new(const X509 *);
4242
X509 *GetX509CertPtr(VALUE);
4343
X509 *DupX509CertPtr(VALUE);
4444
void Init_ossl_x509cert(void);
4545

4646
/*
4747
* X509CRL
4848
*/
49-
VALUE ossl_x509crl_new(X509_CRL *);
49+
VALUE ossl_x509crl_new(const X509_CRL *);
5050
X509_CRL *GetX509CRLPtr(VALUE);
5151
void Init_ossl_x509crl(void);
5252

@@ -55,14 +55,14 @@ void Init_ossl_x509crl(void);
5555
*/
5656
extern VALUE cX509Ext;
5757

58-
VALUE ossl_x509ext_new(X509_EXTENSION *);
58+
VALUE ossl_x509ext_new(const X509_EXTENSION *);
5959
X509_EXTENSION *GetX509ExtPtr(VALUE);
6060
void Init_ossl_x509ext(void);
6161

6262
/*
6363
* X509Name
6464
*/
65-
VALUE ossl_x509name_new(X509_NAME *);
65+
VALUE ossl_x509name_new(const X509_NAME *);
6666
X509_NAME *GetX509NamePtr(VALUE);
6767
void Init_ossl_x509name(void);
6868

@@ -77,7 +77,7 @@ void Init_ossl_x509req(void);
7777
*/
7878
extern VALUE cX509Rev;
7979

80-
VALUE ossl_x509revoked_new(X509_REVOKED *);
80+
VALUE ossl_x509revoked_new(const X509_REVOKED *);
8181
X509_REVOKED *DupX509RevokedPtr(VALUE);
8282
void Init_ossl_x509revoked(void);
8383

ext/openssl/ossl_x509attr.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ static const rb_data_type_t ossl_x509attr_type = {
4848
* Public
4949
*/
5050
VALUE
51-
ossl_x509attr_new(X509_ATTRIBUTE *attr)
51+
ossl_x509attr_new(const X509_ATTRIBUTE *attr)
5252
{
5353
X509_ATTRIBUTE *new;
5454
VALUE obj;
5555

5656
obj = NewX509Attr(cX509Attr);
57-
new = X509_ATTRIBUTE_dup(attr);
57+
/* OpenSSL 1.1.1 takes a non-const pointer */
58+
new = X509_ATTRIBUTE_dup((X509_ATTRIBUTE *)attr);
5859
if (!new)
5960
ossl_raise(eX509AttrError, "X509_ATTRIBUTE_dup");
6061
SetX509Attr(obj, new);
@@ -196,7 +197,7 @@ ossl_x509attr_set_value(VALUE self, VALUE value)
196197
ossl_raise(eX509AttrError, "attribute value must be ASN1::Set");
197198

198199
if (X509_ATTRIBUTE_count(attr)) { /* populated, reset first */
199-
ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
200+
const ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
200201
X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, 0, NULL, -1);
201202
if (!new_attr) {
202203
sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
@@ -240,7 +241,7 @@ ossl_x509attr_get_value(VALUE self)
240241

241242
count = X509_ATTRIBUTE_count(attr);
242243
for (i = 0; i < count; i++)
243-
sk_ASN1_TYPE_push(sk, X509_ATTRIBUTE_get0_type(attr, i));
244+
sk_ASN1_TYPE_push(sk, (ASN1_TYPE *)X509_ATTRIBUTE_get0_type(attr, i));
244245

245246
if ((len = i2d_ASN1_SET_ANY(sk, NULL)) <= 0) {
246247
sk_ASN1_TYPE_free(sk);

ext/openssl/ossl_x509cert.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ static const rb_data_type_t ossl_x509_type = {
4848
* Public
4949
*/
5050
VALUE
51-
ossl_x509_new(X509 *x509)
51+
ossl_x509_new(const X509 *x509)
5252
{
5353
X509 *new;
5454
VALUE obj;
5555

5656
obj = NewX509(cX509Cert);
57-
new = X509_dup(x509);
57+
/* OpenSSL 1.1.1 takes a non-const pointer */
58+
new = X509_dup((X509 *)x509);
5859
if (!new)
5960
ossl_raise(eX509CertError, "X509_dup");
6061
SetX509(obj, new);
@@ -345,7 +346,7 @@ static VALUE
345346
ossl_x509_get_subject(VALUE self)
346347
{
347348
X509 *x509;
348-
X509_NAME *name;
349+
const X509_NAME *name;
349350

350351
GetX509(self, x509);
351352
if (!(name = X509_get_subject_name(x509))) { /* NO DUP - don't free! */
@@ -380,7 +381,7 @@ static VALUE
380381
ossl_x509_get_issuer(VALUE self)
381382
{
382383
X509 *x509;
383-
X509_NAME *name;
384+
const X509_NAME *name;
384385

385386
GetX509(self, x509);
386387
if(!(name = X509_get_issuer_name(x509))) { /* NO DUP - don't free! */
@@ -603,14 +604,13 @@ ossl_x509_get_extensions(VALUE self)
603604
{
604605
X509 *x509;
605606
int count, i;
606-
X509_EXTENSION *ext;
607607
VALUE ary;
608608

609609
GetX509(self, x509);
610610
count = X509_get_ext_count(x509);
611611
ary = rb_ary_new_capa(count);
612612
for (i=0; i<count; i++) {
613-
ext = X509_get_ext(x509, i); /* NO DUP - don't free! */
613+
const X509_EXTENSION *ext = X509_get_ext(x509, i);
614614
rb_ary_push(ary, ossl_x509ext_new(ext));
615615
}
616616

ext/openssl/ossl_x509crl.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,14 @@ GetX509CRLPtr(VALUE obj)
5858
}
5959

6060
VALUE
61-
ossl_x509crl_new(X509_CRL *crl)
61+
ossl_x509crl_new(const X509_CRL *crl)
6262
{
6363
X509_CRL *tmp;
6464
VALUE obj;
6565

6666
obj = NewX509CRL(cX509CRL);
67-
tmp = X509_CRL_dup(crl);
67+
/* OpenSSL 1.1.1 takes a non-const pointer */
68+
tmp = X509_CRL_dup((X509_CRL *)crl);
6869
if (!tmp)
6970
ossl_raise(eX509CRLError, "X509_CRL_dup");
7071
SetX509CRL(obj, tmp);
@@ -289,7 +290,7 @@ ossl_x509crl_get_revoked(VALUE self)
289290
num = sk_X509_REVOKED_num(sk);
290291
ary = rb_ary_new_capa(num);
291292
for(i=0; i<num; i++) {
292-
X509_REVOKED *rev = sk_X509_REVOKED_value(sk, i);
293+
const X509_REVOKED *rev = sk_X509_REVOKED_value(sk, i);
293294
rb_ary_push(ary, ossl_x509revoked_new(rev));
294295
}
295296

@@ -443,14 +444,13 @@ ossl_x509crl_get_extensions(VALUE self)
443444
{
444445
X509_CRL *crl;
445446
int count, i;
446-
X509_EXTENSION *ext;
447447
VALUE ary;
448448

449449
GetX509CRL(self, crl);
450450
count = X509_CRL_get_ext_count(crl);
451451
ary = rb_ary_new_capa(count);
452452
for (i=0; i<count; i++) {
453-
ext = X509_CRL_get_ext(crl, i); /* NO DUP - don't free! */
453+
const X509_EXTENSION *ext = X509_CRL_get_ext(crl, i);
454454
rb_ary_push(ary, ossl_x509ext_new(ext));
455455
}
456456

ext/openssl/ossl_x509ext.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@ static const rb_data_type_t ossl_x509ext_type = {
6262
* Public
6363
*/
6464
VALUE
65-
ossl_x509ext_new(X509_EXTENSION *ext)
65+
ossl_x509ext_new(const X509_EXTENSION *ext)
6666
{
6767
X509_EXTENSION *new;
6868
VALUE obj;
6969

7070
obj = NewX509Ext(cX509Ext);
71-
new = X509_EXTENSION_dup(ext);
71+
/* OpenSSL 1.1.1 takes a non-const pointer */
72+
new = X509_EXTENSION_dup((X509_EXTENSION *)ext);
7273
if (!new)
7374
ossl_raise(eX509ExtError, "X509_EXTENSION_dup");
7475
SetX509Ext(obj, new);
@@ -338,12 +339,20 @@ ossl_x509ext_set_value(VALUE self, VALUE data)
338339
GetX509Ext(self, ext);
339340
data = ossl_to_der_if_possible(data);
340341
StringValue(data);
341-
asn1s = X509_EXTENSION_get_data(ext);
342342

343+
asn1s = ASN1_OCTET_STRING_new();
344+
if (!asn1s)
345+
ossl_raise(eX509ExtError, "ASN1_OCTET_STRING_new");
343346
if (!ASN1_OCTET_STRING_set(asn1s, (unsigned char *)RSTRING_PTR(data),
344347
RSTRING_LENINT(data))) {
348+
ASN1_OCTET_STRING_free(asn1s);
345349
ossl_raise(eX509ExtError, "ASN1_OCTET_STRING_set");
346350
}
351+
if (!X509_EXTENSION_set_data(ext, asn1s)) {
352+
ASN1_OCTET_STRING_free(asn1s);
353+
ossl_raise(eX509ExtError, "X509_EXTENSION_set_data");
354+
}
355+
ASN1_OCTET_STRING_free(asn1s);
347356

348357
return data;
349358
}
@@ -386,7 +395,7 @@ ossl_x509ext_get_value(VALUE obj)
386395
if (!(out = BIO_new(BIO_s_mem())))
387396
ossl_raise(eX509ExtError, NULL);
388397
if (!X509V3_EXT_print(out, ext, 0, 0))
389-
ASN1_STRING_print(out, (ASN1_STRING *)X509_EXTENSION_get_data(ext));
398+
ASN1_STRING_print(out, X509_EXTENSION_get_data(ext));
390399
ret = ossl_membio2str(out);
391400

392401
return ret;
@@ -396,7 +405,7 @@ static VALUE
396405
ossl_x509ext_get_value_der(VALUE obj)
397406
{
398407
X509_EXTENSION *ext;
399-
ASN1_OCTET_STRING *value;
408+
const ASN1_OCTET_STRING *value;
400409

401410
GetX509Ext(obj, ext);
402411
if ((value = X509_EXTENSION_get_data(ext)) == NULL)

ext/openssl/ossl_x509name.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ static const rb_data_type_t ossl_x509name_type = {
5353
* Public
5454
*/
5555
VALUE
56-
ossl_x509name_new(X509_NAME *name)
56+
ossl_x509name_new(const X509_NAME *name)
5757
{
5858
X509_NAME *new;
5959
VALUE obj;
6060

6161
obj = NewX509Name(cX509Name);
62-
new = X509_NAME_dup(name);
62+
/* OpenSSL 1.1.1 takes a non-const pointer */
63+
new = X509_NAME_dup((X509_NAME *)name);
6364
if (!new)
6465
ossl_raise(eX509NameError, "X509_NAME_dup");
6566
SetX509Name(obj, new);

ext/openssl/ossl_x509req.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ static VALUE
231231
ossl_x509req_get_subject(VALUE self)
232232
{
233233
X509_REQ *req;
234-
X509_NAME *name;
234+
const X509_NAME *name;
235235

236236
GetX509Req(self, req);
237237
if (!(name = X509_REQ_get_subject_name(req))) { /* NO DUP - don't free */
@@ -351,7 +351,7 @@ ossl_x509req_get_attributes(VALUE self)
351351
{
352352
X509_REQ *req;
353353
int count, i;
354-
X509_ATTRIBUTE *attr;
354+
const X509_ATTRIBUTE *attr;
355355
VALUE ary;
356356

357357
GetX509Req(self, req);

ext/openssl/ossl_x509revoked.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ static const rb_data_type_t ossl_x509rev_type = {
4848
* PUBLIC
4949
*/
5050
VALUE
51-
ossl_x509revoked_new(X509_REVOKED *rev)
51+
ossl_x509revoked_new(const X509_REVOKED *rev)
5252
{
5353
X509_REVOKED *new;
5454
VALUE obj;
5555

5656
obj = NewX509Rev(cX509Rev);
57-
new = X509_REVOKED_dup(rev);
57+
/* OpenSSL 1.1.1 takes a non-const pointer */
58+
new = X509_REVOKED_dup((X509_REVOKED *)rev);
5859
if (!new)
5960
ossl_raise(eX509RevError, "X509_REVOKED_dup");
6061
SetX509Rev(obj, new);
@@ -185,7 +186,7 @@ ossl_x509revoked_get_extensions(VALUE self)
185186
{
186187
X509_REVOKED *rev;
187188
int count, i;
188-
X509_EXTENSION *ext;
189+
const X509_EXTENSION *ext;
189190
VALUE ary;
190191

191192
GetX509Rev(self, rev);

0 commit comments

Comments
 (0)