guchar pk[crypto_box_PUBLICKEYBYTES];
guchar sk[crypto_box_SECRETKEYBYTES];
guchar id[BLAKE2B_OUTBYTES];
+ ref_entry_t ref;
};
struct rspamd_http_connection_private {
rspamd_http_connection_reset (conn);
if (priv->local_key) {
- g_slice_free1 (sizeof (*priv->local_key), priv->local_key);
+ REF_RELEASE (priv->local_key);
}
g_slice_free1 (sizeof (struct rspamd_http_connection_private), priv);
}
}
+static void
+rspamd_http_keypair_dtor (struct rspamd_http_keypair *kp)
+{
+ g_slice_free1 (sizeof (*kp), kp);
+}
+
gpointer
rspamd_http_connection_make_key (gchar *key, gsize keylen)
{
if (decoded != NULL) {
if (decoded_len == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES) {
kp = g_slice_alloc (sizeof (*kp));
+ REF_INIT_RETAIN (kp, rspamd_http_keypair_dtor);
memcpy (kp->sk, decoded, crypto_box_SECRETKEYBYTES);
memcpy (kp->pk, decoded + crypto_box_SECRETKEYBYTES,
crypto_box_PUBLICKEYBYTES);
struct rspamd_http_keypair *kp = (struct rspamd_http_keypair *)key;
g_assert (key != NULL);
+ REF_RETAIN (kp);
priv->local_key = kp;
}
+
+void
+rspamd_http_connection_key_destroy (gpointer key)
+{
+ struct rspamd_http_keypair *kp = (struct rspamd_http_keypair *)key;
+
+ g_assert (key != NULL);
+ REF_RELEASE (kp);
+}
*/
void rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
gpointer key);
+/**
+ * Release key pointed by an opaque pointer
+ * @param key opaque key structure
+ */
+void rspamd_http_connection_key_destroy (gpointer key);
/**
* Handle a request using socket fd and user data ud