diff options
Diffstat (limited to 'crypto/af_alg.c')
| -rw-r--r-- | crypto/af_alg.c | 11 | 
1 files changed, 8 insertions, 3 deletions
| diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 28fc323e3fe3..5882ed46f1ad 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -635,6 +635,7 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,  	if (!ctx->used)  		ctx->merge = 0; +	ctx->init = ctx->more;  }  EXPORT_SYMBOL_GPL(af_alg_pull_tsgl); @@ -734,9 +735,10 @@ EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup);   *   * @sk socket of connection to user space   * @flags If MSG_DONTWAIT is set, then only report if function would sleep + * @min Set to minimum request size if partial requests are allowed.   * @return 0 when writable memory is available, < 0 upon error   */ -int af_alg_wait_for_data(struct sock *sk, unsigned flags) +int af_alg_wait_for_data(struct sock *sk, unsigned flags, unsigned min)  {  	DEFINE_WAIT_FUNC(wait, woken_wake_function);  	struct alg_sock *ask = alg_sk(sk); @@ -754,7 +756,9 @@ int af_alg_wait_for_data(struct sock *sk, unsigned flags)  		if (signal_pending(current))  			break;  		timeout = MAX_SCHEDULE_TIMEOUT; -		if (sk_wait_event(sk, &timeout, (ctx->used || !ctx->more), +		if (sk_wait_event(sk, &timeout, +				  ctx->init && (!ctx->more || +						(min && ctx->used >= min)),  				  &wait)) {  			err = 0;  			break; @@ -843,10 +847,11 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,  	}  	lock_sock(sk); -	if (!ctx->more && ctx->used) { +	if (ctx->init && (init || !ctx->more)) {  		err = -EINVAL;  		goto unlock;  	} +	ctx->init = true;  	if (init) {  		ctx->enc = enc; | 
