public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Thomas Deutschmann" <whissi@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-libs/nss/, dev-libs/nss/files/
Date: Tue,  1 Dec 2020 16:56:41 +0000 (UTC)	[thread overview]
Message-ID: <1606841796.d3f2cba10c86d044abad85e9b00b539e365eca8f.whissi@gentoo> (raw)

commit:     d3f2cba10c86d044abad85e9b00b539e365eca8f
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Tue Dec  1 16:53:52 2020 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Tue Dec  1 16:56:36 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d3f2cba1

dev-libs/nss: don't hold slot lock when taking session lock

Closes: https://bugs.gentoo.org/756244
Package-Manager: Portage-3.0.10, Repoman-3.0.2
Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 ...t-hold-slot-lock-when-taking-session-lock.patch | 93 ++++++++++++++++++++++
 .../nss/{nss-3.59.ebuild => nss-3.59-r1.ebuild}    |  1 +
 2 files changed, 94 insertions(+)

diff --git a/dev-libs/nss/files/nss-3.59-dont-hold-slot-lock-when-taking-session-lock.patch b/dev-libs/nss/files/nss-3.59-dont-hold-slot-lock-when-taking-session-lock.patch
new file mode 100644
index 00000000000..be4ebfe4796
--- /dev/null
+++ b/dev-libs/nss/files/nss-3.59-dont-hold-slot-lock-when-taking-session-lock.patch
@@ -0,0 +1,93 @@
+
+# HG changeset patch
+# User Kevin Jacobs <kjacobs@mozilla.com>
+# Date 1606813429 0
+# Node ID 19585ccc7a1f0f4e9a8d2b9c5ceeb408ea90acb9
+# Parent  f1e48fbead3d9e69500d7aedc1ef6e4bf334f41e
+Bug 1679290 - Don't hold slot lock when taking session lock r=bbeurdouche
+
+[[ https://hg.mozilla.org/projects/nss/rev/0ed11a5835ac1556ff978362cd61069d48f4c5db | 0ed11a5835ac1556ff978362cd61069d48f4c5db ]] fixed a number of race conditions related to NSSSlot member accesses. Unfortunately the locking order that was imposed by that patch has been found to cause problems for at least one PKCS11 module, libnsspem.
+
+This patch drops nested locking in favor of unlocking/re-locking. While this isn't perfect, the original problem in bug 1663661 was that `slot->token` could become NULL, which we can easily check after reacquiring.
+
+Differential Revision: https://phabricator.services.mozilla.com/D98247
+
+diff --git a/lib/dev/devslot.c b/lib/dev/devslot.c
+--- a/lib/dev/devslot.c
++++ b/lib/dev/devslot.c
+@@ -183,25 +183,32 @@ nssSlot_IsTokenPresent(
+     if ((slot->ckFlags & CKF_TOKEN_PRESENT) == 0) {
+         if (!slot->token) {
+             /* token was never present */
+             isPresent = PR_FALSE;
+             goto done; /* slot lock held */
+         }
+         session = nssToken_GetDefaultSession(slot->token);
+         if (session) {
++            nssSlot_ExitMonitor(slot);
+             nssSession_EnterMonitor(session);
+             /* token is not present */
+             if (session->handle != CK_INVALID_HANDLE) {
+                 /* session is valid, close and invalidate it */
+                 CKAPI(epv)
+                     ->C_CloseSession(session->handle);
+                 session->handle = CK_INVALID_HANDLE;
+             }
+             nssSession_ExitMonitor(session);
++            nssSlot_EnterMonitor(slot);
++            if (!slot->token) {
++                /* Check token presence after re-acquiring lock */
++                isPresent = PR_FALSE;
++                goto done; /* slot lock held */
++            }
+         }
+         if (slot->token->base.name[0] != 0) {
+             /* notify the high-level cache that the token is removed */
+             slot->token->base.name[0] = 0; /* XXX */
+             nssToken_NotifyCertsNotVisible(slot->token);
+         }
+         slot->token->base.name[0] = 0; /* XXX */
+         /* clear the token cache */
+@@ -218,34 +225,41 @@ nssSlot_IsTokenPresent(
+     }
+ 
+     /* token is present, use the session info to determine if the card
+      * has been removed and reinserted.
+      */
+     session = nssToken_GetDefaultSession(slot->token);
+     if (session) {
+         PRBool tokenRemoved;
++        nssSlot_ExitMonitor(slot);
+         nssSession_EnterMonitor(session);
+         if (session->handle != CK_INVALID_HANDLE) {
+             CK_SESSION_INFO sessionInfo;
+             ckrv = CKAPI(epv)->C_GetSessionInfo(session->handle, &sessionInfo);
+             if (ckrv != CKR_OK) {
+                 /* session is screwy, close and invalidate it */
+                 CKAPI(epv)
+                     ->C_CloseSession(session->handle);
+                 session->handle = CK_INVALID_HANDLE;
+             }
+         }
+         tokenRemoved = (session->handle == CK_INVALID_HANDLE);
+         nssSession_ExitMonitor(session);
++        nssSlot_EnterMonitor(slot);
+         /* token not removed, finished */
+         if (!tokenRemoved) {
+             isPresent = PR_TRUE;
+             goto done; /* slot lock held */
+         }
++        if (!slot->token) {
++            /* Check token presence after re-acquiring lock */
++            isPresent = PR_FALSE;
++            goto done; /* slot lock held */
++        }
+     }
+     /* the token has been removed, and reinserted, or the slot contains
+      * a token it doesn't recognize. invalidate all the old
+      * information we had on this token, if we can't refresh, clear
+      * the present flag */
+     nssToken_NotifyCertsNotVisible(slot->token);
+     nssToken_Remove(slot->token);
+     /* token has been removed, need to refresh with new session */
+

diff --git a/dev-libs/nss/nss-3.59.ebuild b/dev-libs/nss/nss-3.59-r1.ebuild
similarity index 99%
rename from dev-libs/nss/nss-3.59.ebuild
rename to dev-libs/nss/nss-3.59-r1.ebuild
index 37ab7c58696..82184ff8a71 100644
--- a/dev-libs/nss/nss-3.59.ebuild
+++ b/dev-libs/nss/nss-3.59-r1.ebuild
@@ -40,6 +40,7 @@ PATCHES=(
 	"${FILESDIR}/${PN}-3.21-gentoo-fixup-warnings.patch"
 	"${FILESDIR}/${PN}-3.23-hppa-byte_order.patch"
 	"${FILESDIR}/${PN}-3.53-fix-building-on-ppc.patch"
+	"${FILESDIR}/${PN}-3.59-dont-hold-slot-lock-when-taking-session-lock.patch"
 )
 
 src_prepare() {


             reply	other threads:[~2020-12-01 16:56 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-01 16:56 Thomas Deutschmann [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-08-02 13:21 [gentoo-commits] repo/gentoo:master commit in: dev-libs/nss/, dev-libs/nss/files/ Joonas Niilola
2024-04-15  6:40 Joonas Niilola
2024-03-17  8:18 Joonas Niilola
2023-02-10  8:57 Joonas Niilola
2022-11-01  8:49 Joonas Niilola
2021-04-16 11:34 Thomas Deutschmann
2021-01-09 13:53 Lars Wendler
2020-08-30 22:57 Thomas Deutschmann
2020-06-28 19:05 Thomas Deutschmann
2019-10-20 14:54 Lars Wendler
2019-01-22 20:04 Ian Stakenvicius
2019-01-18 15:37 Lars Wendler
2018-03-05 20:47 Ian Stakenvicius
2017-07-30 14:32 Jory Pratt
2017-01-19 15:41 Ian Stakenvicius
2016-12-23  9:57 Lars Wendler
2016-12-23  9:57 Lars Wendler
2015-11-26 21:56 Jory Pratt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1606841796.d3f2cba10c86d044abad85e9b00b539e365eca8f.whissi@gentoo \
    --to=whissi@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox