From bde3ec012ede47fb16ddc03c0a847df53fc86c30 Mon Sep 17 00:00:00 2001 From: Miloslav Trmač Date: Wed, 15 Dec 2010 14:24:10 +0100 Subject: Use SOCK_CLOEXEC to avoid leaking FDs This requires _GNU_SOURCE, which in turn requires renaming the "encrypt" identifier to avoid a conflict with a function from . --- lib/ncrypto_alg.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'lib') 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 -- cgit