diff --git a/drivers/net/ovpn/io.c b/drivers/net/ovpn/io.c
index 3e9e7f8444b3..95c3518e067c 100644
--- a/drivers/net/ovpn/io.c
+++ b/drivers/net/ovpn/io.c
@@ -396,6 +396,17 @@ netdev_tx_t ovpn_net_xmit(struct sk_buff *skb, struct net_device *dev)
 
 		__skb_queue_tail(&skb_list, curr);
 	}
+
+	/* no segments survived: don't jump to 'drop' because we already
+	 * incremented the counter for each failure in the loop
+	 */
+	if (unlikely(skb_queue_empty(&skb_list)))
+		return NETDEV_TX_OK;
+
+	/* the original 'skb' might have been freed/cloned in the loop: use the
+	 * first element of our list for the other operations
+	 */
+	skb = skb_list.next;
 	skb_list.prev->next = NULL;
 
 	/* retrieve peer serving the destination IP of this packet */