diff --git a/drivers/net/ovpn/socket.c b/drivers/net/ovpn/socket.c
index a83cbab72591..ff499f0fc771 100644
--- a/drivers/net/ovpn/socket.c
+++ b/drivers/net/ovpn/socket.c
@@ -66,6 +66,7 @@ static bool ovpn_socket_put(struct ovpn_peer *peer, struct ovpn_socket *sock)
 void ovpn_socket_release(struct ovpn_peer *peer)
 {
 	struct ovpn_socket *sock;
+	u16 sk_protocol;
 	bool released;
 
 	might_sleep();
@@ -92,6 +93,7 @@ void ovpn_socket_release(struct ovpn_peer *peer)
 	 */
 	lock_sock(sock->sock->sk);
 	released = ovpn_socket_put(peer, sock);
+	sk_protocol = sock->sock->sk->sk_protocol;
 	release_sock(sock->sock->sk);
 
 	/* align all readers with sk_user_data being NULL */
@@ -99,9 +101,9 @@ void ovpn_socket_release(struct ovpn_peer *peer)
 
 	/* following cleanup should happen with lock released */
 	if (released) {
-		if (sock->sock->sk->sk_protocol == IPPROTO_UDP) {
+		if (sk_protocol == IPPROTO_UDP) {
 			netdev_put(sock->ovpn->dev, &sock->dev_tracker);
-		} else if (sock->sock->sk->sk_protocol == IPPROTO_TCP) {
+		} else if (sk_protocol == IPPROTO_TCP) {
 			/* wait for TCP jobs to terminate */
 			ovpn_tcp_socket_wait_finish(sock);
 			ovpn_peer_put(sock->peer);
