return 0;
}
+/* Returns:
+ * - negative error code on error,
+ * - 0 on success
+ * - 1 on success (and a fork was detected)
+ */
int _gnutls_pkcs11_check_init(void)
{
int ret;
if (init_pid != getpid()) {
/* if we are initialized but a fork is detected */
ret = gnutls_pkcs11_reinit();
+ if (ret == 0)
+ ret = 1;
}
#endif
#include <fips.h>
#include <p11-kit/uri.h>
+/* In case of a fork, it will invalidate the open session
+ * in privkey */
+#define PKCS11_CHECK_INIT_PRIVKEY(k) \
+ ret = _gnutls_pkcs11_check_init(); \
+ if (ret < 0) \
+ return gnutls_assert_val(ret); \
+ if (ret == 1) \
+ memset(&k->sinfo, 0, sizeof(k->sinfo))
+
struct gnutls_pkcs11_privkey_st {
gnutls_pk_algorithm_t pk_algorithm;
unsigned int flags;
struct pkcs11_session_info *sinfo;
ck_object_handle_t obj;
- PKCS11_CHECK_INIT;
+ PKCS11_CHECK_INIT_PRIVKEY(key);
if (key->sinfo.init != 0) {
sinfo = &key->sinfo;
ck_object_handle_t obj;
struct ck_session_info session_info;
- PKCS11_CHECK_INIT;
+ PKCS11_CHECK_INIT_PRIVKEY(key);
if (key->sinfo.init != 0) {
sinfo = &key->sinfo;
struct pkcs11_session_info _sinfo;
struct pkcs11_session_info *sinfo;
- PKCS11_CHECK_INIT;
+ PKCS11_CHECK_INIT_PRIVKEY(key);
if (key->sinfo.init != 0) {
sinfo = &key->sinfo;
ret = 0;
cleanup:
- if (key->sinfo.init == 0)
+ if (sinfo != &key->sinfo)
pkcs11_close_session(sinfo);
return ret;
gnutls_pkcs11_obj_deinit(obj);
if (pkey != NULL)
gnutls_pubkey_deinit(pkey);
+
if (sinfo.pks != 0)
pkcs11_close_session(&sinfo);