Skip to content
Open
9 changes: 9 additions & 0 deletions ext/openssl/ossl.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,15 @@ extern VALUE eOSSLError;
}\
} while (0)

static inline void
ossl_want_uninitialized(VALUE self, const rb_data_type_t *type)
{
if (rb_check_typeddata(self, type)) {
rb_raise(rb_eTypeError, "%"PRIsVALUE" already initialized",
rb_obj_class(self));
}
}

/*
* Type conversions
*/
Expand Down
31 changes: 10 additions & 21 deletions ext/openssl/ossl_ns_spki.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,6 @@
*/
#include "ossl.h"

#define NewSPKI(klass) \
TypedData_Wrap_Struct((klass), &ossl_netscape_spki_type, 0)
#define SetSPKI(obj, spki) do { \
if (!(spki)) { \
ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
} \
RTYPEDDATA_DATA(obj) = (spki); \
} while (0)
#define GetSPKI(obj, spki) do { \
TypedData_Get_Struct((obj), NETSCAPE_SPKI, &ossl_netscape_spki_type, (spki)); \
if (!(spki)) { \
Expand Down Expand Up @@ -56,16 +48,7 @@ static const rb_data_type_t ossl_netscape_spki_type = {
static VALUE
ossl_spki_alloc(VALUE klass)
{
NETSCAPE_SPKI *spki;
VALUE obj;

obj = NewSPKI(klass);
if (!(spki = NETSCAPE_SPKI_new())) {
ossl_raise(eSPKIError, NULL);
}
SetSPKI(obj, spki);

return obj;
return TypedData_Wrap_Struct(klass, &ossl_netscape_spki_type, 0);
}

/*
Expand All @@ -82,7 +65,14 @@ ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
VALUE buffer;
const unsigned char *p;

if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
rb_scan_args(argc, argv, "01", &buffer);
rb_check_frozen(self);
ossl_want_uninitialized(self, &ossl_netscape_spki_type);
if (argc == 0) {
spki = NETSCAPE_SPKI_new();
if (!spki)
ossl_raise(eSPKIError, "NETSCAPE_SPKI_new");
RTYPEDDATA_DATA(self) = spki;
return self;
}
StringValue(buffer);
Expand All @@ -93,8 +83,7 @@ ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
ossl_raise(eSPKIError, NULL);
}
}
NETSCAPE_SPKI_free(DATA_PTR(self));
SetSPKI(self, spki);
RTYPEDDATA_DATA(self) = spki;

return self;
}
Expand Down
Loading