summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-12-15 14:24:10 +0100
committerMiloslav Trmač <mitr@redhat.com>2010-12-15 14:24:10 +0100
commitbde3ec012ede47fb16ddc03c0a847df53fc86c30 (patch)
tree43c71272c1114d0799cb567cef461e8a581222a4
parent81de29993fdecd28a749411969e30eb3d536c36a (diff)
downloadncrypto-bde3ec012ede47fb16ddc03c0a847df53fc86c30.tar.gz
ncrypto-bde3ec012ede47fb16ddc03c0a847df53fc86c30.tar.xz
ncrypto-bde3ec012ede47fb16ddc03c0a847df53fc86c30.zip
Use SOCK_CLOEXEC to avoid leaking FDsHEADmaster
This requires _GNU_SOURCE, which in turn requires renaming the "encrypt" identifier to avoid a conflict with a function from <crypt.h>.
-rw-r--r--configure.ac1
-rw-r--r--lib/ncrypto_alg.c48
2 files changed, 25 insertions, 24 deletions
diff --git a/configure.ac b/configure.ac
index ed53177..47bd1e2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -42,6 +42,7 @@ AM_PROG_CC_C_O
# This interface seems to be undocumented, but bison uses it ;-)
AM_MISSING_PROG([AUTOM4TE], [autom4te])
+AC_USE_SYSTEM_EXTENSIONS
LT_INIT([disable-static])
# Checks for libraries.
diff --git a/lib/ncrypto_alg.c b/lib/ncrypto_alg.c
index bc72383..1277575 100644
--- a/lib/ncrypto_alg.c
+++ b/lib/ncrypto_alg.c
@@ -117,7 +117,7 @@ ncr_digest_alloc (struct ncr_digest_session **sess, CK_MECHANISM_TYPE mech)
if (res != CKR_OK)
goto err_s;
- top_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ top_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (top_fd == -1)
{
res = ckr_errno ();
@@ -129,7 +129,7 @@ ncr_digest_alloc (struct ncr_digest_session **sess, CK_MECHANISM_TYPE mech)
goto err_top_fd;
}
- s->fd = accept (top_fd, NULL, 0);
+ s->fd = accept4 (top_fd, NULL, 0, SOCK_CLOEXEC);
if (s->fd == -1)
{
res = ckr_errno ();
@@ -174,7 +174,7 @@ ncr_digest_clone (struct ncr_digest_session **clone,
if (c == NULL)
return CKR_HOST_MEMORY;
- c->fd = accept (sess->fd, NULL, 0);
+ c->fd = accept4 (sess->fd, NULL, 0, SOCK_CLOEXEC);
if (c->fd == -1)
{
free (c);
@@ -326,12 +326,12 @@ ncr_digest_standalone (CK_MECHANISM_TYPE mech, void *dest,
g_return_val_if_fail (data != NULL, CKR_ARGUMENTS_BAD);
g_return_val_if_fail (data_size <= SSIZE_MAX, CKR_ARGUMENTS_BAD);
- top_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ top_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (top_fd == -1)
return ckr_errno ();
if (bind (top_fd, (struct sockaddr *)sa, sizeof (*sa)) != 0)
goto err_top_fd;
- fd = accept (top_fd, NULL, 0);
+ fd = accept4 (top_fd, NULL, 0, SOCK_CLOEXEC);
if (fd == -1)
goto err_top_fd;
(void)close (top_fd);
@@ -432,7 +432,7 @@ ncr_symm_signature_alloc (struct ncr_symm_signature_session **sess,
if (res != CKR_OK)
goto err_s;
- s->parent_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ s->parent_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (s->parent_fd == -1)
{
res = ckr_errno ();
@@ -494,7 +494,7 @@ ncr_symm_signature_clone (struct ncr_symm_signature_session **clone,
Therefore, create an entirely new parent_fd for _both_ clones. The
"old" parent_fd will be implicitly referred to by child_fd of both clones,
but any session reinitialization will use the new parent_fd values. */
- new_sess_parent_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ new_sess_parent_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (new_sess_parent_fd == -1)
{
res = ckr_errno ();
@@ -507,7 +507,7 @@ ncr_symm_signature_clone (struct ncr_symm_signature_session **clone,
goto err_new_sess_parent_fd;
}
- c->parent_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ c->parent_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (c->parent_fd == -1)
{
res = ckr_errno ();
@@ -519,7 +519,7 @@ ncr_symm_signature_clone (struct ncr_symm_signature_session **clone,
goto err_c_parent_fd;
}
- c->child_fd = accept (sess->child_fd, NULL, 0);
+ c->child_fd = accept4 (sess->child_fd, NULL, 0, SOCK_CLOEXEC);
if (c->child_fd == -1)
{
res = ckr_errno ();
@@ -564,7 +564,7 @@ symm_signature_init (struct ncr_symm_signature_session *sess, bool sign,
key->size) != 0)
return ckr_errno ();
- sess->child_fd = accept (sess->parent_fd, NULL, 0);
+ sess->child_fd = accept4 (sess->parent_fd, NULL, 0, SOCK_CLOEXEC);
if (sess->child_fd == -1)
return ckr_errno ();
@@ -861,7 +861,7 @@ ncr_symm_cipher_alloc (struct ncr_symm_cipher_session **sess,
if (s == NULL)
return CKR_HOST_MEMORY;
- s->parent_fd = socket (AF_ALG, SOCK_SEQPACKET, 0);
+ s->parent_fd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
if (s->parent_fd == -1)
{
res = ckr_errno ();
@@ -943,7 +943,7 @@ ncr_symm_cipher_change_iv (struct ncr_symm_cipher_session *sess, const void *iv,
}
static CK_RV
-symm_cipher_init (struct ncr_symm_cipher_session *sess, bool encrypt,
+symm_cipher_init (struct ncr_symm_cipher_session *sess, bool encrypting,
struct ncr_symm_key *key, const void *param,
size_t param_size)
{
@@ -987,7 +987,7 @@ symm_cipher_init (struct ncr_symm_cipher_session *sess, bool encrypt,
key->size) != 0)
return ckr_errno ();
- sess->child_fd = accept (sess->parent_fd, NULL, 0);
+ sess->child_fd = accept4 (sess->parent_fd, NULL, 0, SOCK_CLOEXEC);
if (sess->child_fd == -1)
return ckr_errno ();
@@ -1019,13 +1019,13 @@ symm_cipher_init (struct ncr_symm_cipher_session *sess, bool encrypt,
return res;
}
- sess->encrypting = encrypt;
+ sess->encrypting = encrypting;
sess->state = NSCS_INITIALIZED;
return CKR_OK;
}
static CK_RV
-symm_cipher_update (struct ncr_symm_cipher_session *sess, bool encrypt,
+symm_cipher_update (struct ncr_symm_cipher_session *sess, bool encrypting,
void *dest, size_t *dest_size_ptr, const void *src,
size_t src_size)
{
@@ -1042,7 +1042,7 @@ symm_cipher_update (struct ncr_symm_cipher_session *sess, bool encrypt,
g_return_val_if_fail (sess->state == NSCS_INITIALIZED
|| sess->state == NSCS_UPDATED,
CKR_OPERATION_NOT_INITIALIZED);
- g_return_val_if_fail (sess->encrypting == encrypt,
+ g_return_val_if_fail (sess->encrypting == encrypting,
CKR_OPERATION_NOT_INITIALIZED);
if (dest == NULL)
@@ -1101,7 +1101,7 @@ symm_cipher_update (struct ncr_symm_cipher_session *sess, bool encrypt,
/* EVP_CipherUpdate + EVP_CipherFinal_ex */
static CK_RV
do_symm_cipher_update_final (struct ncr_symm_cipher_session *sess,
- bool encrypt, void *dest, size_t *dest_size_ptr,
+ bool encrypting, void *dest, size_t *dest_size_ptr,
const void *src, size_t src_size)
{
size_t done;
@@ -1115,7 +1115,7 @@ do_symm_cipher_update_final (struct ncr_symm_cipher_session *sess,
/* The caller has verified session and its state. */
g_return_val_if_fail (dest_size_ptr != NULL, CKR_ARGUMENTS_BAD);
g_return_val_if_fail (src_size <= SSIZE_MAX, CKR_ARGUMENTS_BAD);
- g_return_val_if_fail (sess->encrypting == encrypt,
+ g_return_val_if_fail (sess->encrypting == encrypting,
CKR_OPERATION_NOT_INITIALIZED);
if (dest == NULL)
@@ -1182,7 +1182,7 @@ do_symm_cipher_update_final (struct ncr_symm_cipher_session *sess,
}
static CK_RV
-symm_cipher_final (struct ncr_symm_cipher_session *sess, bool encrypt,
+symm_cipher_final (struct ncr_symm_cipher_session *sess, bool encrypting,
void *dest, size_t *dest_size_ptr, const void *src,
size_t src_size)
{
@@ -1191,20 +1191,20 @@ symm_cipher_final (struct ncr_symm_cipher_session *sess, bool encrypt,
|| sess->state == NSCS_UPDATED,
CKR_OPERATION_NOT_INITIALIZED);
- return do_symm_cipher_update_final (sess, encrypt, dest, dest_size_ptr, src,
- src_size);
+ return do_symm_cipher_update_final (sess, encrypting, dest, dest_size_ptr,
+ src, src_size);
}
static CK_RV
-symm_cipher (struct ncr_symm_cipher_session *sess, bool encrypt, void *dest,
+symm_cipher (struct ncr_symm_cipher_session *sess, bool encrypting, void *dest,
size_t *dest_size_ptr, const void *src, size_t src_size)
{
g_return_val_if_fail (sess != NULL, CKR_SESSION_HANDLE_INVALID);
g_return_val_if_fail (sess->state == NSCS_INITIALIZED,
CKR_OPERATION_NOT_INITIALIZED);
- return do_symm_cipher_update_final (sess, encrypt, dest, dest_size_ptr, src,
- src_size);
+ return do_symm_cipher_update_final (sess, encrypting, dest, dest_size_ptr,
+ src, src_size);
}
CK_RV