Author: mturk
Date: Sat Sep 24 09:35:15 2011
New Revision: 1175136
URL: http://svn.apache.org/viewvc?rev=1175136&view=rev
Log:
Add reference counting to core openssl objects
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h?rev=1175136&r1=1175135&r2=1175136&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h Sat Sep 24
09:35:15 2011
@@ -294,6 +294,24 @@ typedef struct ssl_pass_cb_t {
char buf[256];
} ssl_pass_cb_t;
+#define ACR_SSL_OBJ_X509 1
+#define ACR_SSL_OBJ_EVP_PKEY 2
+#define ACR_SSL_OBJ_X509_STORE 3
+#define ACR_SSL_OBJ_X509_NAMES 4
+
+typedef struct ssl_obj_t {
+ acr_refcount_t refs;
+ int type;
+ union {
+ X509 *x509;
+ EVP_PKEY *pkey;
+ X509_STORE *store;
+ STACK_OF(X509_NAME) *names;
+ void *any;
+ } u;
+} ssl_obj_t;
+
+
/* Default password callback that
* directly prompts the console
*/
@@ -303,14 +321,13 @@ typedef struct acr_ssl_srv_t acr_ssl_
/* SSL context */
typedef struct acr_ssl_ctx_t {
+ acr_refcount_t refs;
+ int inited;
+ /* acr_ssl_obj_t */
SSL_CTX *ctx;
/* Pointer to the context verify store */
X509_STORE *store;
- volatile acr_atomic32_t refs;
- /* Inited is set when the context is validated
- * and ready to use.
- */
- int inited;
+
int protocol;
int mode;
int ssl_proxy;
@@ -374,9 +391,10 @@ typedef struct acr_ssl_ctx_t {
/* Server context */
struct acr_ssl_srv_t {
+ acr_refcount_t refs;
+ int inited;
acr_ssl_ctx_t *ctx;
- acr_ssl_ctx_t *ctx2;
- acr_refcount_t refs;
+ acr_ssl_ctx_t *ctx2;
char *servname;
char *hostid;
BIO *bio;
@@ -462,6 +480,8 @@ int ssl_rand_seed(const char *fi
int ssl_load_pkcs12(BIO *, ssl_pass_cb_t *, EVP_PKEY **, X509 **,
STACK_OF(X509) **);
void ssl_throw_errno(JNI_STDENV, int cls);
void ssl_throw_errno_ex(JNI_STDENV, int cls, const char *fmt, ...);
+int ssl_obj_release(ssl_obj_t *);
+ssl_obj_t *ssl_obj_new(JNI_STDENV, int, void *);
#endif
#endif /* _ACR_SSL_H_ */
Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c?rev=1175136&r1=1175135&r2=1175136&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c Sat
Sep 24 09:35:15 2011
@@ -89,8 +89,8 @@ ACR_SSL_EXPORT(jlong, SSLCertificate, lo
ssl_throw_errno(env, ACR_EX_ESSLBADCERT);
} DONE_WITH_STR(desc);
} DONE_WITH_STR(file);
-
- return P2J(cert);
+
+ return P2J(ssl_obj_new(env, ACR_SSL_OBJ_X509, cert));
}
ACR_SSL_EXPORT(jlong, SSLCertificate, load1)(JNI_STDARGS, jstring file,
@@ -113,10 +113,10 @@ ACR_SSL_EXPORT(jlong, SSLCertificate, lo
} DONE_WITH_STR(password);
} DONE_WITH_STR(file);
- return P2J(cert);
+ return P2J(ssl_obj_new(env, ACR_SSL_OBJ_X509, cert));
}
ACR_SSL_EXPORT(void, SSLCertificate, free0)(JNI_STDARGS, jlong key)
{
- X509_free(J2P(key, X509 *));
+ ssl_obj_release(J2P(key, void *));
}
Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c?rev=1175136&r1=1175135&r2=1175136&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c Sat Sep
24 09:35:15 2011
@@ -91,7 +91,7 @@ ACR_SSL_EXPORT(jlong, SSLKey, load0)(JNI
} DONE_WITH_STR(desc);
} DONE_WITH_STR(file);
- return P2J(key);
+ return P2J(ssl_obj_new(env, ACR_SSL_OBJ_EVP_PKEY, key));
}
ACR_SSL_EXPORT(jlong, SSLKey, load1)(JNI_STDARGS, jstring file,
@@ -114,10 +114,10 @@ ACR_SSL_EXPORT(jlong, SSLKey, load1)(JNI
} DONE_WITH_STR(password);
} DONE_WITH_STR(file);
- return P2J(key);
+ return P2J(ssl_obj_new(env, ACR_SSL_OBJ_EVP_PKEY, key));
}
ACR_SSL_EXPORT(void, SSLKey, free0)(JNI_STDARGS, jlong key)
{
- EVP_PKEY_free(J2P(key, EVP_PKEY *));
+ ssl_obj_release(J2P(key, void *));
}
Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c?rev=1175136&r1=1175135&r2=1175136&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c Sat
Sep 24 09:35:15 2011
@@ -452,3 +452,58 @@ void ssl_throw_errno(JNI_STDENV, int cls
{
ssl_throw_errno_ex(env, cls, 0);
}
+
+int ssl_obj_release(ssl_obj_t *ob)
+{
+ if (ob == 0)
+ return 0;
+ if (AcrAtomic32Dec(&ob->refs) != 0)
+ return 0;
+ if (ob->u.any == 0)
+ ob->type = 0;
+ switch(ob->type) {
+ case ACR_SSL_OBJ_X509:
+ X509_free(ob->u.x509);
+ break;
+ case ACR_SSL_OBJ_EVP_PKEY:
+ EVP_PKEY_free(ob->u.pkey);
+ break;
+ case ACR_SSL_OBJ_X509_STORE:
+ X509_STORE_free(ob->u.store);
+ break;
+ default:
+ break;
+ }
+ AcrFree(ob);
+ return 1;
+}
+
+ssl_obj_t *ssl_obj_new(JNI_STDENV, int type, void *ctx)
+{
+ ssl_obj_t *o;
+
+ if (ctx == 0)
+ return 0;
+ o = ACR_TALLOC(ssl_obj_t);
+ if (o == 0) {
+ switch(type) {
+ case ACR_SSL_OBJ_X509:
+ X509_free(ctx);
+ break;
+ case ACR_SSL_OBJ_EVP_PKEY:
+ EVP_PKEY_free(ctx);
+ break;
+ case ACR_SSL_OBJ_X509_STORE:
+ X509_STORE_free(ctx);
+ break;
+ default:
+ break;
+ }
+ }
+ else {
+ o->refs = 1;
+ o->type = type;
+ o->u.any = ctx;
+ }
+ return o;
+}