Skip to content

Commit c4d6be6

Browse files
make cert/crl/name/attr/revoked/ext/extfactory shareable when frozen
1 parent 9092c27 commit c4d6be6

File tree

7 files changed

+106
-12
lines changed

7 files changed

+106
-12
lines changed

Diff for: ext/openssl/ossl_x509attr.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static const rb_data_type_t ossl_x509attr_type = {
4141
{
4242
0, ossl_x509attr_free,
4343
},
44-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
44+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
4545
};
4646

4747
/*
@@ -105,6 +105,7 @@ ossl_x509attr_initialize(int argc, VALUE *argv, VALUE self)
105105
X509_ATTRIBUTE *attr, *x;
106106
const unsigned char *p;
107107

108+
rb_check_frozen(self);
108109
GetX509Attr(self, attr);
109110
if(rb_scan_args(argc, argv, "11", &oid, &value) == 1){
110111
oid = ossl_to_der_if_possible(oid);
@@ -128,7 +129,6 @@ ossl_x509attr_initialize_copy(VALUE self, VALUE other)
128129
{
129130
X509_ATTRIBUTE *attr, *attr_other, *attr_new;
130131

131-
rb_check_frozen(self);
132132
GetX509Attr(self, attr);
133133
GetX509Attr(other, attr_other);
134134

@@ -153,6 +153,7 @@ ossl_x509attr_set_oid(VALUE self, VALUE oid)
153153
ASN1_OBJECT *obj;
154154
char *s;
155155

156+
rb_check_frozen(self);
156157
GetX509Attr(self, attr);
157158
s = StringValueCStr(oid);
158159
obj = OBJ_txt2obj(s, 0);
@@ -201,9 +202,12 @@ static VALUE
201202
ossl_x509attr_set_value(VALUE self, VALUE value)
202203
{
203204
X509_ATTRIBUTE *attr;
204-
GetX509Attr(self, attr);
205+
206+
rb_check_frozen(self);
205207

206208
OSSL_Check_Kind(value, cASN1Data);
209+
GetX509Attr(self, attr);
210+
207211
VALUE der = ossl_to_der(value);
208212
const unsigned char *p = (const unsigned char *)RSTRING_PTR(der);
209213
STACK_OF(ASN1_TYPE) *sk = d2i_ASN1_SET_ANY(NULL, &p, RSTRING_LEN(der));

Diff for: ext/openssl/ossl_x509cert.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static const rb_data_type_t ossl_x509_type = {
4141
{
4242
0, ossl_x509_free,
4343
},
44-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
44+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
4545
};
4646

4747
/*
@@ -279,6 +279,7 @@ ossl_x509_set_version(VALUE self, VALUE version)
279279
X509 *x509;
280280
long ver;
281281

282+
rb_check_frozen(self);
282283
if ((ver = NUM2LONG(version)) < 0) {
283284
ossl_raise(eX509CertError, "version must be >= 0!");
284285
}
@@ -313,6 +314,7 @@ ossl_x509_set_serial(VALUE self, VALUE num)
313314
{
314315
X509 *x509;
315316

317+
rb_check_frozen(self);
316318
GetX509(self, x509);
317319
X509_set_serialNumber(x509, num_to_asn1integer(num, X509_get_serialNumber(x509)));
318320

@@ -370,6 +372,7 @@ ossl_x509_set_subject(VALUE self, VALUE subject)
370372
{
371373
X509 *x509;
372374

375+
rb_check_frozen(self);
373376
GetX509(self, x509);
374377
if (!X509_set_subject_name(x509, GetX509NamePtr(subject))) { /* DUPs name */
375378
ossl_raise(eX509CertError, NULL);
@@ -405,6 +408,7 @@ ossl_x509_set_issuer(VALUE self, VALUE issuer)
405408
{
406409
X509 *x509;
407410

411+
rb_check_frozen(self);
408412
GetX509(self, x509);
409413
if (!X509_set_issuer_name(x509, GetX509NamePtr(issuer))) { /* DUPs name */
410414
ossl_raise(eX509CertError, NULL);
@@ -441,6 +445,7 @@ ossl_x509_set_not_before(VALUE self, VALUE time)
441445
X509 *x509;
442446
ASN1_TIME *asn1time;
443447

448+
rb_check_frozen(self);
444449
GetX509(self, x509);
445450
asn1time = ossl_x509_time_adjust(NULL, time);
446451
if (!X509_set1_notBefore(x509, asn1time)) {
@@ -480,6 +485,7 @@ ossl_x509_set_not_after(VALUE self, VALUE time)
480485
X509 *x509;
481486
ASN1_TIME *asn1time;
482487

488+
rb_check_frozen(self);
483489
GetX509(self, x509);
484490
asn1time = ossl_x509_time_adjust(NULL, time);
485491
if (!X509_set1_notAfter(x509, asn1time)) {
@@ -519,6 +525,7 @@ ossl_x509_set_public_key(VALUE self, VALUE key)
519525
X509 *x509;
520526
EVP_PKEY *pkey;
521527

528+
rb_check_frozen(self);
522529
GetX509(self, x509);
523530
pkey = GetPKeyPtr(key);
524531
ossl_pkey_check_public_key(pkey);
@@ -538,6 +545,7 @@ ossl_x509_sign(VALUE self, VALUE key, VALUE digest)
538545
EVP_PKEY *pkey;
539546
const EVP_MD *md;
540547

548+
rb_check_frozen(self);
541549
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
542550
if (NIL_P(digest)) {
543551
md = NULL; /* needed for some key types, e.g. Ed25519 */
@@ -641,6 +649,7 @@ ossl_x509_set_extensions(VALUE self, VALUE ary)
641649
long i;
642650

643651
Check_Type(ary, T_ARRAY);
652+
rb_check_frozen(self);
644653
/* All ary's members should be X509Extension */
645654
for (i=0; i<RARRAY_LEN(ary); i++) {
646655
OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Ext);
@@ -668,6 +677,7 @@ ossl_x509_add_extension(VALUE self, VALUE extension)
668677
X509 *x509;
669678
X509_EXTENSION *ext;
670679

680+
rb_check_frozen(self);
671681
GetX509(self, x509);
672682
ext = GetX509ExtPtr(extension);
673683
if (!X509_add_ext(x509, ext, -1)) { /* DUPs ext - FREE it */
@@ -727,6 +737,7 @@ ossl_x509_tbs_bytes(VALUE self)
727737
unsigned char *p0;
728738
VALUE str;
729739

740+
rb_check_frozen(self);
730741
GetX509(self, x509);
731742
len = i2d_re_X509_tbs(x509, NULL);
732743
if (len <= 0) {

Diff for: ext/openssl/ossl_x509crl.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static const rb_data_type_t ossl_x509crl_type = {
4141
{
4242
0, ossl_x509crl_free,
4343
},
44-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
44+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
4545
};
4646

4747
/*
@@ -153,6 +153,7 @@ ossl_x509crl_set_version(VALUE self, VALUE version)
153153
X509_CRL *crl;
154154
long ver;
155155

156+
rb_check_frozen(self);
156157
if ((ver = NUM2LONG(version)) < 0) {
157158
ossl_raise(eX509CRLError, "version must be >= 0!");
158159
}
@@ -199,6 +200,7 @@ ossl_x509crl_set_issuer(VALUE self, VALUE issuer)
199200
{
200201
X509_CRL *crl;
201202

203+
rb_check_frozen(self);
202204
GetX509CRL(self, crl);
203205

204206
if (!X509_CRL_set_issuer_name(crl, GetX509NamePtr(issuer))) { /* DUPs name */
@@ -227,6 +229,7 @@ ossl_x509crl_set_last_update(VALUE self, VALUE time)
227229
X509_CRL *crl;
228230
ASN1_TIME *asn1time;
229231

232+
rb_check_frozen(self);
230233
GetX509CRL(self, crl);
231234
asn1time = ossl_x509_time_adjust(NULL, time);
232235
if (!X509_CRL_set1_lastUpdate(crl, asn1time)) {
@@ -302,6 +305,7 @@ ossl_x509crl_set_revoked(VALUE self, VALUE ary)
302305
STACK_OF(X509_REVOKED) *sk;
303306
long i;
304307

308+
rb_check_frozen(self);
305309
Check_Type(ary, T_ARRAY);
306310
/* All ary members should be X509 Revoked */
307311
for (i=0; i<RARRAY_LEN(ary); i++) {
@@ -330,6 +334,7 @@ ossl_x509crl_add_revoked(VALUE self, VALUE revoked)
330334
X509_CRL *crl;
331335
X509_REVOKED *rev;
332336

337+
rb_check_frozen(self);
333338
GetX509CRL(self, crl);
334339
rev = DupX509RevokedPtr(revoked);
335340
if (!X509_CRL_add0_revoked(crl, rev)) { /* NO DUP - don't free! */
@@ -348,6 +353,7 @@ ossl_x509crl_sign(VALUE self, VALUE key, VALUE digest)
348353
EVP_PKEY *pkey;
349354
const EVP_MD *md;
350355

356+
rb_check_frozen(self);
351357
GetX509CRL(self, crl);
352358
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
353359
md = ossl_evp_get_digestbyname(digest);
@@ -469,6 +475,7 @@ ossl_x509crl_set_extensions(VALUE self, VALUE ary)
469475
long i;
470476

471477
Check_Type(ary, T_ARRAY);
478+
rb_check_frozen(self);
472479
/* All ary members should be X509 Extensions */
473480
for (i=0; i<RARRAY_LEN(ary); i++) {
474481
OSSL_Check_Kind(RARRAY_AREF(ary, i), cX509Ext);
@@ -492,6 +499,7 @@ ossl_x509crl_add_extension(VALUE self, VALUE extension)
492499
X509_CRL *crl;
493500
X509_EXTENSION *ext;
494501

502+
rb_check_frozen(self);
495503
GetX509CRL(self, crl);
496504
ext = GetX509ExtPtr(extension);
497505
if (!X509_CRL_add_ext(crl, ext, -1)) {

Diff for: ext/openssl/ossl_x509ext.c

+35-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static const rb_data_type_t ossl_x509ext_type = {
5555
{
5656
0, ossl_x509ext_free,
5757
},
58-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
58+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
5959
};
6060

6161
/*
@@ -108,7 +108,7 @@ static const rb_data_type_t ossl_x509extfactory_type = {
108108
{
109109
0, ossl_x509extfactory_free,
110110
},
111-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
111+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
112112
};
113113

114114
static VALUE
@@ -181,6 +181,7 @@ ossl_x509extfactory_initialize(int argc, VALUE *argv, VALUE self)
181181

182182
rb_scan_args(argc, argv, "04",
183183
&issuer_cert, &subject_cert, &subject_req, &crl);
184+
rb_check_frozen(self);
184185
if (!NIL_P(issuer_cert))
185186
ossl_x509extfactory_set_issuer_cert(self, issuer_cert);
186187
if (!NIL_P(subject_cert))
@@ -281,6 +282,7 @@ ossl_x509ext_initialize(int argc, VALUE *argv, VALUE self)
281282
const unsigned char *p;
282283
X509_EXTENSION *ext, *x;
283284

285+
rb_check_frozen(self);
284286
GetX509Ext(self, ext);
285287
if(rb_scan_args(argc, argv, "12", &oid, &value, &critical) == 1){
286288
oid = ossl_to_der_if_possible(oid);
@@ -318,12 +320,17 @@ ossl_x509ext_initialize_copy(VALUE self, VALUE other)
318320
return self;
319321
}
320322

323+
/*
324+
* call-seq:
325+
* extension.oid = string => string
326+
*/
321327
static VALUE
322328
ossl_x509ext_set_oid(VALUE self, VALUE oid)
323329
{
324330
X509_EXTENSION *ext;
325331
ASN1_OBJECT *obj;
326332

333+
rb_check_frozen(self);
327334
GetX509Ext(self, ext);
328335
obj = OBJ_txt2obj(StringValueCStr(oid), 0);
329336
if (!obj)
@@ -337,12 +344,17 @@ ossl_x509ext_set_oid(VALUE self, VALUE oid)
337344
return oid;
338345
}
339346

347+
/*
348+
* call-seq:
349+
* extension.value = string => string
350+
*/
340351
static VALUE
341352
ossl_x509ext_set_value(VALUE self, VALUE data)
342353
{
343354
X509_EXTENSION *ext;
344355
ASN1_OCTET_STRING *asn1s;
345356

357+
rb_check_frozen(self);
346358
GetX509Ext(self, ext);
347359
data = ossl_to_der_if_possible(data);
348360
StringValue(data);
@@ -356,17 +368,26 @@ ossl_x509ext_set_value(VALUE self, VALUE data)
356368
return data;
357369
}
358370

371+
/*
372+
* call-seq:
373+
* extension.critical = bool => bool
374+
*/
359375
static VALUE
360376
ossl_x509ext_set_critical(VALUE self, VALUE flag)
361377
{
362378
X509_EXTENSION *ext;
363379

380+
rb_check_frozen(self);
364381
GetX509Ext(self, ext);
365382
X509_EXTENSION_set_critical(ext, RTEST(flag) ? 1 : 0);
366383

367384
return flag;
368385
}
369386

387+
/*
388+
* call-seq:
389+
* extension.oid => string
390+
*/
370391
static VALUE
371392
ossl_x509ext_get_oid(VALUE obj)
372393
{
@@ -390,6 +411,10 @@ ossl_x509ext_get_oid(VALUE obj)
390411
return ret;
391412
}
392413

414+
/*
415+
* call-seq:
416+
* extension.value => string
417+
*/
393418
static VALUE
394419
ossl_x509ext_get_value(VALUE obj)
395420
{
@@ -420,6 +445,10 @@ ossl_x509ext_get_value_der(VALUE obj)
420445
return rb_str_new((const char *)value->data, value->length);
421446
}
422447

448+
/*
449+
* call-seq:
450+
* extension.critical = bool
451+
*/
423452
static VALUE
424453
ossl_x509ext_get_critical(VALUE obj)
425454
{
@@ -429,6 +458,10 @@ ossl_x509ext_get_critical(VALUE obj)
429458
return X509_EXTENSION_get_critical(ext) ? Qtrue : Qfalse;
430459
}
431460

461+
/*
462+
* call-seq:
463+
* extension.to_der => string
464+
*/
432465
static VALUE
433466
ossl_x509ext_to_der(VALUE obj)
434467
{

Diff for: ext/openssl/ossl_x509name.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static const rb_data_type_t ossl_x509name_type = {
4646
{
4747
0, ossl_x509name_free,
4848
},
49-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
49+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE
5050
};
5151

5252
/*
@@ -148,6 +148,7 @@ ossl_x509name_initialize(int argc, VALUE *argv, VALUE self)
148148
X509_NAME *name;
149149
VALUE arg, template;
150150

151+
rb_check_frozen(self);
151152
GetX509Name(self, name);
152153
if (rb_scan_args(argc, argv, "02", &arg, &template) == 0) {
153154
return self;
@@ -229,6 +230,7 @@ VALUE ossl_x509name_add_entry(int argc, VALUE *argv, VALUE self)
229230
kwargs_ids[1] = rb_intern_const("set");
230231
}
231232
rb_scan_args(argc, argv, "21:", &oid, &value, &type, &opts);
233+
rb_check_frozen(self);
232234
rb_get_kwargs(opts, kwargs_ids, 0, 2, kwargs);
233235
oid_name = StringValueCStr(oid);
234236
StringValue(value);

0 commit comments

Comments
 (0)