diff options
Diffstat (limited to 'net/tls/tls_main.c')
| -rw-r--r-- | net/tls/tls_main.c | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index e07ee3ae0023..736719c8314e 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c @@ -367,8 +367,10 @@ static int do_tls_setsockopt_tx(struct sock *sk, char __user *optval,  	crypto_info = &ctx->crypto_send;  	/* Currently we don't support set crypto info more than one time */ -	if (TLS_CRYPTO_INFO_READY(crypto_info)) +	if (TLS_CRYPTO_INFO_READY(crypto_info)) { +		rc = -EBUSY;  		goto out; +	}  	rc = copy_from_user(crypto_info, optval, sizeof(*crypto_info));  	if (rc) { @@ -386,7 +388,7 @@ static int do_tls_setsockopt_tx(struct sock *sk, char __user *optval,  	case TLS_CIPHER_AES_GCM_128: {  		if (optlen != sizeof(struct tls12_crypto_info_aes_gcm_128)) {  			rc = -EINVAL; -			goto out; +			goto err_crypto_info;  		}  		rc = copy_from_user(crypto_info + 1, optval + sizeof(*crypto_info),  				    optlen - sizeof(*crypto_info)); @@ -398,7 +400,7 @@ static int do_tls_setsockopt_tx(struct sock *sk, char __user *optval,  	}  	default:  		rc = -EINVAL; -		goto out; +		goto err_crypto_info;  	}  	/* currently SW is default, we will have ethtool in future */ @@ -454,6 +456,15 @@ static int tls_init(struct sock *sk)  	struct tls_context *ctx;  	int rc = 0; +	/* The TLS ulp is currently supported only for TCP sockets +	 * in ESTABLISHED state. +	 * Supporting sockets in LISTEN state will require us +	 * to modify the accept implementation to clone rather then +	 * share the ulp context. +	 */ +	if (sk->sk_state != TCP_ESTABLISHED) +		return -ENOTSUPP; +  	/* allocate tls context */  	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);  	if (!ctx) { |