Author: jhb
Date: Mon Oct 19 20:04:03 2020
New Revision: 366852
URL: https://svnweb.freebsd.org/changeset/base/366852

Log:
  Fix a couple of bugs for asym crypto introduced in r359374.
  
  - Check for null pointers in the crypto_drivers[] array when checking
    for empty slots in crypto_select_kdriver().
  
  - Handle the case where crypto_kdone() is invoked on a request where
    krq_cap is NULL due to not finding a matching driver.
  
  Reviewed by:  markj
  Sponsored by: Chelsio Communications
  Differential Revision:        https://reviews.freebsd.org/D26811

Modified:
  head/sys/opencrypto/crypto.c

Modified: head/sys/opencrypto/crypto.c
==============================================================================
--- head/sys/opencrypto/crypto.c        Mon Oct 19 19:51:03 2020        
(r366851)
+++ head/sys/opencrypto/crypto.c        Mon Oct 19 20:04:03 2020        
(r366852)
@@ -1540,7 +1540,7 @@ again:
                 * match), then skip.
                 */
                cap = crypto_drivers[hid];
-               if (cap->cc_dev == NULL ||
+               if (cap == NULL ||
                    (cap->cc_flags & match) == 0)
                        continue;
 
@@ -1880,15 +1880,18 @@ crypto_kdone(struct cryptkop *krp)
 
        if (krp->krp_status != 0)
                CRYPTOSTAT_INC(cs_kerrs);
-       CRYPTO_DRIVER_LOCK();
        cap = krp->krp_cap;
-       KASSERT(cap->cc_koperations > 0, ("cc_koperations == 0"));
-       cap->cc_koperations--;
-       if (cap->cc_koperations == 0 && cap->cc_flags & CRYPTOCAP_F_CLEANUP)
-               wakeup(cap);
-       CRYPTO_DRIVER_UNLOCK();
-       krp->krp_cap = NULL;
-       cap_rele(cap);
+       if (cap != NULL) {
+               CRYPTO_DRIVER_LOCK();
+               KASSERT(cap->cc_koperations > 0, ("cc_koperations == 0"));
+               cap->cc_koperations--;
+               if (cap->cc_koperations == 0 &&
+                   cap->cc_flags & CRYPTOCAP_F_CLEANUP)
+                       wakeup(cap);
+               CRYPTO_DRIVER_UNLOCK();
+               krp->krp_cap = NULL;
+               cap_rele(cap);
+       }
 
        ret_worker = CRYPTO_RETW(0);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to