Skip to content

Commit 4cbe86f

Browse files
committed
ts: allocate OpenSSL objects in #initialize{,_copy}
1 parent c70b060 commit 4cbe86f

1 file changed

Lines changed: 29 additions & 69 deletions

File tree

ext/openssl/ossl_ts.c

Lines changed: 29 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -11,44 +11,20 @@
1111

1212
#ifndef OPENSSL_NO_TS
1313

14-
#define NewTSRequest(klass) \
15-
TypedData_Wrap_Struct((klass), &ossl_ts_req_type, 0)
16-
#define SetTSRequest(obj, req) do { \
17-
if (!(req)) { \
18-
ossl_raise(rb_eRuntimeError, "TS_REQ wasn't initialized."); \
19-
} \
20-
RTYPEDDATA_DATA(obj) = (req); \
21-
} while (0)
2214
#define GetTSRequest(obj, req) do { \
2315
TypedData_Get_Struct((obj), TS_REQ, &ossl_ts_req_type, (req)); \
2416
if (!(req)) { \
2517
ossl_raise(rb_eRuntimeError, "TS_REQ wasn't initialized."); \
2618
} \
2719
} while (0)
2820

29-
#define NewTSResponse(klass) \
30-
TypedData_Wrap_Struct((klass), &ossl_ts_resp_type, 0)
31-
#define SetTSResponse(obj, resp) do { \
32-
if (!(resp)) { \
33-
ossl_raise(rb_eRuntimeError, "TS_RESP wasn't initialized."); \
34-
} \
35-
RTYPEDDATA_DATA(obj) = (resp); \
36-
} while (0)
3721
#define GetTSResponse(obj, resp) do { \
3822
TypedData_Get_Struct((obj), TS_RESP, &ossl_ts_resp_type, (resp)); \
3923
if (!(resp)) { \
4024
ossl_raise(rb_eRuntimeError, "TS_RESP wasn't initialized."); \
4125
} \
4226
} while (0)
4327

44-
#define NewTSTokenInfo(klass) \
45-
TypedData_Wrap_Struct((klass), &ossl_ts_token_info_type, 0)
46-
#define SetTSTokenInfo(obj, info) do { \
47-
if (!(info)) { \
48-
ossl_raise(rb_eRuntimeError, "TS_TST_INFO wasn't initialized."); \
49-
} \
50-
RTYPEDDATA_DATA(obj) = (info); \
51-
} while (0)
5228
#define GetTSTokenInfo(obj, info) do { \
5329
TypedData_Get_Struct((obj), TS_TST_INFO, &ossl_ts_token_info_type, (info)); \
5430
if (!(info)) { \
@@ -141,19 +117,7 @@ obj_to_asn1obj_i(VALUE obj)
141117
static VALUE
142118
ossl_ts_req_alloc(VALUE klass)
143119
{
144-
TS_REQ *req;
145-
VALUE obj;
146-
147-
obj = NewTSRequest(klass);
148-
if (!(req = TS_REQ_new()))
149-
ossl_raise(eTimestampError, NULL);
150-
SetTSRequest(obj, req);
151-
152-
/* Defaults */
153-
TS_REQ_set_version(req, 1);
154-
TS_REQ_set_cert_req(req, 1);
155-
156-
return obj;
120+
return TypedData_Wrap_Struct(klass, &ossl_ts_req_type, NULL);
157121
}
158122

159123
/*
@@ -168,11 +132,24 @@ ossl_ts_req_alloc(VALUE klass)
168132
static VALUE
169133
ossl_ts_req_initialize(int argc, VALUE *argv, VALUE self)
170134
{
171-
TS_REQ *req, *req_orig = DATA_PTR(self);
135+
TS_REQ *req;
172136
BIO *in;
173137
VALUE arg;
174138

175-
if(rb_scan_args(argc, argv, "01", &arg) == 0) {
139+
rb_scan_args(argc, argv, "01", &arg);
140+
ossl_want_uninitialized(self, &ossl_ts_req_type);
141+
if (argc == 0) {
142+
req = TS_REQ_new();
143+
if (!req)
144+
ossl_raise(eTimestampError, "TS_REQ_new");
145+
RTYPEDDATA_DATA(self) = req;
146+
147+
/* Defaults */
148+
if (!TS_REQ_set_version(req, 1))
149+
ossl_raise(eTimestampError, "TS_REQ_set_version");
150+
if (!TS_REQ_set_cert_req(req, 1))
151+
ossl_raise(eTimestampError, "TS_REQ_set_cert_req");
152+
176153
return self;
177154
}
178155

@@ -184,7 +161,6 @@ ossl_ts_req_initialize(int argc, VALUE *argv, VALUE self)
184161
ossl_raise(eTimestampError,
185162
"Error when decoding the timestamp request");
186163
}
187-
TS_REQ_free(req_orig);
188164
RTYPEDDATA_DATA(self) = req;
189165

190166
return self;
@@ -499,15 +475,7 @@ ossl_ts_req_to_text(VALUE self)
499475
static VALUE
500476
ossl_ts_resp_alloc(VALUE klass)
501477
{
502-
TS_RESP *resp;
503-
VALUE obj;
504-
505-
obj = NewTSResponse(klass);
506-
if (!(resp = TS_RESP_new()))
507-
ossl_raise(eTimestampError, NULL);
508-
SetTSResponse(obj, resp);
509-
510-
return obj;
478+
return TypedData_Wrap_Struct(klass, &ossl_ts_resp_type, NULL);
511479
}
512480

513481
/*
@@ -523,9 +491,10 @@ ossl_ts_resp_alloc(VALUE klass)
523491
static VALUE
524492
ossl_ts_resp_initialize(VALUE self, VALUE der)
525493
{
526-
TS_RESP *resp, *resp_orig = DATA_PTR(self);
494+
TS_RESP *resp;
527495
BIO *in;
528496

497+
ossl_want_uninitialized(self, &ossl_ts_resp_type);
529498
der = ossl_to_der_if_possible(der);
530499
in = ossl_obj2bio(&der);
531500
resp = d2i_TS_RESP_bio(in, NULL);
@@ -534,7 +503,6 @@ ossl_ts_resp_initialize(VALUE self, VALUE der)
534503
ossl_raise(eTimestampError,
535504
"Error when decoding the timestamp response");
536505
}
537-
TS_RESP_free(resp_orig);
538506
RTYPEDDATA_DATA(self) = resp;
539507

540508
return self;
@@ -667,6 +635,8 @@ ossl_ts_resp_get_token(VALUE self)
667635
return ossl_pkcs7_new(p7);
668636
}
669637

638+
static VALUE ossl_ts_token_info_alloc(VALUE klass);
639+
670640
/*
671641
* Get the response's token info if present.
672642
*
@@ -684,12 +654,10 @@ ossl_ts_resp_get_token_info(VALUE self)
684654
if (!(info = TS_RESP_get_tst_info(resp)))
685655
return Qnil;
686656

687-
obj = NewTSTokenInfo(cTimestampTokenInfo);
688-
657+
obj = ossl_ts_token_info_alloc(cTimestampTokenInfo);
689658
if (!(copy = TS_TST_INFO_dup(info)))
690-
ossl_raise(eTimestampError, NULL);
691-
692-
SetTSTokenInfo(obj, copy);
659+
ossl_raise(eTimestampError, "TS_TST_INFO_dup");
660+
RTYPEDDATA_DATA(obj) = copy;
693661

694662
return obj;
695663
}
@@ -854,15 +822,7 @@ ossl_ts_resp_verify(int argc, VALUE *argv, VALUE self)
854822
static VALUE
855823
ossl_ts_token_info_alloc(VALUE klass)
856824
{
857-
TS_TST_INFO *info;
858-
VALUE obj;
859-
860-
obj = NewTSTokenInfo(klass);
861-
if (!(info = TS_TST_INFO_new()))
862-
ossl_raise(eTimestampError, NULL);
863-
SetTSTokenInfo(obj, info);
864-
865-
return obj;
825+
return TypedData_Wrap_Struct(klass, &ossl_ts_token_info_type, NULL);
866826
}
867827

868828
/*
@@ -878,9 +838,10 @@ ossl_ts_token_info_alloc(VALUE klass)
878838
static VALUE
879839
ossl_ts_token_info_initialize(VALUE self, VALUE der)
880840
{
881-
TS_TST_INFO *info, *info_orig = DATA_PTR(self);
841+
TS_TST_INFO *info;
882842
BIO *in;
883843

844+
ossl_want_uninitialized(self, &ossl_ts_token_info_type);
884845
der = ossl_to_der_if_possible(der);
885846
in = ossl_obj2bio(&der);
886847
info = d2i_TS_TST_INFO_bio(in, NULL);
@@ -889,7 +850,6 @@ ossl_ts_token_info_initialize(VALUE self, VALUE der)
889850
ossl_raise(eTimestampError,
890851
"Error when decoding the timestamp token info");
891852
}
892-
TS_TST_INFO_free(info_orig);
893853
RTYPEDDATA_DATA(self) = info;
894854

895855
return self;
@@ -1184,7 +1144,7 @@ ossl_tsfac_create_ts(VALUE self, VALUE key, VALUE certificate, VALUE request)
11841144
const char * err_msg = NULL;
11851145
int status = 0;
11861146

1187-
tsresp = NewTSResponse(cTimestampResponse);
1147+
tsresp = ossl_ts_resp_alloc(cTimestampResponse);
11881148
tsa_cert = GetX509CertPtr(certificate);
11891149
sign_key = GetPrivPKeyPtr(key);
11901150
GetTSRequest(request, req);
@@ -1281,7 +1241,7 @@ ossl_tsfac_create_ts(VALUE self, VALUE key, VALUE certificate, VALUE request)
12811241
* information. */
12821242
ossl_clear_error();
12831243

1284-
SetTSResponse(tsresp, response);
1244+
RTYPEDDATA_DATA(tsresp) = response;
12851245
ret = tsresp;
12861246

12871247
end:

0 commit comments

Comments
 (0)