aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_x509name.c
diff options
context:
space:
mode:
Diffstat (limited to 'ossl_x509name.c')
-rw-r--r--ossl_x509name.c71
1 files changed, 27 insertions, 44 deletions
diff --git a/ossl_x509name.c b/ossl_x509name.c
index d64b74f..905aa5d 100644
--- a/ossl_x509name.c
+++ b/ossl_x509name.c
@@ -11,13 +11,8 @@
#include "ossl.h"
#include "st.h" /* For st_foreach -- ST_CONTINUE */
-#define MakeX509Name(obj, namep) {\
- obj = Data_Make_Struct(cX509Name, ossl_x509name, 0, ossl_x509name_free, namep);\
-}
-#define GetX509Name(obj, namep) {\
- Data_Get_Struct(obj, ossl_x509name, namep);\
- if (!namep->name) rb_raise(eX509NameError, "not initialized!");\
-}
+#define WrapX509Name(obj, name) obj = Data_Wrap_Struct(cX509Name, 0, X509_NAME_free, name)
+#define GetX509Name(obj, name) Data_Get_Struct(obj, X509_NAME, name)
/*
* Classes
@@ -26,30 +21,11 @@ VALUE cX509Name;
VALUE eX509NameError;
/*
- * Struct
- */
-typedef struct ossl_x509name_st {
- X509_NAME *name;
-} ossl_x509name;
-
-
-static void
-ossl_x509name_free(ossl_x509name *namep)
-{
- if (namep) {
- if (namep->name) X509_NAME_free(namep->name);
- namep->name = NULL;
- free(namep);
- }
-}
-
-/*
* Public
*/
VALUE
ossl_x509name_new(X509_NAME *name)
{
- ossl_x509name *namep = NULL;
X509_NAME *new = NULL;
VALUE obj;
@@ -60,8 +36,7 @@ ossl_x509name_new(X509_NAME *name)
if (!new)
OSSL_Raise(eX509NameError, "");
- MakeX509Name(obj, namep);
- namep->name = new;
+ WrapX509Name(obj, new);
return obj;
}
@@ -69,12 +44,17 @@ ossl_x509name_new(X509_NAME *name)
X509_NAME *
ossl_x509name_get_X509_NAME(VALUE obj)
{
- ossl_x509name *namep = NULL;
+ X509_NAME *name = NULL, *new;
- OSSL_Check_Type(obj, cX509Name);
- GetX509Name(obj, namep);
+ OSSL_Check_Type(obj, cX509Name);
+
+ GetX509Name(obj, name);
- return X509_NAME_dup(namep->name);
+ if (!(new = X509_NAME_dup(name))) {
+ OSSL_Raise(eX509NameError, "");
+ }
+
+ return new;
}
/*
@@ -94,11 +74,11 @@ ossl_x509name_hash_i(VALUE key, VALUE value, X509_NAME *name)
if (!(id = OBJ_ln2nid(RSTRING(key)->ptr)))
if (!(id = OBJ_sn2nid(RSTRING(key)->ptr))) {
X509_NAME_free(name);
- OSSL_Raise(eX509NameError, "OBJ_...2nid:");
+ OSSL_Raise(eX509NameError, "OBJ_name2nid:");
}
-
+
type = ASN1_PRINTABLE_type(RSTRING(value)->ptr, -1);
-
+
if (!X509_NAME_add_entry_by_NID(name, id, type, RSTRING(value)->ptr, RSTRING(value)->len, -1, 0)) {
X509_NAME_free(name);
OSSL_Raise(eX509NameError, "");
@@ -110,7 +90,6 @@ ossl_x509name_hash_i(VALUE key, VALUE value, X509_NAME *name)
static VALUE
ossl_x509name_s_new_from_hash(VALUE klass, VALUE hash)
{
- ossl_x509name *namep = NULL;
X509_NAME *name = NULL;
VALUE obj;
@@ -120,31 +99,35 @@ ossl_x509name_s_new_from_hash(VALUE klass, VALUE hash)
OSSL_Raise(eX509NameError, "");
st_foreach(RHASH(hash)->tbl, ossl_x509name_hash_i, name);
-
- MakeX509Name(obj, namep);
- namep->name = name;
-
+
+ WrapX509Name(obj, name);
+
return obj;
}
static VALUE
ossl_x509name_to_h(VALUE self)
{
- ossl_x509name *namep = NULL;
+ X509_NAME *name = NULL;
X509_NAME_ENTRY *entry = NULL;
int i,entries = 0;
char long_name[512];
const char *short_name = NULL;
VALUE hash;
- GetX509Name(self, namep);
+ GetX509Name(self, name);
- entries = X509_NAME_entry_count(namep->name);
+ entries = X509_NAME_entry_count(name);
hash = rb_hash_new();
+ if (entries < 0) {
+ rb_warning("name entries < 0!");
+ return hash;
+ }
+
for (i=0; i<entries; i++) {
- if (!(entry = X509_NAME_get_entry(namep->name, i))) {
+ if (!(entry = X509_NAME_get_entry(name, i))) {
OSSL_Raise(eX509NameError, "");
}
if (!i2t_ASN1_OBJECT(long_name, sizeof(long_name), entry->object)) {