diff options
Diffstat (limited to 'crypto/algapi.c')
| -rw-r--r-- | crypto/algapi.c | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c index aa699ff6c876..9a636f961572 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -167,6 +167,18 @@ void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,  			spawn->alg = NULL;  			spawns = &inst->alg.cra_users; + +			/* +			 * We may encounter an unregistered instance here, since +			 * an instance's spawns are set up prior to the instance +			 * being registered.  An unregistered instance will have +			 * NULL ->cra_users.next, since ->cra_users isn't +			 * properly initialized until registration.  But an +			 * unregistered instance cannot have any users, so treat +			 * it the same as ->cra_users being empty. +			 */ +			if (spawns->next == NULL) +				break;  		}  	} while ((spawns = crypto_more_spawns(alg, &stack, &top,  					      &secondary_spawns))); @@ -897,9 +909,11 @@ int crypto_enqueue_request(struct crypto_queue *queue,  	int err = -EINPROGRESS;  	if (unlikely(queue->qlen >= queue->max_qlen)) { -		err = -EBUSY; -		if (!(request->flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) +		if (!(request->flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { +			err = -ENOSPC;  			goto out; +		} +		err = -EBUSY;  		if (queue->backlog == &queue->list)  			queue->backlog = &request->list;  	}  |