KVM: s390: Fix potential spectre warnings
authorEric Farman <farman@linux.ibm.com>
Wed, 17 Apr 2019 00:54:14 +0000 (02:54 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 18 Apr 2019 08:13:51 +0000 (10:13 +0200)
Fix some warnings from smatch:

arch/s390/kvm/interrupt.c:2310 get_io_adapter() warn: potential spectre issue 'kvm->arch.adapters' [r] (local cap)
arch/s390/kvm/interrupt.c:2341 register_io_adapter() warn: potential spectre issue 'dev->kvm->arch.adapters' [w]

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Message-Id: <20190417005414.47801-1-farman@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/interrupt.c

index 82162867f378d225ede29ff32adee1983072a7ac..bfd55ad34a3e83c9a0f33018dace09e7485e5d65 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/kvm_host.h>
 #include <linux/hrtimer.h>
 #include <linux/mmu_context.h>
+#include <linux/nospec.h>
 #include <linux/signal.h>
 #include <linux/slab.h>
 #include <linux/bitmap.h>
@@ -2307,6 +2308,7 @@ static struct s390_io_adapter *get_io_adapter(struct kvm *kvm, unsigned int id)
 {
        if (id >= MAX_S390_IO_ADAPTERS)
                return NULL;
+       id = array_index_nospec(id, MAX_S390_IO_ADAPTERS);
        return kvm->arch.adapters[id];
 }
 
@@ -2320,8 +2322,13 @@ static int register_io_adapter(struct kvm_device *dev,
                           (void __user *)attr->addr, sizeof(adapter_info)))
                return -EFAULT;
 
-       if ((adapter_info.id >= MAX_S390_IO_ADAPTERS) ||
-           (dev->kvm->arch.adapters[adapter_info.id] != NULL))
+       if (adapter_info.id >= MAX_S390_IO_ADAPTERS)
+               return -EINVAL;
+
+       adapter_info.id = array_index_nospec(adapter_info.id,
+                                            MAX_S390_IO_ADAPTERS);
+
+       if (dev->kvm->arch.adapters[adapter_info.id] != NULL)
                return -EINVAL;
 
        adapter = kzalloc(sizeof(*adapter), GFP_KERNEL);