Skip to content

Commit 230db54

Browse files
committed
Fixed another "There is already an open DataReader" error
X509CertificateDatabase.Find(...) methods keep the DataReader open until we break out of the foreach loop and CreateCmsSigner(record) invokes another db command, so we need to break out of the foreach loop before calling CreateCmsSigner(record). Fixes #1142 (comment)
1 parent 5c4db26 commit 230db54

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

MimeKit/Cryptography/DefaultSecureMimeContext.cs

+8-3
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@ CmsSigner CreateCmsSigner (X509CertificateRecord record, DigestAlgorithm digestA
559559
protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorithm digestAlgo)
560560
{
561561
X509CertificateRecord domain = null;
562+
X509CertificateRecord signer = null;
562563

563564
foreach (var record in dbase.Find (mailbox, DateTime.UtcNow, true, CmsSignerFields)) {
564565
if (record.KeyUsage != X509KeyUsageFlags.None && (record.KeyUsage & DigitalSignatureKeyUsageFlags) == 0)
@@ -573,11 +574,15 @@ protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorit
573574
continue;
574575
}
575576

576-
return CreateCmsSigner (record, digestAlgo);
577+
signer = record;
578+
break;
577579
}
578580

579-
if (domain != null)
580-
return CreateCmsSigner (domain, digestAlgo);
581+
// fall back to a domain-wide signing certificate if an explicit signer was not found
582+
signer ??= domain;
583+
584+
if (signer != null)
585+
return CreateCmsSigner (signer, digestAlgo);
581586

582587
throw new CertificateNotFoundException (mailbox, "A valid signing certificate could not be found.");
583588
}

0 commit comments

Comments
 (0)